Spring&redis整合RedisTemplate操作{String、List、Set、Zset、Hash}五種數(shù)據(jù)類型常用方法

Redis支持5種數(shù)據(jù)類型:
string 字符串
hash 哈希
list 列表
set 集合
zset 有序集合

一、 string
是 redis 最基本的類型,你可以理解成與 Memcached 一模一樣的類型,一個 key 對應(yīng)一個 value。value其實不僅是String,也可以是數(shù)字。

使用場景:常規(guī)key-value緩存應(yīng)用。常規(guī)計數(shù): 微博數(shù), 粉絲數(shù)。

二、Hash
是一個鍵值(key => value)對集合。Redis hash 是一個 string 類型的 field 和 value 的映射表,hash 特別適合用于存儲對象。

應(yīng)用場景:我們簡單舉個實例來描述下Hash的應(yīng)用場景,比如我們要存儲一個用戶信息對象數(shù)據(jù),包含以下信息:

用戶ID為查找的key,存儲的value用戶對象包含姓名,年齡,生日等信息,如果用普通的key/value結(jié)構(gòu)來存儲,主要有以下2種存儲方式:

第一種方式將用戶ID作為查找key,把其他信息封裝成一個對象以序列化的方式存儲,這種方式的缺點是,增加了序列化/反序列化的開銷,并且在需要修改其中一項信息時,需要把整個對象取回,并且修改操作需要對并發(fā)進行保護,引入CAS等復(fù)雜問題。

第二種方法是這個用戶信息對象有多少成員就存成多少個key-value對兒,用用戶ID+對應(yīng)屬性的名稱作為唯一標(biāo)識來取得對應(yīng)屬性的值,雖然省去了序列化開銷和并發(fā)問題,但是用戶ID為重復(fù)存儲,如果存在大量這樣的數(shù)據(jù),內(nèi)存浪費還是非??捎^的。

三、list 有序的可以重復(fù)集合;
列表是簡單的字符串列表,按照插入順序排序。
應(yīng)用場景:Redis list的應(yīng)用場景非常多,也是Redis最重要的數(shù)據(jù)結(jié)構(gòu)之一,比如twitter的關(guān)注列表,粉絲列表等都可以用Redis的list結(jié)構(gòu)來實現(xiàn)。

四、set 無序 不可以重復(fù)集合,適合買東西限定一人一單的場景。
是string類型的無序集合。集合是通過hashtable實現(xiàn)的,概念和數(shù)學(xué)中個的集合基本類似,可以交集,并集,差集等等,set中的元素是沒有順序的。所以添加,刪除,查找的復(fù)雜度都是O(1)。

應(yīng)用場景:Redis set對外提供的功能與list類似是一個列表的功能,特殊之處在于set是可以自動排重的,當(dāng)你需要存儲一個列表數(shù)據(jù),又不希望出現(xiàn)重復(fù)數(shù)據(jù)時,set是一個很好的選擇,并且set提供了判斷某個成員是否在一個set集合內(nèi)的重要接口,這個也是list所不能提供的。

五、zset 適合積分排序的場景, 用score 控制;
和 set 一樣也是string類型元素的集合,且不允許重復(fù)的成員。 zadd 命令:添加元素到集合,元素在集合中存在則更新對應(yīng)score。 常用命令:zadd,zrange,zrem,zcard等

使用場景:Redis sorted set的使用場景與set類似,區(qū)別是set不是自動有序的,而sorted set可以通過用戶額外提供一個優(yōu)先級(score)的參數(shù)來為成員排序,并且是插入有序的,即自動排序。
————————————————
版權(quán)聲明:本文為CSDN博主「kun_ser」的原創(chuàng)文章,遵循CC 4.0 BY-SA版權(quán)協(xié)議,轉(zhuǎn)載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/kun_ers/article/details/125464188

String類型

1.設(shè)置當(dāng)前的key以及value

redisTemplate.opsForValue().set(key, value);


 2.增減指定key的vaue值(正值則自增,負值則自減)

方式一:可同時修改value值

redisTemplate.opsForValue().increment(key, increment);

方式二:只對key存活時間操作

