1、Get/Set方法
说明
直接使用默认的RedisTemplate进行redis的读写操作
栗子
@SpringBootTest
public class ValueOperationsTests {
@Resource
ValueOperations<String, Object> valueOperations;
@Test
void operationString() {
valueOperations.set("hello", "world");
}
@Test
void operationObject() {
valueOperations.set("obj", RedisObject.builder().id(1).name("测试保存对象").build());
}
@Test
void operationNx() {
// 如果key不存在 才去设置值 否则不设置
valueOperations.setIfAbsent("nx", RedisObject.builder().id(1).name("设置过期时间1111").build(), Duration.ofDays(1));
// 如果key存在去设置值 否则不设置值
valueOperations.setIfPresent("nx", RedisObject.builder().id(1).name("设置过期时间1111").build(), Duration.ofDays(1));
// 存在才设置值
valueOperations.setIfPresent("nx1", RedisObject.builder().id(1).name("key不存在则不设置").build(), Duration.ofDays(1));
}
}
2、计数
说明
统计计数,也算是一个比较常见,虽然对于redis而言,存储的都是String,但是从我们的逻辑上来看,存在redis中的值,应该是数字型,然后就可以直接传入一个增量,实现存储数据的运算效果,并返回最终的结果
因为redis是单进程方式的,因此采用redis的计数方式,可以较简单的实现分布式的计数效果
栗子
@Test
void operationIncrement() {
valueOperations.increment("valueIncr", 1);
valueOperations.increment("valueIncr");
valueOperations.increment("valueIncr");
valueOperations.decrement("valueDecr",1);
valueOperations.decrement("valueDecr");
valueOperations.decrement("valueDecr");
}
3、bitmap操作
说明
位图操作,什么地方用得比较多呢?一个经典的case就是统计网站的日活,用户首次登陆时,根据用户id,设置位图中下标为userId的值为1,表示这个用户激活了;然后一天结束之后,只需要统计这个位图中为1的个数就可以知道每日的日活;也可以借此来统计每个用户的活跃状况
栗子
public Boolean setBit(String key, Integer index, Boolean tag) {
return redisTemplate.execute((RedisCallback<Boolean>) con -> con.setBit(key.getBytes(), index, tag));
}
public Boolean getBit(String key, Integer index) {
return redisTemplate.execute((RedisCallback<Boolean>) con -> con.getBit(key.getBytes(), index));
}
/**
* 统计bitmap中,value为1的个数,非常适用于统计网站的每日活跃用户数等类似的场景
*
* @param key
* @return
*/
public Long bitCount(String key) {
return redisTemplate.execute((RedisCallback<Long>) con -> con.bitCount(key.getBytes()));
}
public Long bitCount(String key, int start, int end) {
return redisTemplate.execute((RedisCallback<Long>) con -> con.bitCount(key.getBytes(), start, end));
}
public Long bitOp(RedisStringCommands.BitOperation op, String saveKey, String... desKey) {
byte[][] bytes = new byte[desKey.length][];
for (int i = 0; i < desKey.length; i++) {
bytes[i] = desKey[i].getBytes();
}
return redisTemplate.execute((RedisCallback<Long>) con -> con.bitOp(op, saveKey.getBytes(), bytes));
}
网友评论