介紹
Redis支持兩種集合分別是有序集合和無序集合
集合和列表之間的對比
集合類型 | 列表類型 | 有序集合類型 | |
---|---|---|---|
存儲內容 | 最多個字符串 | 最多個字符串 | 最多個字符串 |
有序性 | 否 | 是 | 是 |
唯一性 | 是 | 否 | 是 |
運用場景
集合常用的操作是向集合中加入或刪除元素;判斷元素是否存在;
在多個集合之間還可以進行交集、並集、差集運算。
命令
一、集合
1.增加/刪除元素
sadd key member [member …] :向集合添加元素,返回成功加入集合的個數
srem key member [member …] :刪除集合中的元素,返回成功刪除的個數
2.獲取集合中的所有元素
smembers key
3.判斷元素是否在集合中
sismember key member
存在返回1,不存在返回0
4.集合間運算
(1)差集
sdiff key [key…]
2.交集
sinter key [key…]
3.並集
sunion key [key …]
4.獲取集合中元素的個數
scard key
5.進行集合運算並將結果存儲
sdiffstore destination key [key …]
sinterstore destination key [key …]
sunionstore destination key [key …]
這個3個命令和之前的集合運算命令差不多,唯一的區別是不會返回運算結果,而是將結果放入destination鍵中。
這些命令常用於需要多步集合運算的場景,如先計算兩個集合的差集,再將結果和其他集合計算並集。
6.隨機獲取集合中的元素
srendmember key [count]
count 爲指定返回的元素個數
7.從集合中彈出一個元素
spop key 會從集合中隨機選擇一個元素彈出。
二、有序集合
redis的有序集合類型是在集合的基礎上爲每個元素都關聯了一個分數,從而實現有序
有序集合和列表在某些功能上是一致的
相似點:
(1)二者都是有序的
(2)二者都可以獲得某一範圍的元素
但是二者的應用場景有很大不同
(1)列表是通過鏈表實現的,獲取靠近兩邊的元素速度越快,當元素增多後,獲取中間的元素,速度會變慢,所以它更加適合實現“新鮮事”或“排行榜”的應用
(2)有序集合類型使用的是散列表和跳躍表(Skip list)實現的,所以即使讀取中間位置的數據,速度也是很快的。
(3)列表中不能簡單地改變元素的位置,有序集合可以(改變分數就行)
(4)有序集合要比列表更加耗費內存
1.增加元素
zadd key score member [score member …]
該命令向有序集合中加入元素和該元素的分數,如果集合中已經有了該元素,則用新的分數代替原有的分數。
比如我們用有序集合zset 存儲 “張三”,“李四”,“王五” 的工資。
假如此時發現李四的工資輸錯了,也可以修改
zadd zset 15000 李四
2.獲得元素的分數
zscore key member
3.獲得排名在某個範圍的元素列表
zrange key start stop [withscores]
該命令會按照元素的分數從小到大返回從索引start 到stop之間的元素(0 -1 表示返回所有的元素);
加上參數withscores 會將分數也一起返回
4.獲取指定分數範圍的元素
zrangebyscore key min max [withscores] [limit offset count]
該命令按照元素分數從小到大的順序返回分數在min和max之間的元素(包含min和max)
min和max 還可以用無窮大來表示 -inf 和 +inf 分別代表負無窮和正無窮
limit offset count 參數和數據庫的用法一樣,即在獲得元素的基礎上向後偏移offset個元素,並且只獲取前count個元素。
在有序集合zset中再添加點元素方便演示
獲取工資超過10003的人,如果希望分數範圍不包含斷點值可以加上“(”符號,如下表示不包含10003
獲取工資高於10000的從第2個人開始的3個人
zrevrangebyscore 正好相反,會按元素分數從大到小排列
5.獲取集合中元素的數量
zcard key
6.獲取指定分數範圍內的元素個數
zcount key min max
7.刪除一個或多個元素
zrem key member [member …]
8.按照排名範圍刪除元素
zremrangebyrank key start stop
按照元素分數從小到大的順序,刪除指定排名範圍內的所有元素。
9.按照分數範圍刪除元素
zremrangebyscore key min max
刪除指定分數範圍內的所有數據。
10.獲取元素的排名
zrank key member
從0開始,分數最小的元素排名爲0
zrevrank key member
分數最大的元素排名爲0