Redis(六) 數(shù)據(jù)類型set

作者:畢濤濤,致力于Java學(xué)習(xí)的踐行者。原創(chuàng)文章,轉(zhuǎn)載請注明出處。

set(集合)

Redis的集合相當(dāng)于Java語言里面的HashSet,它內(nèi)部的鍵值對是無序的唯一的。它的內(nèi)部實(shí)現(xiàn)相當(dāng)于一個(gè)特殊的字典,字典中所有的value都是一個(gè)值NULL。
當(dāng)集合中最后一個(gè)元素移除后,數(shù)據(jù)結(jié)構(gòu)自動刪除,內(nèi)存被回收。set結(jié)構(gòu)可以用來存儲活動中獎(jiǎng)的用戶ID,因?yàn)橛腥ブ毓δ?,可以保證同一個(gè)用戶不會中獎(jiǎng)兩次。

set.png

zset(有序列表)

zset 可能是Redis提供的最為特色的數(shù)據(jù)結(jié)構(gòu),它也是在面試中面試官最愛問的數(shù)據(jù)結(jié)構(gòu)。它類似于Java的SortedSet 和 HashMap 的結(jié)合體,一方面它是一個(gè)set,保證了內(nèi)部value的唯一性,另一方面它可以給每個(gè)value賦予一個(gè)score,代表這個(gè)value的排序權(quán)重。它的內(nèi)部實(shí)現(xiàn)用的是一種叫著[跳躍列表]的數(shù)據(jù)結(jié)構(gòu)。
zset中最后一個(gè)value被移除后,數(shù)據(jù)結(jié)構(gòu)自動刪除,內(nèi)存被回收。zset可以用來存粉絲列表,value值是粉絲的用戶ID,score是關(guān)注時(shí)間。我們可以對粉絲列表按關(guān)注時(shí)間進(jìn)行排序。
zset 還可以用來存儲學(xué)生的成績,value值是學(xué)生的ID,score是他的考試成績。我們可以對成績按分?jǐn)?shù)進(jìn)行排序就可以得到他的名次。

以下代碼摘自網(wǎng)絡(luò):

> zadd books 9.0 "think in java"
> zadd books 8.9 "java concurrency"
> zadd books 8.6 "java cookbook"

> zrange books 0 -1     # 按 score 排序列出,參數(shù)區(qū)間為排名范圍
1) "java cookbook"
2) "java concurrency"
3) "think in java"

> zrevrange books 0 -1  # 按 score 逆序列出,參數(shù)區(qū)間為排名范圍
1) "think in java"
2) "java concurrency"
3) "java cookbook"

> zcard books           # 相當(dāng)于 count()
(integer) 3

> zscore books "java concurrency"   # 獲取指定 value 的 score
"8.9000000000000004"                # 內(nèi)部 score 使用 double 類型進(jìn)行存儲,所以存在小數(shù)點(diǎn)精度問題

> zrank books "java concurrency"    # 排名
(integer) 1

> zrangebyscore books 0 8.91        # 根據(jù)分值區(qū)間遍歷 zset
1) "java cookbook"
2) "java concurrency"

> zrangebyscore books -inf 8.91 withscores  # 根據(jù)分值區(qū)間 (-∞, 8.91] 遍歷 zset,同時(shí)返回分值。inf 代表 infinite,無窮大的意思。
1) "java cookbook"
2) "8.5999999999999996"
3) "java concurrency"
4) "8.9000000000000004"

> zrem books "java concurrency"             # 刪除 value
(integer) 1
> zrange books 0 -1
1) "java cookbook"
2) "think in java"

常用命令

set集合是string類型的無序集合,set是通過hashtable實(shí)現(xiàn)的,對集合我們可以取交集、并集、差集。

  • \color{red}{sadd方法}:向名稱為key的set中添加元素。
    小結(jié):set 集合不允許重復(fù)元素 smembers查看set集合的元素。
  • \color{red}{srem方法}:刪除set集合元素。
  • \color{red}{spop方法}:隨機(jī)返回刪除的key。
  • \color{red}{sdiff方法}:返回兩個(gè)集合的不同元素(哪個(gè)集合在前面就以哪個(gè)集合為標(biāo)準(zhǔn))
  • \color{red}{sdiffstore方法}:將返回的的不同元素存儲到另外一個(gè)集合里
    小結(jié):這里是把set1 和 set2 的不同元素(以set1為準(zhǔn))存儲到set3集合里。
  • \color{red}{sinter方法}:返回集合的交集
  • \color{red}{sinterstore方法}:返回交集結(jié)構(gòu),存入set3中。
  • \color{red}{sunion方法}:取并集
  • \color{red}{sunionstore方法}:取得并集,存入set3中。
  • \color{red}{smove方法}:從一個(gè)set集合移動到另一個(gè)set集合里
    小結(jié):將set1中的元素移動到set2中(相當(dāng)于剪切復(fù)制)
  • \color{red}{scard方法}:查看集合里元素個(gè)數(shù)。
  • \color{red}{sismember方法}:判斷元素是否為集合中的元素
    小結(jié):返回1代表是集合中的元素,0代表不是
  • \color{red}{srandmember方法}:隨機(jī)返回一個(gè)元素
  • \color{red}{zadd方法}:向有序集合中添加一個(gè)元素,該元素如果存在,則更新順序
    小結(jié):在重復(fù)插入的時(shí)候,會根據(jù)順序?qū)傩愿隆?/li>
  • \color{red}{zrem方法}:刪除名稱為key的zset中的元素member
  • \color{red}{zincrby方法}:以指定值去自動遞增或者減少,用法和之前的incrby類似
  • \color{red}{zrangebyscore方法}:找到指定區(qū)間范圍的數(shù)據(jù)進(jìn)行返回。
  • \color{red}{zremrangebyrank方法}:刪除1到1(只刪除索引1)
  • \color{red}{zremrangebyscore方法}:刪除指定序號
  • \color{red}{zrank方法}:返回排序索引 從大到小排序(升序排序之后再找索引)
    注意:一個(gè)是順序號 一個(gè)是索引zrank返回的索引
  • \color{red}{zrevrank方法}:返回排序索引,從大到小排序(降序排序之后再找索引)
  • \color{red}{zcard方法}:返回集合里所有元素的個(gè)數(shù)。
  • \color{red}{zcount方法}:返回集合中score在給定區(qū)間中的數(shù)量。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

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