美文网首页
Redis-Template-string操作

Redis-Template-string操作

作者: 杨健kimyeung | 来源:发表于2020-08-20 09:00 被阅读0次

    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));
    }
    

    相关文章

      网友评论

          本文标题:Redis-Template-string操作

          本文链接:https://www.haomeiwen.com/subject/umtsjktx.html