redis中的命令:
1.setbit key index true 如:setbit login 12 1 分别是键,偏移量,结果
2.getbit key index 如:getbit login 12 获取12位上的login为key的结果
3.bitop or key key1 key2 主要做bitset的and、or、xor、not操作,结果存在新的bitset中
4.bitpos key true 返回指定bitset中在指定起始位置中第一个出现指定值的offset,不传start,end默认估计是0,-1
5bitcount key 统计bitset中出现1的个数
1.JAVA中BitSet类的API
public void set(int pos): 位置pos的字位设置为true。
public void set(int bitIndex, boolean value) 将指定索引处的位设置为指定的值。
public void clear(int pos): 位置pos的字位设置为false。
public void clear() : 将此 BitSet 中的所有位设置为 false。
public int cardinality() 返回此 BitSet 中设置为 true 的位数。
public boolean get(int pos): 返回位置是pos的字位值。
public void and(BitSet other): (1,4) .(1,5)--->1
public void or(BitSet other): (1,4) .(1,5)--->1,4,5
public void xor(BitSet other): 异或 (1,4) .(1,5)--->4,5 如果a、b两个值不相同,则结果为1。如果a、b两个值相同,结果为0
public void andNot(BitSet set) : (1,4) .(1,5)--->4 在第一个BitSet中为true的-在第二个Bitset中不为true的结果
public int size(): 返回此 BitSet 表示位值时实际使用空间的位数。
public int length() 返回此 BitSet 的“逻辑大小”:BitSet 中最高设置位的索引加 1。
public int hashCode(): 返回该集合Hash 码, 这个码同集合中的字位值有关。
public boolean equals(Object other): 如果other中的字位同集合中的字位相同,返回true。
public Object clone() 克隆此 BitSet,生成一个与之相等的新 BitSet。
public String toString() 返回此位 set 的字符串表示形式。
public BitSet get(int fromIndex, int toIndex)截取出新的BitSet
/**
* java读取bytes从小到大是从右往左读(大端),而redis存储的bytes从小到大是从左往右(小端),因而这里读取bytes转为BitSet需要逆向一下
*/
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;
}
使用场景:为了统计今日登录的用户数,我们建立了一个bitmap,每一位标识一个用户ID。当某个用户访问我们的网页或执行了某个操作,就在bitmap中把标识此用户的位置为1