redisTemplate.expire(key,timeout,timeUnit);


 3.設(shè)置當(dāng)前的key以及value值并且設(shè)置過期時間

redisTemplate.opsForValue().set(key, value, timeout, timeunit)
/*
timeunit使用
TimeUnit.DAYS //天
TimeUnit.HOURS //小時
TimeUnit.MINUTES //分鐘
TimeUnit.SECONDS //秒
TimeUnit.MILLISECONDS //毫秒
*/


 4.判斷指定key是否存在(存在返回true,相反返回false)

Boolean key= redisTemplate.hasKey(key);


5.判斷添加key及value,如果key存則返回false無效操作,否則返回true進行添加 

redisTemplate.opsForValue().setIfAbsent(key, value);


6. 將指定key賦新的value并返回其該key原先的value

redisTemplate.opsForValue().getAndSet(key, value);


7.追加指定key的value字符串值

redisTemplate.opsForValue().append(key, value);


8.獲取指定字符串的長度

redisTemplate.opsForValue().size(key);


 9.1將map集合添加到redis中

解釋:map的key-value對應(yīng)redis中key-value(支持批添)
redisTemplate.opsForValue().multiSet(map);

9.2對應(yīng)的map集合名稱不存在,則添加否則不做修改

redisTemplate.opsForValue().multiSetIfAbsent(valueMap); 
key存在返回false(無效操作) 效果圖


key不存在,返回true,執(zhí)行成功效果圖


10.返回指定key所存儲的值的類型

DataType keyType= redisTemplate.type(key);


11.修改指定key的名稱

redisTemplate.rename(oldKey,newKey);


12. 判斷key是否存在,存在則修改key名,不存在則報錯

 redisTemplate.renameIfAbsent(oldKey,newKey);


13. 刪除指定key

redisTemplate.delete(key);


14.返回指定key所對應(yīng)的剩余過期時間

方式一:以秒為單位返回剩余生存時間

Long name = redisTemplate.getExpire(key);


方式二:指定返回時間單位(秒/分鐘/小時/天) 

Long name = redisTemplate.getExpire(key,timeunit);
/*
TimeUnit.DAYS //天
TimeUnit.HOURS //小時
TimeUnit.MINUTES //分鐘
TimeUnit.SECONDS //秒
TimeUnit.MILLISECONDS //毫秒
*/


15:設(shè)置指定key永久保護,移除存活時間 

redisTemplate.persist(key);


16.將指定的key從當(dāng)前(移除)數(shù)據(jù)庫移動到指定redis中數(shù)據(jù)庫當(dāng)中

redisTemplate.move(key, dbIndex)

List類型

1.1向指定list的隊列頭部添加value

redisTemplate.opsForList().leftPush(key, value)


 1.2向指定list的隊列頭部批量添加value

redisTemplate.opsForList().leftPushAll(key, value1 [value,...])


2.向指定list的隊列尾部添加value

redisTemplate.opsForList().rightPush(key,value);


 2.2向指定list的隊列尾部批量添加value 

redisTemplate.opsForList().rightPushAll(key, value1 [value,...])


3.通過索引獲取指定key的value

Object value= redisTemplate.opsForList().index(key,index);


4.獲取指定key指定范圍內(nèi)的value(start開始位置, 0是開始位置,end 結(jié)束位置, -1返回所有)

List list = redisTemplate.opsForList().range(key, startindex, endindex);


 返回所有



5.判斷List是否存在,存在則向指定key的(頭部/尾部)添加單個value(不存在則無效操作)

redisTemplate.opsForList().leftPushIfPresent(key,value)
redisTemplate.opsForList().rightPushIfPresent(key,value)


6.設(shè)置指定索引處指定key的value(覆蓋舊值)

redisTemplate.opsForList().set(key, index, value)


 7.移除并獲取指定list中(隊列-頭部/尾部)第一個元素

如果列表沒有元素會阻塞列表直到等待超時或發(fā)現(xiàn)可彈出元素為止
Object list = redisTemplate.opsForList().leftPop(key);
Object list2 = redisTemplate.opsForList().rightPop(key);


8. 將一個隊列的右邊彈出一個元素并將這個元素放入另一個指定隊列的最左邊

