Redis之集合統計型應用

2021-10-12 03:10:49 字數 1765 閱讀 1337

二值狀態統計

基數統計

資料型別比較

統計多個集合元素的聚合結果,比如交集、差集、並集運算。

累計使用者set

每日使用者set

set的差集、並集、交集計算複雜度較高,在資料量較大的情況下,如果直接執行會導致阻塞,可以通過從庫進行聚合計算,或者將資料讀取到客戶端進行聚合統計。

要求集合中元素按照順序儲存,redis中list 和 sorted set是有序集合

list

lrange product1 0 2 

1)"a"

2)"b"

3)"c"

lrange product1 3 5 

1)"c"

2)"d"

3)"e"

c又出現了,原因如下:

list 是通過元素在 list 中的位置來排序的,當有乙個新元素插入時,原先的元素在 list 中的位置都後移了一位,比如說原來在第 1 位的元素現在 排在了第 2 位。

對比新元素插入前後,list 相同位置上的元素就會發生變化,用 lrange 讀取時,就會讀到舊元素。

sorted set

根據元素的實際權重來排序和獲取資料的。

sorted set 的 zrangebyscore 命令就可以按權重排序後返回元素。

二值狀態就是指集合元素的取值就只有 0 和 1 兩種

bitmap 本身是用 string 型別作為底層資料結構實現的一種統計二值狀態的資料型別。

bitmap 提供了 getbit/setbit/bitcount命令

bitmap通過 bitop 按位 與、或、異或的操作

具體場景:簽到場景,統計1億個使用者連續10天簽到情況

每天的日期作為乙個key,每個key對應乙個1億位bitmap,每個bit對應乙個使用者當天的簽到情況

然後用bitcount 統計最後resmap中1的個數,就是10天的簽到使用者總數

每天使用1個1億位的bitmap,大約佔12mb記憶體,10天的bitmap佔120mb,記憶體壓力不算特別大。

統計乙個集合中不重複的元素的個數

hyperloglog是一種用於統計基數的的資料集合型別,優勢在於當集合元素非常多的時候,它需要的空間總是固定的。

每個 hyperloglog 只需要花費 12 kb 記憶體,就可以計算接近 2^64 個元素 的基數

具體場景:網頁uv的統計

hash和set方案都會造成使用記憶體過大

//新增

pfadd page1:uv user1 user2 user3 user4 user5

//計算總量值

pfcount page1:uv

hyperloglog 的統計規則是基於概率完成的,所以它給出 的統計結果是有一定誤差的,標準誤算率是 0.81%

Redis之集合命令

127.0.0.1 6379 flushdb 清空資料庫 ok127.0.0.1 6379 sadd set1 a b c d f 新增乙個集合 integer 5 127.0.0.1 6379 scard set1 計算乙個集合中的元素個數 integer 5 127.0.0.1 6379 sre...

Redis之整數集合

整數集合是集合鍵的底層實現之一,當乙個結合只包含整數值元素,並且這個集合的元素數量不多時,redis就會使用整數集合作為集合作為集合鍵的底層實現。我們先來看一下它的結構 typedef struct intset intse它可以儲存的型別為int16 t int 32t int64 t,並且保證集...

redis實戰 Redis命令之集合

redis的集合以無序的方式儲存多個各不相同的元素,使用者可以快速對集合執行新增元素 移除元素以及檢查元素是否存在於集合中的操作。命令用例 描述注意 sadd sadd key item item 將乙個或多個元素插入到集合中,並返回被新增元素當中原本不存在於集合中的數量 srem srem key...