redis 判断key在不在sortedset
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了redis 判断key在不在sortedset相关的知识,希望对你有一定的参考价值。
参考技术A 1.【zadd
key
v
k
】
往key中添加一个元素,k为键,v为值。如:zadd
artHits
99
12表示id为12的文章点击量为99次。
2.【
zrange
key
start
end
】
根据v的值由小到大进行排序来获得start到end之间的元素。
注:0表示第一个元素,-1表示最后一个元素,-2表示倒数第二个元素,以此类推,如果要获取第一个到倒数第三个之间的元素,命令为:zrange
key
0
-3。
3.【
zrevrange
key
start
end
】
同上,根据v的值由大到小进行排序来获得start到end之间的元素。可以轻松取出点击量最高的前n篇文章。
4.【
zremrangebyrank
key
start
end
】
删除集合中的元素。排序的方式为按照v由小到大的顺序,如果要删除key集合中的第一个值,则运行
zremrangebyrank
artHits
0
0;删除前3个值:zremrangebyrank
artHits
0
2。
5.【
zcard
】
返回key集合中元素的个数。
6.【
zrank
key
k
】
返回值k在集合key中排第几位,是按照v由小到大的顺序。排第一名返回0,第二返回1,以此类推。
7.【
zrevrank
key
k
】
同上,不同的是,按照v由大到小的顺序。可以轻松取出点击量最高的文章。
8.【
zscore
key
k
】
取出集合key中键为k对应的值v。
9.【
zrem
key
k
】
删除集合中指定元素。
10.【
zincrby
key
num
k
】
给集合key中的元素k加上num,值针对整型。比如
zincrby
artHits
3
12,给id为12的文章加上3个点击量。此时zscore
artHits
12的结果是99+3为102。
spring-redis SortedSet类型成员的过期时间处理
redis默认是只支持简单key的过期处理的,像SortedSet类型,也是针对整个set的过期处理,不支持对set的某个成员的过期处理;
为了解决这个问题,做法如下:
1.存储key及值信息到redis,并将key存入set里,设置key的过期时间;
这样key可以支持过期处理并在过期后移除key及值;但是set里的key还是存在的;
a、在需要判断key过期的处理中,如 boolean containsKey(Object key) ,先在set集合拿到对应的key;
用ttl判断可以是否存在,如不存在说明已过期,从set移除该key;
b、定时任务,有些情况,可以过期了后面也不会再用到,所以需要定时去清理key,checkExpire();
2.代码如下
public boolean containsKey(Object key) { final byte[] keyBytes = computeKey(key); return (Boolean) template.execute(new RedisCallback<Boolean>() { public Boolean doInRedis(RedisConnection connection) throws DataAccessException { waitForLock(connection); Set<byte[]> keys =connection.zRange(setName,0,-1); boolean isExist=false; for (byte[] item : keys) { if(Arrays.equals( keyBytes,item)){ Long remain= connection.ttl(item); if(remain==-2){ connection.zRem(setName, item);//从set里移除; }else { isExist = true; } break; } } return isExist; } }, true); } public void checkExpire() { template.execute(new RedisCallback<Object>() { public Object doInRedis(RedisConnection connection) throws DataAccessException { waitForLock(connection); //connection.multi(); Set<byte[]> keys =connection.zRange(setName,0,-1); for (byte[] item : keys) { Long remain= connection.ttl(item); if(remain==-2){ //connection.del(item); // remove key from set connection.zRem(setName, item); } } //connection.exec(); return null; } }, true); }
以上是关于redis 判断key在不在sortedset的主要内容,如果未能解决你的问题,请参考以下文章