redisTemplate.opsForList().rightPopAndLeftPush(sourceKey, destinationKey)


9.刪除指定key集合中值等于value的元素

index=0, 刪除所有值等于value的元素
index>0, 從頭部開始刪除第一個值等于value的元素
index<0, 從尾部開始刪除第一個值等于value的元素
redisTemplate.opsForList().remove(key, index, value)
10.剪裁指定key(list列表)

redisTemplate.opsForList().trim(key, start, end)


11.獲取指定key(List列表)長度

redisTemplate.opsForList().size(key)

Set類型

1.向指定key(set)中添加元素(支持批添)

redisTemplate.opsForSet().add(key, value [value,...])


2.移除指定key(set)的元素(單個、多個)

redisTemplate.opsForSet().remove(key, value [value,...])


3.獲取指定key(集合)的元素個數(shù)

redisTemplate.opsForSet().size(key)


4.判斷指定set集合是否包含value(包含返回true,不包含返回false)

redisTemplate.opsForSet().isMember(key, value)


5.獲取兩個集合的交集(key對應(yīng)的無序集合與otherKey對應(yīng)的無序集合共同擁有的元素)

redisTemplate.opsForSet().intersect(key, otherKey)


6.將key集合與otherKey集合的交集存儲到destKey集合中(其中otherKey可以為單個值或者集合)

redisTemplate.opsForSet().intersectAndStore(key, otherKey, destKey)


7.獲取兩個或者多個集合的并集(otherKeys可以為單個值或者是集合)

redisTemplate.opsForSet().union(key, otherKeys)


8.key集合與otherKey集合的并集存儲到destKey中(otherKeys可以為單個值或者是集合)

redisTemplate.opsForSet().unionAndStore(key, otherKey, destKey)


9.獲取兩個或者多個集合的差集(otherKeys可以為單個值或者是集合)

redisTemplate.opsForSet().difference(key, otherKeys)
獲取key中otherKeys沒有的元素 


10.將key和otherKets差集存儲到destKey中(otherKeys可以為單個值或者集合)

redisTemplate.opsForSet().differenceAndStore(key, otherKey, destKey)


11.獲取指定(key)集合中的所有元素

redisTemplate.opsForSet().members(key)


12.隨機獲取集合中任意(count)個元素

redisTemplate.opsForSet().randomMembers(key, count)


13.隨機獲取集合中的一個元素

redisTemplate.opsForSet().randomMember(key)

ZSet類型

ZSetOperations提供了一系列方法對有序集合進行操作
1.1添加元素(有序集合是按照元素的score值由小到大進行排列)

redisTemplate.opsForZSet().add(key, value, score)


2.刪除指定key對應(yīng)的value(value可以為多個值)

redisTemplate.opsForZSet().remove(key, value ,[value ...])


3.增加指定key(zset)元素value的score值,并返回增加后的值

redisTemplate.opsForZSet().incrementScore(key, value, delta)


4.返回指定key(zset)元素在集合的排名

有序集合是按照元素的score值由小到大排列(返回下標(biāo))
redisTemplate.opsForZSet().rank(key, value)


5.返回指定key(zset)元素在集合的排名

按元素的score值由大到小排列(返回下標(biāo))
redisTemplate.opsForZSet().reverseRank(key, value)


6.獲取指定集合中給定區(qū)間(下標(biāo))的元素 

(start 開始位置,end 結(jié)束位置, -1查詢所有)
(僅顯示value,不顯示score,下一個顯示score)
score由小到大顯示

redisTemplate.opsForZSet().range(key, start,end)


 score由大到小顯示

redisTemplate.opsForZSet().reverseRange(key, start,end)


7.獲取指定集合按照Score值范圍查詢集合中的元素+score

查詢min~max之間的score元素
score從小到大排序

Set<ZSetOperations.TypedTuple<Object>> zset = redisTemplate.opsForZSet().rangeByScoreWithScores(key, min, max);


score結(jié)果從大到小排序

Set<ZSetOperations.TypedTuple<Object>> zset = redisTemplate.opsForZSet().reverseRangeByScore(key, min, max)


8.獲取指定集合按score從高到底指定score與下標(biāo)范圍內(nèi)的元素

