redis中bitmaps進行狀態統計
阿新 • • 發佈:2019-01-06
Bitmap Bitmap是一串連續的2進位制數字(0或1),每一位所在的位置為偏移(offset)。 在bitmap上可執行AND,OR,XOR以及其它位操作。 bitmap最大長度是512 MB,所以它們可以表示2 ^ 32=4294967296個不同的位。點陣圖計數 點陣圖計數統計的是bitmap中值為1的位的個數。點陣圖計數的效率很高。Redis Bitmaps Redis允許使用二進位制資料的Key(binary keys) 和二進位制資料的Value(binary values)。Bitmap就是二進位制資料的value。Redis的 setbit(key, offset , value)操作對指定的key的value的指定偏移(offset)的位置1或0,時間複雜度是O(1)。setbit 、 getbit、bitcount 命令setbit 設定bit位的值(值為1或者0)getbit 獲取bit位的值bitcount 統計bit位為1的總數例如: > setbit key 1 1> setbit key 2 1> setbit key 8 1> setbit key 9 1> bitcount key 結果 4將第1,2,8,9bit位設定成1,看下圖:
offset 是從左邊往後邊數(高位往低位數),開始索引從0開始。舉例 統計當天登入使用者數量,模擬使用者id為(1,2,3,4,20)的使用者登入
使用者登入數量: 5spring-data-redis 中StringRedisTemplate不能使用bitcount方法,需要自己擴充套件
offset 是從左邊往後邊數(高位往低位數),開始索引從0開始。舉例
//keyredis 儲存的二進位制值:0111 1000 0000 0000 0000 1000 轉換16進位制: 0x780008
String key1 = "20180501";
//使用者id
int useId1 = 1;
int useId2 = 2;
int useId3 = 3;
int useId4 = 4;int useId20 = 20;
//設定使用者登入狀態
redisDao.setBit(key1, useId1, true);
redisDao.setBit(key1, useId2, true);
redisDao.setBit(key1, useId3, true);
redisDao.setBit(key1, useId4, true);
redisDao.setBit(key1, useId20, true);
//二進位制:0111 1000 0000 0000 0000 1000 16進位制: 0x7800 0x08long login1 =redisServiceExtend.bitCount(key1);
System.out.println("使用者登入數量: " + login1);
使用者登入數量: 5spring-data-redis 中StringRedisTemplate不能使用bitcount方法,需要自己擴充套件
@Repository
public class RedisServiceExtend {
@Autowired
RedisTemplate<String, String> redisTemplate;
private static String redisCode = "utf-8";
/**
* 統計bit位為1的總數
* @param key
*/
public long bitCount(final String key) {
return redisTemplate.execute(new RedisCallback<Long>() {
@Override
public Long doInRedis(RedisConnection connection) throws DataAccessException {
long result = 0;
result = connection.bitCount(key.getBytes());
return result;
}
});
}
}