spring-redis SortedSet类型成员的过期时间处理

摘要:
默认情况下,Redis只支持简单密钥的过期。例如,SortedSet类型也用于整个集合的过期。它不支持集合成员的过期;要解决此问题,请执行以下操作:1.将密钥和值信息存储到Redis,将密钥存储在集合中,并设置密钥的过期时间;通过这种方式,密钥可以支持过期处理,并在过期后删除密钥和值;然而,集合中的密钥仍然存在;a、 在确定密钥已过期的过程中,例如boolean containsK

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);
}
复制代码

免责声明:文章转载自《spring-redis SortedSet类型成员的过期时间处理》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇python初识(二)4.2 rust 命令行参数下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

java8-&amp;gt;list转map判空,分组

/** * list转map/分组 * @Author: Mr.li * @Date: 2020/9/8 */ @Test public void demo7() { List<User> userList = new ArrayList<User>()...

五,自定义监控项并创建图形

目录 五,zabbix自定义监控项 一,为什么要自定义监控项 二,自定义监控项中的基础概念 三,自定义监控项配置 1,自定义监控项基本格式 2,在agent上自定义监控项 3,web页面添加监控项 4,为该监控项创建一个图形 五,zabbix自定义监控项 一,为什么要自定义监控项 有的时候zabbix提供的监控项目,不能满足我们生产环境下...

openssl 证书cert与key合并pfx

openssl 证书cert与key合并pfx: d:cd D:SoftwareOpenSSLopenssl pkcs12 -export -out aiahk-re-st1.aiaazure.biz.pfx -inkey aiahk-re-st1.aiaazure.biz.key -in aiahk-re-st1.aiaazure.biz.cer...

RedisTemplate访问Redis数据结构(三)——Hash

HashOperations提供一系列方法操作hash。首先初始化spring工厂获得redisTemplate和opsForHash private RedisTemplate<String,Object> redisTemplate; private HashOperations<String,String,Objec...

C# Dictionary通过value获取对应的key值[转发]

1:最直白的循环遍历方法,可以分为遍历key--value键值对以及所有的key两种表现形式 2:用Linq的方式去查询(当然了这里要添加对应的命名空间 using System.Linq)  如下为一个十分简单的代码示例: private void GetDicKeyByValue() { Dictionary...

STL之六:map/multimap用法详解

转载于:http://blog.csdn.net/longshengguoji/article/details/8547007 map/multimap     使用map/multimap之前要加入头文件#include<map>,map和multimap将key/value当作元素,进行管理。它们可根据key的排序准则自动将元素排序。mul...