Bitmap工具类
封装StringRedisTemplate
@Component
public class BitMapUtil {
@Resource
private StringRedisTemplate stringRedisTemplate;
public void setBit(String key, long offset, boolean value) {
stringRedisTemplate.execute((RedisCallback<?>) con -> con.setBit(key.getBytes(), offset, value));
}
public boolean getBit(String key, long offset) {
return (boolean) stringRedisTemplate.execute((RedisCallback<?>) con -> con.getBit(key.getBytes(), offset));
}
public Long bitCount(String key) {
return stringRedisTemplate.execute((RedisCallback<Long>) con -> con.bitCount(key.getBytes()));
}
public Long bitCount(String key, Long start, Long end) {
return (Long) stringRedisTemplate.execute((RedisCallback<?>) con -> con.bitCount(key.getBytes(), start, end));
}
public Long opOrCount(String... key) {
byte[][] keys = new byte[key.length][];
for (int i = 0; i < key.length; i++) {
keys[i] = key[i].getBytes();
}
stringRedisTemplate.execute((RedisCallback<?>) con -> con.bitOp(RedisStringCommands.BitOperation.OR, (key[0] + "To" + key[key.length - 1]).getBytes(), keys));
stringRedisTemplate.expire(key[0] + "To" + key[key.length - 1], 10, TimeUnit.SECONDS);
return this.bitCount(key[0] + "To" + key[key.length - 1]);
}
public Long opAndCount(String... key) {
byte[][] keys = new byte[key.length][];
for (int i = 0; i < key.length; i++) {
keys[i] = key[i].getBytes();
}
stringRedisTemplate.execute((RedisCallback<?>) con -> con.bitOp(RedisStringCommands.BitOperation.AND, (key[0] + "To" + key[key.length - 1]).getBytes(), keys));
stringRedisTemplate.expire(key[0] + "To" + key[key.length - 1], 10, TimeUnit.SECONDS);
return this.bitCount(key[0] + "To" + key[key.length - 1]);
}
public Long opXorCount(String... key) {
byte[][] keys = new byte[key.length][];
for (int i = 0; i < key.length; i++) {
keys[i] = key[i].getBytes();
}
stringRedisTemplate.execute((RedisCallback<?>) con -> con.bitOp(RedisStringCommands.BitOperation.XOR, (key[0] + "To" + key[key.length - 1]).getBytes(), keys));
stringRedisTemplate.expire(key[0] + "To" + key[key.length - 1], 10, TimeUnit.SECONDS);
return this.bitCount(key[0] + "To" + key[key.length - 1]);
}
public Long opNotCount(String... key) {
byte[][] keys = new byte[key.length][];
for (int i = 0; i < key.length; i++) {
keys[i] = key[i].getBytes();
}
stringRedisTemplate.execute((RedisCallback<?>) con -> con.bitOp(RedisStringCommands.BitOperation.NOT, (key[0] + "To" + key[key.length - 1]).getBytes(), keys));
stringRedisTemplate.expire(key[0] + "To" + key[key.length - 1], 10, TimeUnit.SECONDS);
return this.bitCount(key[0] + "To" + key[key.length - 1]);
}
public List<Long> bitfield(String key, int start, int offset) {
return stringRedisTemplate.execute((RedisCallback<List<Long>>) con -> con.bitField(key.getBytes(), BitFieldSubCommands.create().get(BitFieldSubCommands.BitFieldType.unsigned(start)).valueAt(offset)));
}
}