redis中使用BitMap

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

猜你喜欢

转载自blog.csdn.net/New_CJ/article/details/84337339