score范圍內(nèi) min~max
strat~end下標(biāo)范圍內(nèi)
按score從高到底獲取
redisTemplate.opsForZSet().reverseRangeByScore(key, min, max, start, end)


9.獲取指定集合的score范圍內(nèi)的元素數(shù)量

 Long count= redisTemplate.opsForZSet().count(key, min, max)


10.獲取指定集合的大小(元素個數(shù))

Long count= redisTemplate.opsForZSet().size(key)


11.獲取集合中key、value元素對應(yīng)的score值

redisTemplate.opsForZSet().score(key, value)


12.刪除指定索引區(qū)間范圍內(nèi)的所有元素

start 開始位置,end 結(jié)束位置, -1查詢所有
redisTemplate.opsForZSet().removeRange(key, start, end)


13.移除指定score范圍的集合成員

redisTemplate.opsForZSet().removeRangeByScore(key, min, max)


14.獲取key和otherKey的并集并存儲在destKey中

otherKeys可以為單個字符串或者字符串集合
redisTemplate.opsForZSet().unionAndStore(key, otherKey, destKey)


15.獲取key和otherKey的交集并存儲在destKey中

其中otherKeys可以為單個字符串或者字符串集合
redisTemplate.opsForZSet().intersectAndStore(key, otherKey, destKey)


16.遍歷指定集合(和iterator一模一樣)

獲取value和score
Cursor<ZSetOperations.TypedTuple<Object>> scan = opsForZSet.scan(key, ScanOptions.NONE);
while (scan.hasNext()){
    ZSetOperations.TypedTuple<Object> next= scan.next();
    System.out.println(next.getValue() + ":" + next.getScore());
}

Hash類型

1.新增hashMap值

方式一:單個添加key-value

redisTemplate.opsForHash().put(key, hashKey, value)


 方式二:批量添加key-value

redisTemplate.opsForHash().putAll(key, maps);


方式三:僅當(dāng)hashKey不存在時才設(shè)置 

redisTemplate.opsForHash().putIfAbsent(key, hashKey, value)


2.獲取變量中的鍵值對

redisTemplate.opsForHash().entries(key)


3.獲取變量中的指定map鍵是否有值,如果存在該map鍵則獲取值,沒有則返回null。

redisTemplate.opsForHash().get(key, field)


4.使指定hash中的鍵以long值的大小進行自增長。

redisTemplate.opsForHash().increment(H key, HK hashKey, long delta)


5.刪除指定hash中一個或者多個鍵

redisTemplate.opsForHash().delete(key, fields)


6.判斷指定hash中是否有指定的map鍵

redisTemplate.opsForHash().hasKey(key, field);


7.給指定哈希表key中的指定鍵的整數(shù)/小數(shù)值加上增量increment

redisTemplate.opsForHash().increment(key, field, increment);


8.獲指定hash中所有鍵

redisTemplate.opsForHash().keys(key)


9.獲取hash表中存在的所有的值

redisTemplate.opsForHash().values(key);


10.獲取指定hash表中鍵的數(shù)量

redisTemplate.opsForHash().size(key)


11.Scan匹配獲取鍵值對

方式一:ScanOptions.NONE為獲取全部鍵對

Cursor<Map.Entry<Object,Object>> cursor = redisTemplate.opsForHash().scan("Goods",ScanOptions.NONE);
        while (cursor.hasNext()){
            Map.Entry<Object,Object> next = cursor.next();
            System.out.println(next.getKey() + ":" + next.getValue());
        }
方式二:ScanOptions.scanOptions().match("price").build() 匹配獲取鍵位map1的鍵值對,不能模糊匹配

Cursor<Map.Entry<Object,Object>> cursor = redisTemplate.opsForHash().scan("Goods",ScanOptions.scanOptions().match("price").build());
        while (cursor.hasNext()){
            Map.Entry<Object,Object> next = cursor.next();
            System.out.println(next.getKey() + ":" + next.getValue());
        }
 

————————————————
版權(quán)聲明:本文為CSDN博主「北九二七」的原創(chuàng)文章,遵循CC 4.0 BY-SA版權(quán)協(xié)議,轉(zhuǎn)載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/m0_62866192/article/details/121438008

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容