redis的bitset实战
生活随笔
收集整理的這篇文章主要介紹了
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实战的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 英国政府发人工智能深度报告,力图保持领先
- 下一篇: ceph——rgw服务启不起来