RedisTemplate常用操作:1、redisTemplate-string-操作

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));
}
经验分享 程序员 微信小程序 职场和发展