




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、江-5271-61772培優(yōu)1 Redis 緩存介紹1.1緩存策略1.1.1 緩存機(jī)制緩存是介于應(yīng)用程序和物理數(shù)據(jù)源之間,其作用是為了降低應(yīng)用程序?qū)ξ锢頂?shù)據(jù)源的頻次,從而提高了應(yīng)用的運(yùn)行性能。緩存內(nèi)的數(shù)據(jù)是對物理數(shù)據(jù)源中的數(shù)據(jù)的,應(yīng)用程序在運(yùn)行緩存讀寫數(shù)據(jù),在特定的時(shí)刻或會(huì)同步緩存和物理數(shù)據(jù)源的數(shù)據(jù)。緩存的介質(zhì)一般是內(nèi)存,所以讀寫速度很快。但如果緩存中存放的數(shù)據(jù)量非常大時(shí),也會(huì)用硬盤作為緩存介質(zhì)。緩存的實(shí)現(xiàn)不僅僅要考慮和緩存數(shù)據(jù)的生命周期。的介質(zhì),還要考慮到管理緩存的并發(fā)1.1.2 緩存中存在的問題1. 緩存中的數(shù)據(jù)是真實(shí)數(shù)據(jù)庫數(shù)據(jù)的備份,如何保證數(shù)據(jù)一致性.2. 數(shù)據(jù)都在內(nèi)存中,如果斷電/宕
2、機(jī)/內(nèi)存數(shù)據(jù)如何恢復(fù).3. 如果緩存中的數(shù)據(jù)如果達(dá)到臨界值(512M),緩存大小如何維護(hù).4. 緩存中保存數(shù)據(jù)應(yīng)該采用什么樣的數(shù)據(jù)結(jié)構(gòu).1.2緩存三大問題1.2.1 緩存穿透條件:一個(gè)不存在的數(shù)據(jù)說明:當(dāng)一個(gè)不存在的數(shù)據(jù)時(shí),因?yàn)榫彺嬷袥]有這個(gè) key,導(dǎo)致緩存.最終數(shù)據(jù)庫.但是數(shù)據(jù)庫中沒有該數(shù)據(jù)所以返回 null.隱患:如果有人頻繁一個(gè)不存在的數(shù)據(jù),可能會(huì)導(dǎo)致數(shù)據(jù)庫負(fù)載高導(dǎo)致宕機(jī).總務(wù)系統(tǒng)一個(gè)不存在的數(shù)據(jù),稱之為緩存穿透.1江-5271-61772培優(yōu)1.2.2 緩存擊穿條件:當(dāng)緩存 key 失效/過期/未命中時(shí),高并發(fā)該 key說明:如果給一個(gè) key 設(shè)定了失效時(shí)間,當(dāng)key 失效時(shí)有一萬
3、的并發(fā)請求這個(gè) key,這時(shí)緩存失效,所有的請求都會(huì)數(shù)據(jù)庫.稱之為緩存擊穿.場景:熱點(diǎn)消息庫負(fù)載過高.量很大,如果該緩存失效則會(huì)直接數(shù)據(jù)庫,導(dǎo)致數(shù)據(jù)1.2.3 緩存雪崩前提:高并發(fā),緩存命中較低或者失效時(shí)說明:假設(shè)緩存都設(shè)定了失效時(shí)間,在同一時(shí)間內(nèi)緩存大量失效.如果這時(shí)用戶高并發(fā).緩存過低.導(dǎo)致全部的用戶都會(huì)真實(shí)的數(shù)據(jù)庫.場景:在高并發(fā)條件下.緩存動(dòng)態(tài)更新時(shí)1.3Redis 安裝1.3.1 Redis 介紹redis 是一個(gè) key-value系統(tǒng)。和 Memcached 類似,它支持的 value 類型相對,包括 string(字符串)、list(鏈表)、set(集合)、zset(sorte
4、d set -有序集合)和 hash(哈希類型)。這些數(shù)據(jù)類型都支持 push/pop、add/remove 及取交集并集和差集及更豐富的操作,而且這些操作都是原子性的。它可以用作數(shù)據(jù)庫、緩存和消息中間件.在此基礎(chǔ)上,redis 支持各種不同方式的排序。與 memcached 一樣,為了保證效率,數(shù)據(jù)都是緩存在內(nèi)存中。區(qū)別的是 redis 會(huì)周期性的把更新的數(shù)據(jù)寫入磁盤或者把修改操作寫入追加的且在此基礎(chǔ)上實(shí)現(xiàn)了 master-slave(主從)同步。文件,并Redis 是一個(gè)高性能的 key-value 數(shù)據(jù)庫。redis 的出現(xiàn),很大程度補(bǔ)償了 memcached這類 key/value的不
5、足,在部分場合可以對關(guān)系數(shù)據(jù)庫起到很好的補(bǔ)充作用。它提供了Java,C/C+,C#,PHP,JavaScript,Perl,Object-C,Python,Ruby,Erlang 等客戶端,使用很方便。1Redis 支持主從同步。數(shù)據(jù)可以從主服務(wù)器向任意數(shù)量的從服務(wù)器上同步,從服務(wù)器可以是關(guān)聯(lián)其他從服務(wù)器的主服務(wù)器。這使得 Redis 可執(zhí)行單層樹。存盤可以有意無意的對數(shù)據(jù)進(jìn)行寫操作。由于完全實(shí)現(xiàn)了發(fā)布/訂閱機(jī)制,使得從數(shù)據(jù)庫在任何地方同步,可訂閱一個(gè)頻道并接收主服務(wù)器完整的消息發(fā)布余很有幫助。同步對操作的可擴(kuò)展性和數(shù)據(jù)冗2江-5271-61772培優(yōu)Redis 的運(yùn)行速度:讀速度 11000
6、0/s,寫速度 81000 次每秒.平均 10 萬/s1.3.2Redis:如圖-1 所示圖- 1方式 2:選擇正確的版本號即可.課上演示為 3.2.8 版本Redis 安裝1.3.3上傳 redis 安裝包,到指定目錄下/usr/local/src 下如圖-2 所示圖- 2解壓 redis 命令: tar -xvf redis.3.2.8.tar.gz3wget江-5271-61772培優(yōu)1.3.4 校驗(yàn)編譯 Redis2.Make install 安裝LINK redis-server INSTALL redis-sentinel LINK redis-cliINSTALL redis-c
7、heck-rdb LINK redis-check-aof如圖-3 所示#redis 服務(wù)啟動(dòng)項(xiàng)#redis 哨兵的機(jī)制(實(shí)現(xiàn) redis 高可用) #連接 redis 客戶端程序#校驗(yàn) redis 持久化方式圖- 31.3.5 修改配置文件說明:作為第一個(gè)注釋 IP 綁定如圖-4 所示圖- 4關(guān)閉保護(hù)模式如圖-5 所示41. Make 編譯江-5271-61772培優(yōu)圖-5開啟啟動(dòng)如圖-6 所示圖-61.3.6 Redis 啟動(dòng)命令安裝前提:需要安裝 GCC1.3.7 啟動(dòng)效果圖如圖-7 所示5yum -y install gcc automake autoconf libtool make
8、 1.redis-server缺點(diǎn):不能執(zhí)行后續(xù)操作2. redis-server & 表示有后續(xù)操作.總結(jié):以上令 啟動(dòng)時(shí) redis 的設(shè)置都是默認(rèn)的 IP 綁定/保護(hù)模式默認(rèn)值處理3. redis-server redis.conf 按照配置文件方式啟動(dòng)4. kill -9 pid5. redis-cli shutdown 或者 redis-cli -p 6379 shutdown江-5271-61772培優(yōu)圖- 71.4Redis 命令1.4.1 String 類型6命令說明案例set添加 key-valueset username adminget根據(jù) key 獲取數(shù)據(jù)get
9、 usernamestrlen獲取 key 的長度strlen keyexistskey 是否存在exists name返回 1 存在0 不存在del刪除 redis 中的 keydel keyKeys用于符合條件的 keykeys *redis 中全部的 keykeys n?me 使用占位符獲取數(shù)據(jù)keys nam* 獲取 nam 開頭的數(shù)據(jù)mset賦值多個(gè) key-valuemset key1 value1 key2 value2 key3 value3mget獲取多個(gè) key 的值mget key1 key2append對某個(gè) key 的值進(jìn)行追加append key valuetype
10、檢查某個(gè) key 的類型type keyselect切換 redis 數(shù)據(jù)庫select 0-15 redis 中共有16 個(gè)數(shù)據(jù)庫flushdb清空單個(gè)數(shù)據(jù)庫flushdb江-5271-61772培優(yōu)1.4.2 Hash 類型說明:可以用散列類型保存對象和屬性值例子:User 對象id:2,name:小明,age:191.4.3 List 類型說明:Redis 中的 List 集合是雙端循環(huán)列表,分別可以從左右兩個(gè)方向數(shù)據(jù).7命令說明案例hset為對象添加數(shù)據(jù)hset key field valuehget獲取對象的屬性值hget key fieldhexists對象的屬性是否存在HEXIS
11、TS key field1 表示存在0 表示不存在hdel刪除 hash 中的屬性hdel user field field .hgl獲取 hash 全部元素和值HGL keyhkyes獲取 hash 中的所有字段HKEYS keyhlen獲取 hash 中所有屬性的數(shù)量hlen keyhmget獲取 hash 里面指定字段的值hmget key field field .hmset為 hash 的多個(gè)字段設(shè)定值hmset key field value field value .hsetnx設(shè)置 hash 的一個(gè)字段,只有當(dāng)這個(gè)字段不存在時(shí)有效HSETNX key field valuehs
12、trlen獲取 hash 中指定 key 的長度HSTRLEN key fieldhvals獲取 hash 的所有值HVALS userflushall清空全部數(shù)據(jù)庫flushallincr自動(dòng)加 1incr keydecr自動(dòng)減 1decr keyincrby指定數(shù)值添加incrby 10decrby指定數(shù)值減decrby 10expire指定 key 的生效時(shí)間秒expire key 20 key20 秒后失效pexpire指定 key 的失效時(shí)間毫秒pexpire key 2000key 2000 毫秒后失效ttl檢查 key 的剩余存活時(shí)間ttl keypersist撤銷 key 的失
13、效時(shí)間persist key江-5271-61772培優(yōu)List 集合可以當(dāng)做隊(duì)列使用,也可以當(dāng)做棧使用隊(duì)列:存入數(shù)據(jù)的方向和獲取數(shù)據(jù)的方向相反棧:存入數(shù)據(jù)的方向和獲取數(shù)據(jù)的方向相同1.4.4 Redis 事務(wù)命令說明:redis 中操作可以添加事務(wù)的支持.一項(xiàng)任務(wù)可以由多個(gè)redis 命令完成,如果有一個(gè)命令失敗導(dǎo)致入庫失敗時(shí).需要實(shí)現(xiàn)事務(wù).8命令說明案例multi標(biāo)記一個(gè)事務(wù)開始:6379> MULTI OK命令說明案例lpush從隊(duì)列的左邊入隊(duì)一個(gè)或多個(gè)元素LPUSH key value value .rpush從隊(duì)列的右邊入隊(duì)一個(gè)或多個(gè)元素RPUSHkeyval
14、ue value .lpop從隊(duì)列的左端出隊(duì)一個(gè)元素LPOP keyrpop從隊(duì)列的右端出隊(duì)一個(gè)元素RPOP keylpushx當(dāng)隊(duì)列存在隊(duì)列的左側(cè)入隊(duì)一個(gè)元素LPUSHX key valuerpushx當(dāng)隊(duì)列存在隊(duì)列的右側(cè)入隊(duì)一個(gè)元素RPUSHx key valuelrange從列表中獲取指定返回的元素LRANGE key start stop Lrange key 0 -1 獲取全列的數(shù)據(jù)lrem從存于 key 的列表里移除前count 次出現(xiàn)的值為 value 的元素。 這個(gè) count 參數(shù)通過下面幾種方式影響這個(gè)操作:count > 0: 從頭往尾移除值為 value 的元素。
15、count < 0: 從尾往頭移除值為 value 的元素。count = 0: 移除所有值為value 的元素。LREM list -2 “hello” 會(huì)從存于 list 的列表里移除最后兩個(gè)出現(xiàn)的 “hello”。需要注意的是,如果 list 里沒有存在 key 就會(huì)被當(dāng)作空 list 處理,所以當(dāng)key 不存在的時(shí)候,這個(gè)命令會(huì)返回 0。Lset設(shè)置 index 位置的 list 元素的值為valueLSET key index value江-5271-61772培優(yōu)2 Redis 高級應(yīng)用2.1Redis 入門案例2.1.1 添加 jar 包文件說明:在 JT-PARENT 項(xiàng)
16、目中添加 jar 包文件2.1.2 入門案例-String9/* 連接redis* 參數(shù)介紹:* redisIP 地址.* redis:6379*/ Testpublic void test01()Jedis jedis = new Jedis("66",6379); jedis.set("redis", "redis 入門案例"); System.out.println<!- jedis -><dependency><groupId>redis.clients</g
17、roupId><artifactId>jedis</artifactId><version>$jedis.version</version></dependency><!-添加 spring-datajar 包-><dependency><groupId>org.springframework.data</groupId><artifactId>spring-data-redis</artifactId><version>1.4.1.RELEAS
18、E</version></dependency>exec執(zhí)行所有 multi 之后發(fā)令:6379> EXECOKdiscard丟棄所有 multi 之后發(fā)令江-5271-61772培優(yōu)2.1.3 入門案例-hash結(jié)果展現(xiàn):2.1.4 入門案例-List結(jié)果展現(xiàn):2.2Spring 整合 Redis2.2.1 編輯 properties 配置文件 redis.host=6610獲取數(shù)據(jù) 5獲取參數(shù):e, d, c, b, aTestpublic void test02()Jedis jedis = new Jedis(&
19、quot;48", 6379);Long number = jedis.lpush("list", "a","b","c","d","e"); System.out.println("獲取數(shù)據(jù)"+number);List<String> list= jedis.lrange("list", 0, -1); System.out.println("獲取參數(shù):"+list)
20、;操作完成!1name=tomcat, age=18, id=1Testpublic void test01()Jedis jedis = new Jedis("48", 6379); jedis.hset("user", "id", "1");jedis.hset("user", "name", "tomcat");jedis.hset("user", "age", "18&qu
21、ot;);System.out.println("操作完成!"+jedis.hget("user", "id"); Map<String,String> map = jedis.hgl("user"); System.out.println(map);("獲取 redis 中的數(shù)據(jù):"+jedis.get("redis");/為數(shù)據(jù)設(shè)定超時(shí)時(shí)間秒jedis.setex("1804", 100, "1804 班");江-527
22、1-61772培優(yōu)2.2.2 Spring 添加配置文件2.2.3 Spring 整合 Redis(初級)2.2.4 Spring 整合 Redis(高級)<?xml version="1.0"<beans xmlns="encoding="UTF-8"?>"xmlns:xsi=""xmlns:context=""xmlns:mvc="xsi:schemaLocation="""><!-每次都創(chuàng)建 jedis 對象性能較低&l
23、t;bean id="poolConfig"創(chuàng)建 jedis 線程池->class="redis.clients.jedis.JedisPoolConfig"><!-定義連接總數(shù)-><property name="maxTotal" value="$redis.maxTotal"/>11<!-通過 bean管理 Jedis 對象-><bean id="jedis" class="redis.clients.jedis.Jedis&q
24、uot;><constructor-arg name="host" value="$redis.host"/><constructor-arg name="port" value="$redis.port"/></bean><bean class="org.springframework.beans.factory.config.PropertyPlaceholderConf igurer"><!-Resource locations;
25、 -><property name="locations"><list><value>classpath:/properties/perties</value><value>classpath:/properties/perties</value></list></property></bean>redis.port=6379 redis.maxTotal=1000 redis.maxIdle=100 redis.testOnB
26、orrow=true江-5271-61772培優(yōu)2.2.5 Spring 整合 Redis-工具類(高級適用)編輯工具類代碼 RedisService12package mon.service;import java.util.concurrent.TimeUnit; import org.apache.log4j.Logger;import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.RedisTemplate; import org.sp
27、ringframework.data.redis.core.StringRedisTemplate; import org.springframework.data.redis.core.ValueOperations; import org.springframework.stereotype.Component;import org.springframework.stereotype.Service;Servicepublic class RedisService Autowiredprivate StringRedisTemplate redisTemplate;<!-定義最大閑
28、置-><property name="maxIdle" value="$redis.maxIdle"/><!-定義是否自動(dòng)連接測試 測試當(dāng)前連接是否可用,如果有問題,則獲取新的連接-><property name="testOnBorrow" value="$redis.testOnBorrow"/></bean><!-定義 jedis 工廠模式-><bean id="jedisConnectionFactory" clas
29、s="org.springframework.data.redis.connection.jedis.JedisConnectionF actory" ><!-定義主機(jī)-><property name="hostName" value="$redis.host"/><!-定義端-><property name="port" value="$redis.port"/><!-引入配置文件-><property name=&quo
30、t;poolConfig" ref="poolConfig"/></bean><!-定義 redisTemplate 方便操作 redis -><bean id="stringRedisTemplate" class="org.springframework.data.redis.core.StringRedisTemplate"><property name="connectionFactory" ref="jedisConnectionFact
31、ory"/></bean></beans>江-5271-61772培優(yōu)2.3實(shí)現(xiàn)商品分類緩存處理2.3.1 需求分析說明:當(dāng)點(diǎn)擊商品分類列表時(shí),應(yīng)該使用 redis 緩存,parentId 充當(dāng) redis 中的 Key,獲取當(dāng)前節(jié)點(diǎn)的全部子節(jié)點(diǎn)信息充當(dāng) value(JSON 串)實(shí)現(xiàn)思路:1. 根據(jù) parentID 先redis 緩存13/獲取數(shù)據(jù)public String get(String key) ValueOperations<String, String> operations=redisTemplate.opsForValu
32、e();return operations.get(key);/數(shù)據(jù)public boolean set(String key,String value) ValueOperations<String, String> operations =redisTemplate.opsForValue();try operations.set(key, value); return true; catch (Exception e) e.printStackTrace(); return false;/緩存定義超時(shí)時(shí)間為秒public boolean set(String key,Stri
33、ng value,Long expireTime) try ValueOperations<String, String> operations = redisTemplate.opsForValue();operations.set(key, value, expireTime, TimeUnit.DAYS); return true; catch (Exception e) e.printStackTrace(); return false;江-5271-61772培優(yōu)2. 如果 redis 中有數(shù)據(jù),則 JSON 串轉(zhuǎn)化為 java 對象之后返回.3. 如果 redis 中沒
34、有數(shù)據(jù).則數(shù)據(jù)庫,需要將 javaList 集合轉(zhuǎn)化為 JSON 串.之后保存到 redis 中.之后返回用戶.2.3.2 編輯 Controller說明:redis 緩存服務(wù)2.3.3 編輯 Service14Overridepublic List<EasyUITree> findItemCatCache(Long parentId) List<EasyUITree> treeList = null;String key = "ITEM_CAT_"+parentId; String jsonData = jedis.get(key); try if
35、(StringUtils.isEmpty(jsonData)/緩存中沒有數(shù)據(jù),需要數(shù)據(jù)庫 treeList = findItemCatList(parentId); String json =objectMapper.writeValueAsString(treeList); jedis.set(key,json);System.out.println("第一次");return treeList;else/緩存中有數(shù)據(jù)id.,EasyUITree trees = objectMapper.readValue (jsonData,EasyUITree.class); tre
36、eList = Arrays.asList(trees); System.out.println("緩存"); catch (Exception e) e.printStackTrace();RequestMapping("/list") ResponseBodypublic List<EasyUITree> findItemCatList( RequestParam(defaultValue="0",value="id")Long parentId)/一級商品分類目錄/Long parentId =
37、0L; List<EasyUITree> treeList =itemCatService.findItemCatCache(parentId);return treeList;江-5271-61772培優(yōu)2.3.4 適用 Redis 效果展現(xiàn)1. 在沒有添加 redis 緩存條件下如圖-8 所示圖- 82. 在使用 redis 緩存條件下通過下圖可以發(fā)現(xiàn)使用 redis 時(shí)速度提升明顯.提升超過 10 倍.由此可見redis 的性能異??焖?如圖-9 所示圖- 92.4關(guān)于 ObjectMapper 使用方法2.4.1 引入 jar 包在經(jīng)常需要將對象轉(zhuǎn)化 JSON,將 JSON
38、 轉(zhuǎn)化為對象.所以必須使用工具類的方式進(jìn)行.ObjectMapper 是 jackson 中提供的工具類.15<!- Jackson Json 處理工具包 -><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.4.2</version></dependency>return treeList;江-5271-61772培優(yōu)2.4.2 將對象與 JSON 互轉(zhuǎn)2.4.3 將 Li
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025有關(guān)租賃合同范文
- 2025年道路貨物運(yùn)輸服務(wù)項(xiàng)目規(guī)劃申請報(bào)告
- 醫(yī)藥類工作報(bào)告
- 2025大華幼兒教師聘用合同書
- 2025至2030年中國塑料量杯行業(yè)投資前景及策略咨詢報(bào)告
- 2025至2030年中國可拆式表殼行業(yè)投資前景及策略咨詢報(bào)告
- 2025至2030年中國化工溶劑行業(yè)投資前景及策略咨詢報(bào)告
- 2025至2030年中國內(nèi)河湖泊漁網(wǎng)行業(yè)投資前景及策略咨詢報(bào)告
- 2025合同范本品牌代理合同書
- 2025至2030年中國休菌安農(nóng)藥行業(yè)投資前景及策略咨詢報(bào)告
- 工程綠化合同范例
- 高素質(zhì)農(nóng)民培訓(xùn)課程設(shè)計(jì)
- 2024年廣東省深圳市南山區(qū)學(xué)府中學(xué)中考英語四模試卷
- 鐵路基礎(chǔ)知識題庫單選題100道及答案解析
- 國開2024年秋《教育心理學(xué)》形成性考核1-4答案
- CDFI醫(yī)師、技師彩超上崗證-單項(xiàng)選擇題(試題)
- 病理檢驗(yàn)技術(shù)課程設(shè)計(jì)
- 招投標(biāo)管理招聘筆試題與參考答案
- 高考監(jiān)考員培訓(xùn)考試題庫(含參考答案)
- 村霸舉報(bào)信范文(篇一)
- 華為企業(yè)架構(gòu)設(shè)計(jì)方法及實(shí)例
評論
0/150
提交評論