本文主要研究一下redis的bitset數據結構的用場java
時間複雜度爲O(1)git
setbit login.20180906 102400000 0 setbit login.20180905 201400000 1
時間複雜度爲O(1)github
getbit login.20180905 201400000
時間複雜度爲O(N)redis
bitop or login.9m.week1or login.20180905 login.20180906 getbit login.9m.week1or 201400000
主要作bitset的and、or、xor、not操做,結果存在新的bitset中,注意時間複雜度爲O(N)
時間複雜度爲O(N)數據結構
bitpos login.20180905 1
返回指定bitset中在指定起始位置中第一個出現指定值的offset,不傳start,end默認估計是0,-1
時間複雜度爲O(N)app
bitcount login.20180905
統計bitset中出現1的個數
假設有個簽到的需求,要實現的功能以下:ui
這裏咱們就可使用redis的bitset來實現:code
boolean originValue = redisTemplate.opsForValue().setBit(uidYearKey,dayIndx,true);
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; }
大端
),而redis存儲的bytes從小到大是從左往右(小端
),於是這裏讀取bytes轉爲BitSet須要逆向一下public BitSet get(int fromIndex, int toIndex) { //...... }