目錄
Set
命令小結
內部編碼
使用場景
用戶畫像
其它
Zset有序集合
普通指令
zadd
zcard
zcount
zrange
zrevrange
?編輯?
?zrangebyscore
zpopmax/zpopmin
bzpopmax/bzpopmin
zrank/zrevrank
zscore
zrem
?zremrangebyrank
zremrangebyscore
Set
命令小結
命令 | 功能 | 時間復雜度 |
sadd key element [element...] | 向集合添加元素 | O(k), k是元素個數 |
srem key element [element...] | 刪除集合中的元素 | O(k), k是元素個數 |
scard key | 求集合中的元素數目 | O(1) |
sismember key element | 判斷一個元素是否在集合內 | O(1) |
srandmember key [count] | 在集合中隨機獲取count個元素 | O(count) |
spop key [count] | 在集合中隨機刪除count個元素 | O(count) |
smembers key | 獲取集合中的所有元素 | O(k), k是元素個數 |
sinter key [key...] sinterstore | 求多個集合的交集 | O(m * k) |
sunion key [key...] sunionstore | 求多個集合的并集 | O(k), k是多個集合元素個數的總和 |
sdiff key [key...] sdiffstore | 求多個集合的差集 | O(k), k是多個集合元素個數的總和 |
內部編碼
集合中的內部編碼有兩種:?
intset(整數集合): 當集合中的元素都是整數并且元素的個數小于set-max-intset-entires配置時, Redis會選用intset來作為集合的內部實現, 從而減少內存的使用.?
hashtable(哈希表): 當集合類型無法滿足intset的條件時, Redis會使用hashtable作為集合的內部實現.?
?
使用場景
用戶畫像
集合類型比較典型的使用場景就是用戶畫像, 例如在抖音中, 用戶A對美女跳舞, 唱跳rap籃球感興趣, 用戶B對歷史, 二次元游戲感興趣, 那么這些特征就會被記錄為用戶畫像, 這些數據對提升用戶體驗和用戶黏度就非常有幫助.
其它
在社交軟件中查找共同好友. 以及互聯網產品中衡量用戶量, 用戶規模非常有幫助(主要是按照瀏覽量等指標來確定, 如果同一個用戶多次訪問, 就會去重訪問信息, 這樣有助于準確地提供用戶規模等信息).?
Zset有序集合
簡而言之, 它還是一種集合, 但是與集合不同, 它在里面引入了一個浮點類型 -- 分數(score)這個概念, 我們可以通過這個分數作為排序依據, 使其有序(之前如list中是使用下標的概念).??
比如我們按照傷害對如下植物進行排序:
有序集合提供了指定分數和元素的范圍查找, 計算成員排名等功能, 合理利用有序集合, 能解決很多問題.
普通指令
zadd
功能: 添加或者更新指定的元素以及關聯的分數到zset中, 分數應該符合double類型.?
語法:?
zadd key [nx | xx] [gt | lt] [ch] [incr] score member [score member...] (注: 分數可重復)
相關選項介紹:?
xx|nx: xx僅僅用于更新存在的元素, 不添加新元素; nx可以更新未存在的元素(不寫默認為nx)
gt | lt : 如果要更新分數, 發現比現在給定的分數大(小), 此時就更新成功, 否則不更新.
ch: 默認情況下, zadd返回的是本次添加的元素個數, 但指定這個選項之后, 就會還包含本次更新的元素個數.
incr: 此時命令類似zincrby 的效果, 將元素分數加上指定的分數, 此時只能指定一個元素/分數.?
時間復雜度: O(logN): 因為要找到插入元素的位置, 就會使用類似二分查找這種方式尋找.
返回值:? 本次添加的元素個數.
?
其余參數可以自行測試.
zcard
功能: 獲取zset中的元素數目.?
語法:
zcard key
返回值: zset中的元素個數.?
zcount
功能: 返回分數在min和max之間的元素個數, 默認情況下, min和max都是包含的, 可以通過 ( 排除.即一般情況下為閉區間, 使用(的那個數字的那個部分是開區間.
語法:
zcount key min max
時間復雜度: O(logN), 因為實際上在Zset內能夠得知元素的位次, 因此我們只需要定位到min和max的位次, 然后相減即可.?
返回值: 滿足條件的元素列表個數?
?
zrange
功能: 返回指定區間里的元素, 分數按照升序排序. 帶上withscores可以把分數也返回.
語法:
?zrange key start stop [withscores]
此處的[start, stop]為下標構成的區間,? 從0開始, 支持負數.
時間復雜度: O(logN + M), 先找到start/ stop, 然后M是指start與stop之間的元素數目.
返回值: 區間里的元素列表.
zrevrange
功能: 返回指定區間里的元素, 分數按降序排序, 帶上withscores也可以將分數返回.
語法:
zrevrange key start stop [withscores]
時間復雜度: O(logN + M)
返回值: 區間元素列表.
?
?zrangebyscore
返回分數在min, max之間的元素, 默認情況下, min和max都是包含的, 可以通過 ( 排除.
語法:
zrangebyscore key min max
時間復雜度: O(logN + M)
返回值: 區間的元素列表?
zpopmax/zpopmin
刪除并返回分數最高/低的count個元素.?
語法:
zpopmax/zpopmin?key [count]
時間復雜度: O(logN * M) N是有序集合數目, M是要刪除數目, 雖然我們記錄了次序, 但我們是通過M次普通刪除(每次刪一個), 因此時間復雜度是這個.
返回值: 分數和元素列表.
bzpopmax/bzpopmin
功能: zpopmax/zpopmin阻塞版本.
語法:
bzpopmax/bzpopmin?key [key...] timeout?
時間復雜度: O(N)
zrank/zrevrank
功能: 返回指定元素的排名, 升序/降序.?
語法:
zrank/zrevrank?key member
時間復雜度: O(logN)
返回值, 排名.?
?
zscore
?功能: 返回指定元素的分數.
語法:
zscore key member
時間復雜度: O(1)?
返回值: 分數
zrem
功能: 刪除指定元素.
語法:
zrem key member [member...]?
時間復雜度: O(M * logN)
返回值: 本次操作刪除的元素個數.
?zremrangebyrank
功能: 按照排序, 升序刪除指定范圍的元素, 左閉右閉.
語法:
zremrangebyrank key start stop
時間復雜度: O(logN + M)
返回值: 本次操作的元素個數.
zremrangebyscore
功能: 按照分數刪除指定范圍的元素, 左閉右閉.
語法
zremrangebyscore key min max
時間復雜度: O(logN + M)
返回值: 本次操作刪除的元素數目.?