作者:畢濤濤,致力于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)兩次。

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)的,對集合我們可以取交集、并集、差集。
:向名稱為key的set中添加元素。
小結(jié):set 集合不允許重復(fù)元素 smembers查看set集合的元素。:刪除set集合元素。
:隨機(jī)返回刪除的key。
:返回兩個(gè)集合的不同元素(哪個(gè)集合在前面就以哪個(gè)集合為標(biāo)準(zhǔn))
:將返回的的不同元素存儲到另外一個(gè)集合里
小結(jié):這里是把set1 和 set2 的不同元素(以set1為準(zhǔn))存儲到set3集合里。:返回集合的交集
:返回交集結(jié)構(gòu),存入set3中。
:取并集
:取得并集,存入set3中。
:從一個(gè)set集合移動到另一個(gè)set集合里
小結(jié):將set1中的元素移動到set2中(相當(dāng)于剪切復(fù)制):查看集合里元素個(gè)數(shù)。
:判斷元素是否為集合中的元素
小結(jié):返回1代表是集合中的元素,0代表不是:隨機(jī)返回一個(gè)元素
:向有序集合中添加一個(gè)元素,該元素如果存在,則更新順序
小結(jié):在重復(fù)插入的時(shí)候,會根據(jù)順序?qū)傩愿隆?/li>:刪除名稱為key的zset中的元素member
:以指定值去自動遞增或者減少,用法和之前的incrby類似
:找到指定區(qū)間范圍的數(shù)據(jù)進(jìn)行返回。
:刪除1到1(只刪除索引1)
:刪除指定序號
:返回排序索引 從大到小排序(升序排序之后再找索引)
注意:一個(gè)是順序號 一個(gè)是索引zrank返回的索引:返回排序索引,從大到小排序(降序排序之后再找索引)
:返回集合里所有元素的個(gè)數(shù)。
:返回集合中score在給定區(qū)間中的數(shù)量。