• 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);
    }
  • 相关阅读:
    Flash、Ajax各自的优缺点,在使用中如何取舍?
    纯CSS气泡框实现方法探究
    CSS里padding和margin的区别是什么?
    img图片标签alt和title属性的区别
    JS中都有哪些数据类型呢?
    剑指offer---按只字形顺序打印二叉树
    剑指offer---序列化二叉树
    剑指offer---二叉树的下一个结点
    剑指offer---二叉树的深度
    剑指offer---平衡二叉树
  • 原文地址:https://www.cnblogs.com/sl21100/p/5212343.html
Copyright © 2020-2023  润新知