zoukankan      html  css  js  c++  java
  • 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);
    }
  • 相关阅读:
    asp:时间的计算
    彻底理解position与anchorPoint
    关于写代码的一些心得总结2014-12-28 23:49:39
    C#如何将线程中的代码抛到主线程去执行
    pac 文件使用到的javascript函数
    webview改变网页宽度
    iOS按钮长按
    ios 页面滑入滑出
    UILable自适应frame
    制作静态库文件(.a文件)
  • 原文地址:https://www.cnblogs.com/sl21100/p/5212343.html
Copyright © 2011-2022 走看看