目錄
創(chuàng)新互聯(lián)公司始終堅持【策劃先行,效果至上】的經(jīng)營理念,通過多達十余年累計超上千家客戶的網(wǎng)站建設(shè)總結(jié)了一套系統(tǒng)有效的網(wǎng)絡(luò)營銷推廣解決方案,現(xiàn)已廣泛運用于各行各業(yè)的客戶,其中包括:成都廣告設(shè)計等企業(yè),備受客戶稱揚。1.IDE創(chuàng)建一個maven項目
2、 添加redis啟動器
3.修改配置文件application.properties
4.在測試類中測試?
SpringBoot操作Hash(哈希)
SpringBoot操作List集合類型
SpringBoot操作Set集合類型
SpringBoot操作ZSet集合類型
pring Boot 提供了對 Redis 集成的組件包:spring-boot-starter-data-redis,它依賴于 spring-data-redis 和 lettuce 。
另外,這里還有兩個小細節(jié):
Spring Boot 1.x 時代,spring-data-redis 底層使用的是 Jedis;2.x 時代換成了 Lettuce 。
Lettuce依賴于 commons-pool2
org.springframework.boot spring-boot-starter-data-redisorg.apache.commons commons-pool2
Lettuce 的 timed out 問題
在 Spring Boot 2.x 默認使用 Lettuce 之后,會偶發(fā)性出現(xiàn)Redis command timed out
問題,從而導(dǎo)致客戶端(Java 代碼)無法連接到 Redis Server 的問題。
而且該問題無法正面解決。網(wǎng)上通用的解決方案是:放棄使用 Lettuce 驅(qū)動,轉(zhuǎn)而使用 Jedis 驅(qū)動。
這種情況下,你需要手動排除 spring-data-redis 對 Lettuce 的依賴,并引入 Jedis 依賴。
org.springframework.boot spring-boot-starter-data-redisio.lettuce lettuce-coreredis.clients jedis
如果springboot的版本是2.3.7 中這個問題不存在了 ?
3.修改配置文件application.properties## Redis 服務(wù)器地址
spring.redis.host=localhost
## Redis 服務(wù)器連接端口
spring.redis.port=6379
## Redis 數(shù)據(jù)庫索引(默認為 0)
spring.redis.database=0
## 以下非必須,有默認值
## Redis 服務(wù)器連接密碼(默認為空)
spring.redis.password=
## 連接池大連接數(shù)(使用負值表示沒有限制)默認 8
spring.redis.lettuce.pool.max-active=8
## 連接池大阻塞等待時間(使用負值表示沒有限制)默認 -1
spring.redis.lettuce.pool.max-wait=-1
## 連接池中的大空閑連接 默認 8
spring.redis.lettuce.pool.max-idle=8
## 連接池中的最小空閑連接 默認 0
spring.redis.lettuce.pool.min-idle=0
一般情況下我們用到的就是前三行
## Redis 服務(wù)器地址
spring.redis.host=localhost
## Redis 服務(wù)器連接端口
spring.redis.port=6379
## Redis 數(shù)據(jù)庫索引(默認為 0)
spring.redis.database=0
4.在測試類中測試?
SpringBoot操作Hash(哈希)一般我們存儲一個鍵,很自然的就會使用 get/set 去存儲,實際上這并不是很好的做法。Redis 存儲一個 key 會有一個最小內(nèi)存,不管你存的這個鍵多小,都不會低于這個內(nèi)存,因此合理的使用 Hash 可以幫我們節(jié)省很多內(nèi)存。
Hash Set 就在哈希表 Key 中的域(Field)的值設(shè)為 value。如果 Key 不存在,一個新的哈希表被創(chuàng)建并進行 HSET 操作;如果域(field)已經(jīng)存在于哈希表中,舊值將被覆蓋。
先來看 Redis 對 Pojo 的支持,新建一個 Student 對象(需要實現(xiàn) Serializable 接口),放到緩存中,再取出來。
@Test
void contextLoads() {
//測試hash
// ValueOperations valueOperations = redisTemplate.opsForValue();
//生成操作hash類型數(shù)據(jù)類
HashOperations hashOperations = redisTemplate.opsForHash();
//參數(shù)1:數(shù)據(jù)分組
//參數(shù)2:Field
//參數(shù)3:value
hashOperations.put("good", "name", "面包");
hashOperations.put("good", "price", "30");
hashOperations.put("good", "num", "10");
Object o = hashOperations.get("good", "name");
System.out.println(o);
}
如上述代碼所示,hash是使用set,get來添加和獲取,這里添加hash需要三個參數(shù)分別是,這個數(shù)據(jù)分組,然后是上述的域,之后是值,同時,獲取的時候我們則也是通過兩個參數(shù)來獲取,第一個參數(shù)是組,之后是域,?執(zhí)行測試
SpringBoot操作List集合類型Redis List 的應(yīng)用場景非常多,也是 Redis 最重要的數(shù)據(jù)結(jié)構(gòu)之一。 使用 List 可以輕松的實現(xiàn)一個隊列, List 典型的應(yīng)用場景就是消息隊列,可以利用 List 的 Push 操作,將任務(wù)存在 List 中,然后工作線程再用 POP 操作將任務(wù)取出進行執(zhí)行。
@Test
void testRedisList() {
//測試list
ListOperations listOperations = redisTemplate.opsForList();
//leftPush是從左往后排
//listOperations.leftPush("list", "hello");
//listOperations.leftPush("list", "world");
//listOperations.leftPush("list", "!!!");
//遍歷
//從第一元素到向后找兩個元素
//List list = listOperations.range("list", 0, 2);
//list.forEach(e ->System.out.println(e));
//拿最左邊的數(shù)據(jù),會刪除該數(shù)據(jù)
Object leftList = listOperations.leftPop("list");
System.out.println(leftList);
//拿最右邊數(shù)據(jù),會刪除該數(shù)據(jù)
Object rightList = listOperations.rightPop("list");
System.out.println(rightList);
}
list類型,我們這里放入可以通過leftpush和rightpush來進行放入數(shù)據(jù),leftpush是作為從左往后放,每次放都會放在左邊(即最前邊),同理,rightpush的時候是從右往后放,每次放都會放在右邊(即最后邊),
通過range來遍歷集合則是需要三個參數(shù),分別需要的是集合之后兩個參數(shù)是集合的下標的開始和要找的元素個數(shù),上述代碼就是從第一元素開始向后找兩個元素,如果使用leftpop,則會顯示集合中最左邊的元素,但是同時也會刪除該元素,即在redis中刪除,所以只能使用一次,下次使用的話即是下一個最左邊元素,rightpop同理?
Redis List 的實現(xiàn)為一個雙向鏈表,即可以支持反向查找和遍歷,更方便操作,不過帶來了部分額外的內(nèi)存開銷,Redis 內(nèi)部的很多實現(xiàn),包括發(fā)送緩沖隊列等也都是用的這個數(shù)據(jù)結(jié)構(gòu)。
SpringBoot操作Set集合類型Redis Set 對外提供的功能與 List 類似,是一個列表的功能,特殊之處在于 Set 是可以自動排重的,當你需要存儲一個列表數(shù)據(jù),又不希望出現(xiàn)重復(fù)數(shù)據(jù)時,Set 是一個很好的選擇,并且 Set 提供了判斷某個成員是否在一個 Set 集合內(nèi)的重要接口,這個也是 List 所不能提供的。
@Test
void testSet(){
SetOperations setOperations = redisTemplate.opsForSet();
setOperations.add("set","hello");
setOperations.add("set","hello");
setOperations.add("set","world");
setOperations.add("set","!!!");
setOperations.add("set","!!!");
Set set = setOperations.members("set");
set.forEach(e->System.out.println(e));
}
輸出結(jié)果?
set可以理解為無序排列,但是可以去重
SpringBoot操作ZSet集合類型Redis Sorted Set 的使用場景與 Set 類似,區(qū)別是 Set 不是自動有序的,而 Sorted Set 可以通過用戶額外提供一個優(yōu)先級(Score)的參數(shù)來為成員排序,并且是插入有序,即自動排序。
在使用 Zset 的時候需要額外的輸入一個參數(shù) Score,Zset 會自動根據(jù) Score 的值對集合進行排序,我們可以利用這個特性來做具有權(quán)重的隊列,比如普通消息的 Score 為 1,重要消息的 Score 為 2,然后工作線程可以選擇按 Score 的倒序來獲取工作任務(wù)。
@Test
void testZset(){
ZSetOperations zSetOperations = redisTemplate.opsForZSet();
// zSetOperations.add("news","hello",1);
// zSetOperations.add("news","world",4);
//zSetOperations.add("news","good",2);
//zSetOperations.add("news","bye",3);
//根據(jù)score 從小到大排序,0和3是集合的下標
Set samll = zSetOperations.range("news", 0, 3);
samll.forEach(e->System.out.println(e));
System.out.println("========================================");
//根據(jù)score 從大到小排序,0和3是集合的下標
Set big = zSetOperations.reverseRange("news", 0, 3);
big.forEach(e->System.out.println(e));
System.out.println("========================================");
//根據(jù)score的大小權(quán)重查詢
Set score = zSetOperations.rangeByScore("news", 3, 4);
score.forEach(e->System.out.println(e));
}
上述輸出結(jié)果是?
range在這里是按照設(shè)置參數(shù)時的大小,從小到大排序,后面參數(shù)為下標來代表啟始和結(jié)束reverseRange則是按照設(shè)置參數(shù)時的從小到大排序,后面參數(shù)為下標來代表啟始和結(jié)束rangeByScore則是根據(jù)當時設(shè)置的score的大小權(quán)重來進行查詢,后面參數(shù)是權(quán)重是3和4,排序也是按照這個權(quán)重大小
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機房具備T級流量清洗系統(tǒng)配攻擊溯源,準確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級服務(wù)器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