redis 数据操作总结

219 阅读1分钟

操作zset集合,假如最近每分钟都往zset中添加一条数据,有个需求是获取最近三分钟的数据,写法如下:

try {
            ZSetOperations<String, Object> opsForZset = redisTemplate.opsForZSet();

            Long fiveMinite = getTimeFrom(5);
            Long fourMinite = getTimeFrom(4);
            Long threeMinite = getTimeFrom(3);
            Long twoMinite = getTimeFrom(2);
            Long oneMinite = getTimeFrom(1);

            opsForZset.add("test_key","张三",fiveMinite);//添加5分钟前的时间戳
            opsForZset.add("test_key","张四",fourMinite);//添加4分钟前的时间戳
            opsForZset.add("test_key","张五",threeMinite);//添加3分钟前的时间戳
            opsForZset.add("test_key","张六",twoMinite);//添加2分钟前的时间戳
            opsForZset.add("test_key","张七",oneMinite);//添加1分钟前的时间戳

            Set<ZSetOperations.TypedTuple<Object>> list =
                    opsForZset.rangeByScoreWithScores("test_key",threeMinite,System.currentTimeMillis());//获取最近三分钟之内的数据
            Iterator iterator = list.iterator();
            while (iterator.hasNext()){
                ZSetOperations.TypedTuple<Object> typedTuple = (ZSetOperations.TypedTuple<Object>) iterator.next();
                Object value = typedTuple.getValue();
                double score = typedTuple.getScore();
                System.out.println("----"+value+"::"+score);
            }
            
            //删除三分钟之前的数据
            opsForZset.removeRangeByScore("test_key",0l,fourMinite);

            //遍历zset中剩余集合
            Set<Object> sets = opsForZset.range("test_key",0,-1);
            for (Object s :sets) {
                System.out.println("元素:"+s);
            }
            
        }catch (Exception e){
            e.printStackTrace();
        }
 
 //获取几分钟之前时间戳       
 private Long getTimeFrom(int minute){
        try {
            Date date = new Date();
            date.setTime(date.getTime() - minute*60*1000);
            return date.getTime();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }