操作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;
}