本文主要研究一下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) { //...... }