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);
}
时间: 2024-10-13 02:17:53

spring-redis SortedSet类型成员的过期时间处理的相关文章

redis hash结构如何设置过期时间

Redis中有个设置时间过期的功能,即通过setex或者expire实现,目前redis没有提供hsetex()这样的方法,redis中过期时间只针对顶级key类型,对于hash类型是不支持的,这个时候,我们可以采用,所以如果想对hash进行expires设置,可以采用下面的方法: redis 127.0.0.1:6379> hset expire:me name tom (integer) 0 redis 127.0.0.1:6379> hget expire:me name "t

laravel redis存数组并设置过期时间

$data = [ 'zoneList'=>$zoneList, 'eqList' => $eqList, 'mdateList' => $mdateList, 'workhoursList' => $workhoursList, 'pricerangeList' => $pricerangeList, ]; Redis::set($cacheKey, serialize($data)); Redis::expire($cacheKey, 300); laravel门面set

Python操作Redis之设置key的过期时间

对于一个已经存在的key,我们可以设置其过期时间,到了那个时间后,当你再去访问时,key就不存在了 有两种方式可以设置过期时间,一种是指定key从当前时间开始算起还能存活多久,时间单位有两个,一个是秒,一个是毫秒 第二种方式是指定key在某一个时间失效,这需要指定明确的年月日时分秒,如果你指定的这个时间已经早于当前时间,那么这个key会立即失效 现在,我们现在redis中添加两个key,分别为ex1 和 ex2 然后分别用两种不同的方式设置其过期时间 # coding=utf-8 ''' Cre

深入理解Spring Redis的使用 (八)、Spring Redis实现 注解 自动缓存

项目中有些业务方法希望在有缓存的时候直接从缓存获取,不再执行方法,来提高吞吐率.而且这种情况有很多.如果为每一个方法都写一段if else的代码,导致耦合非常大,不方便后期的修改. 思来想去,决定使用自动注解+Spring AOP来实现. 直接贴代码. 自定义注解类: package com.ns.annotation; import java.lang.annotation.Documented; import java.lang.annotation.ElementType; import

用Spring Aop 实现注解Dao层的自动Spring Redis缓存

摘要: 主要针对Dao层的一些数据库查询的操作,数据实时性不强,直接加入缓存.当缓存中有的时候,就使用缓存中的数据.这样的方法,最终仅仅使用一个注解实现.对于之前的hibernate二级缓存使用,比较陌生.比如是否支持Redis或者可以自己开发支持.是否支持针对部分需要加入缓存的方法配置,而不是所有的hibernate实体都加入缓存.可能我这种方法对于二级缓存来说,抛开代码差距,也是殊途同归的东西. 这几天工作中,突然遇到了对于有些个实体类,需要被缓存起来.但是这些个实体类数目庞大, 初始化加载

Nginx访问日志、日志切割、静态文件不记录日志和过期时间

Nginx访问日志 Nginx访问日志主要有两个参数控制:log_format #用来定义记录日志的格式(可以定义多种日志格式,取不同名字即可)access_log #用来指定日至文件的路径及使用的何种日志格式记录日志 设置访问日志的格式,打开配置文件vim /usr/local/nginx/conf/nginx.conf 搜索关键字log_format就可以找到日志格式配置行log_format语法格式及参数语法说明如下:$remote_addr客户端IP(公网IP)$http_x_forwa

Linux-LNMP-静态元素过期时间

浏览器访问网站的图片时会把静态的文件缓存在本地电脑里,这样下次再访问时就不用去远程下载了状态码:第一次访问是200.第二次访问是304(没有再去服务器下载),增加配置<IfModule mod_expires.c> #_expires 定义过期时间ExpiresActive on //打开该功能的开关ExpiresByType image/gif "access plus 1 days" #定义类型gif,1days 过期时间ExpiresByType image/jpeg

redis 全局命令 查看所有的键,删除键,检查键是否存在,获取过期时间,键的数据结构类型

Redis有5中数据结构,他们是键值对中的值,对于键来说,有一些通用的命令: 一.查看所有键 keys * 二.获取键总数:dbsize 三.检查键是否存在 exists 如果存在返回1,不存在返回0 四.删除键  del key [key --] 正常情况下返回结果为删除键的个数,假如删除了一个不存在的键,就返回0 同时del命令可以支持同时删除多个键 五.键过期expire key second 当redis的键超过过期时间之后,会自动删除 Ttl命令可以查看上虞的过期时间: 返回-1:键没

php操作redis和memcache过期时间

php-redis 设置过期时间setTimeOut 命令行expireredis过期时间redis术语里面,把设置了expire time的key 叫做:volatile keys. 意思就是不稳定的key.没有设置过期时间的也就是永久存储 set:set('key','value')将值 value 关联到 key setTimeOut:setTimeout('x', 3);设置过期时间 setex:setex('key', 3600, 'value')带生存时间的写入值 这个命令类似于以下