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的主要内容,如果未能解决你的问题,请参考以下文章

判断一个key在redis集群的哪一个节点(分片)

redis集群批量删除指定的key

02-redis通用key操作命令

redis cluster集群批量删除中的key

redis基本命令set

Redis四(Set操作)