Redis資料型別 有序集合與基數統計

2021-10-22 19:28:40 字數 2012 閱讀 1270

目錄

有序集合

zadd和zrem

基數統計

hyperloglog

前面說的無序集合型別,特點是裡面存放的物件都是唯一的,無需的,使用無序集合的場景通常是集合的交並差運算,或者檢查某個物件是否在集合中。除了無序集合外,集合set還有有序集合型別,集合的物件唯一特點可以用來做計數,但是還有更節省記憶體消耗的資料結構可以使用,這篇日誌就來總結有序集合,基數統計和geo這三種資料型別。

首先是有序集合,顧名思義集合中存放的物件都是有序排列的,那麼按照什麼樣的方式排列呢?在有序集合裡面每乙個物件都有乙個「權重」,或者說是分數,我們可以用命令對這些物件的權重進行加法和減法,然後用不同命令將它們公升序或降序輸出:

建立/新增乙個有序集合使用的命令的zadd,如上圖所示,建立musiclist為裡面新增歌曲資料,並為每乙個元素設定乙個權值,完成後我們就可以用zrevrange命令降序輸出集合中的元素或zrange命令公升序輸出,這兩條命令中引數0,-1表示的是輸出範圍,0到-1即輸出全部元素,這個前面的日誌裡講過,withscores引數是可選引數,表示輸出時帶上元素的權值。有新增就有刪除,對有序集合的刪除命令有三種,直接刪除某一物件、按排名範圍刪除和按權值範圍刪除:

第一種刪除命令是zrem,後面直接指定需要刪除的集合key中的物件,第二種刪除命令是zremrangebyrank,從命令可以看出是按照排名範圍來刪除,如上圖所示,第一次zremrangebyrank時,指定範圍-2到-1,即按降序刪除前兩個元素,還記得前面講列表時說過,從左到右下標從0開始,從右到左下標從-1開始。兩條命令刪除完成後列表中沒有了分數最高的前三個元素。接著刪除列表中0到1範圍內元素,即按公升序刪除前集合中的兩個,最後剩下乙個「song_4」,也就是說,zremrangebyrank命令指定的範圍引數如果是整數,就是按公升序排列進行刪除,如果範圍引數是負數,即按降序排列進行刪除。

第三種有序集合刪除命令是zremrangebyscore,按分數範圍刪除列表中的元素:

命令的兩個引數可以設定要刪除的分數範圍,例如刪除權重在30到70之間的元素。增加和刪除操作完成,如果想檢視集合裡的某乙個元素,可以用zrevrank命令檢視具體元素的排名和zscore命令檢視具體元素的權重。

基數統計是常見的場景,例如**對每乙個使用者一星期內或乙個月內登陸次數的統計,基數是乙個集合**現的不同的值的數量,例如乙個集合a=,集合a裡面的基數就是5,b=集合中雖然有6個數,但是其中2重複了,所以基數還是5,所以說基數統計做的是唯一計數,基數統計**現了多次的數也只會被算作一次。既然是唯一計數,那麼可以用前面的有序集合來做統計任務,如果用zadd命令向有序集合中新增已存在鍵的元素,則會覆蓋掉舊的物件,實現更新值的操作。但是,如果資料量十分大的話,就要考慮記憶體消耗的問題了,redis提供了一種資料結構hyperloglog給我們做基數統計,且在記憶體消耗上比起用集合有很大的優化。

建立/新增乙個hyperloglog使用的命令是pfadd,和前面大多數的add命令一樣,如果引數鍵不存在,則會先建立乙個空的hyperloglog。往裡面新增完元素後,使用pfcount可以輸出得到基數的近似值,注意這是乙個近似值,正如前面說的標準偏差是0.81%,pfcount命令執行成功後,會將這個近似基數值快取,等下次執行pfadd命令後,如果近似基數發生了變化,就會返回1,否則,直接使用舊的近似基數,並返回0。如果我們有多個hyperloglog,例如是多張使用者列表,想要統計它們的基數綜合,可以用pfmerge命令將多個hyperloglog合併在一起,然後輸出基數總和,這個基數是它們的並集,並且也是乙個近似值,近似於所有合併的hyperloglog基數總和。

Redis資料型別之有序集合

k ey key key 有序集合是有序的,去重的容器資料結構 值只能為字串,最多232 12 1 232 1這裡每個元素對應乙個分數,並按照分數從小到大排序 1.新增元素,檢視元素 新增元素時,在前面加乙個分數 zadd z1 1 a 3 b 2 c 檢視所有元素,正向分值從小到大 zrange ...

redis基本資料型別(zset有序集合)

儲存有序的元素。每個元素有個score,按照score從小到大排名。score相同時,按照key的ascii碼排序 資料結構 是否允許重複元素 是否有序 有序實現方式 list列表是是 索引下標 set集合否否 無zset有序集合否是 分值score 分數可以精確的表示的整數的範圍 redis 有序...

Redis 資料型別之集合

redis set 集合 是 sadd srandmember 等命令的操作物件,它使用 redis encoding intset 和 redis encoding ht 兩種方式編碼。編碼的選擇 第乙個新增到集合的元素,決定了建立集合時所使用的編碼 如果乙個集合使用 redis encoding...