日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

redis的bitset实战

發布時間:2025/6/15 编程问答 17 豆豆
生活随笔 收集整理的這篇文章主要介紹了 redis的bitset实战 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

本文主要研究一下redis的bitset數據結構的用場

相關命令

SETBIT

時間復雜度為O(1)

setbit login.20180906 102400000 0 setbit login.20180905 201400000 1 復制代碼

GETBIT

時間復雜度為O(1)

getbit login.20180905 201400000 復制代碼

BITOP

時間復雜度為O(N)

bitop or login.9m.week1or login.20180905 login.20180906 getbit login.9m.week1or 201400000 復制代碼

主要做bitset的and、or、xor、not操作,結果存在新的bitset中,注意時間復雜度為O(N)

BITPOS

時間復雜度為O(N)

bitpos login.20180905 1 復制代碼

返回指定bitset中在指定起始位置中第一個出現指定值的offset,不傳start,end默認估計是0,-1

BITCOUNT

時間復雜度為O(N)

bitcount login.20180905 復制代碼

統計bitset中出現1的個數

使用場景

假設有個簽到的需求,要實現的功能如下:

  • 展示當天是否已經簽到,簽到了不能再簽到了
  • 展示最近一周的或者最近一個月的簽到情況/歷史(可以只不詳細記錄到每天的簽到時間,只記錄每天是否簽到)
  • 判斷是否連續簽到,若本周連續簽到,則給予抽獎機會

這里我們就可以使用redis的bitset來實現:

簽到

boolean originValue = redisTemplate.opsForValue().setBit(uidYearKey,dayIndx,true); 復制代碼
  • 這里的key由uid,year構成,然后offset采用day的index
  • 每個uid每個year一個key的話,如果用戶數過多可能造成redis的key太多

獲取簽到數據

BitSet bitSet = fromByteArrayReverse(redisTemplate.opsForValue().get(uidYearKey).getBytes());public static BitSet fromByteArrayReverse(final byte[] bytes) {final BitSet bits = new BitSet();for (int i = 0; i < bytes.length * 8; i++) {if ((bytes[i / 8] & (1 << (7 - (i % 8)))) != 0) {bits.set(i);}}return bits;} 復制代碼
  • 這里有個注意事項,java讀取bytes從小到大是從右往左讀(大端),而redis存儲的bytes從小到大是從左往右(小端),因而這里讀取bytes轉為BitSet需要逆向一下

BitSet Range

public BitSet get(int fromIndex, int toIndex) {//...... } 復制代碼
  • BitSet有個方法,可以根據index來進行range,之后就可以用新的BitSet進行相關統計,比如BitSet的cardinality

小結

  • 對于bitset來說,其優點就是節省內存,如果直接把用戶id作為offset來存儲相應的值,這個相比hash來說,節省了很多空間。類似統計最近N天連續登陸的人的個數這類場景就可以使用bitset來實現。
  • 對于bitset的操作要注意,各個操作的時間復雜度,如果是getbit、setbit則都是O(1),bitop、bitcount、bitpos等都是O(N),在N比較大的時候要注意,可能是潛在的慢查詢

doc

  • setbit
  • getbit
  • bitop
  • bitpos
  • bitcount
  • Efficient analytics with Redis bitmaps
  • Be Careful With your Redis BitSets and Java
  • REDIS BITMAPS – FAST, EASY, REALTIME METRICS
  • Bitmaps vs. Sets to track Monthly Active Users in Redis
  • storing-hundreds-of-millions-of-simple-keys-in-282-mb-with-redis

總結

以上是生活随笔為你收集整理的redis的bitset实战的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。