转载:java操作Redis缓存设置过期时间 - liuminchao - 博客园
关于Redis的概念和应用本文就不再详解了,说一下怎么在java应用中设置过期时间。
在应用中我们会需要使用redis设置过期时间,比如单点登录中我们需要随机生成一个token作为key,将用户的信息转为json串作为value保存在redis中,通常做法是:
//生成token String token = UUID.randomUUID().toString(); //把用户信息写入redis jedisClient.set(REDIS_USER_SESSION_KEY + ":" + token,JsonUtils.objectToJson(user)); //设置session的过期时间 时间单位是秒 jedisClient.expire(REDIS_USER_SESSION_KEY + ":" + token, 1800);
但这样做可能会出现问题,比如多并发上面,设置值和过期时间用了两步操作。可以将设置值和过期时间合并成一步操作,所以可以使用redis的设置值set的另外一个方法:
// NX是不存在时才set, XX是存在时才set, EX是秒,PX是毫秒 jedisClient.set(key, value, "NX", "EX", expireSecond);
取值的时候使用:
@Override public Result getUserByToken(String token) { //根据token从redis中查询用户信息 String json = jedisClient.get(REDIS_USER_SESSION_KEY + ":" + token); //判断是否为空 if (StringUtils.isBlank(json)) { return Result.build(400, "此session已经过期,请重新登录"); } //更新过期时间 jedisClient.expire(REDIS_USER_SESSION_KEY + ":" + token, 1800); //返回用户信息 return Result.ok(JsonUtils.jsonToPojo(json, TbUser.class)); }
其他使用方法:
public void save(String key, String value, Long expireSecond) { boolean keyExist = jedisClient.exists(key); if (keyExist) { jedisCluster.del(key); } // NX是不存在时才set, XX是存在时才set, EX是秒,PX是毫秒 jedisClient.set(key, value, "NX", "EX", expireSecond); }
转载:
redis 设置过期时间 - Mr-Lee-long - 博客园
1.redis过期时间介绍
有时候我们并不希望redis的key一直存在。例如缓存,验证码等数据,我们希望它们能在一定时间内自动的被销毁。redis提供了一些命令,能够让我们对key设置过期时间,并且让key过期之后被自动删除
2.redis过期时间相关命令
1.EXPIRE PEXPIRE
EXPIRE 接口定义:EXPIRE key "seconds"
接口描述:设置一个key在当前时间"seconds"(秒)之后过期。返回1代表设置成功,返回0代表key不存在或者无法设置过期时间。
PEXPIRE 接口定义:PEXPIRE key "milliseconds"
接口描述:设置一个key在当前时间"milliseconds"(毫秒)之后过期。返回1代表设置成功,返回0代表key不存在或者无法设置过期时间。
1 2 3 4 5 6 |
|
2.EXPIREAT PEXPIREAT
EXPIREAT 接口定义:EXPIREAT key "timestamp"
接口描述:设置一个key在"timestamp"(时间戳(秒))之后过期。返回1代表设置成功,返回0代表key不存在或者无法设置过期时间。
PEXPIREAT 接口定义:PEXPIREAT key "milliseconds-timestamp"
接口描述:设置一个key在"milliseconds-timestamp"(时间戳(毫秒))之后过期。返回1代表设置成功,返回0代表key不存在或者无法设置过期时间
1 2 3 4 5 6 |
|
3.TTL PTTL
TTL 接口定义:TTL key
接口描述:获取key的过期时间。如果key存在过期时间,返回剩余生存时间(秒);如果key是永久的,返回-1;如果key不存在或者已过期,返回-2。
PTTL 接口定义:PTTL key
接口描述:获取key的过期时间。如果key存在过期时间,返回剩余生存时间(毫秒);如果key是永久的,返回-1;如果key不存在或者已过期,返回-2。
1 2 3 4 5 6 7 8 9 10 |
|
4.PERSIST
PERSIST 接口定义:PERSIST key
接口描述:移除key的过期时间,将其转换为永久状态。如果返回1,代表转换成功。如果返回0,代表key不存在或者之前就已经是永久状态。
1 2 3 4 5 6 7 8 9 10 |
|
5.SETEX
SETEX 接口定义:SETEX key "seconds" "value"
接口描述:SETEX在逻辑上等价于SET和EXPIRE合并的操作,区别之处在于SETEX是一条命令,而命令的执行是原子性的,所以不会出现并发问题。
1 2 3 4 5 6 |
|
3.redis如何清理过期key
redis出于性能上的考虑,无法做到对每一个过期的key进行即时的过期监听和删除。但是redis提供了其它的方法来清理过期的key。
1.被动清理
当用户主动访问一个过期的key时,redis会将其直接从内存中删除。
2.主动清理
在redis的持久化中,我们知道redis为了保持系统的稳定性,健壮性,会周期性的执行一个函数。在这个过程中,会进行之前已经提到过的自动的持久化操作,同时也会进行内存的主动清理。
在内存主动清理的过程中,redis采用了一个随机算法来进行这个过程:简单来说,redis会随机的抽取N(默认100)个被设置了过期时间的key,检查这其中已经过期的key,将其清除。同时,如果这其中已经过期的key超过了一定的百分比M(默认是25),则将继续执行一次主动清理,直至过期key的百分比在概率上降低到M以下。
3.内存不足时触发主动清理
在redis的内存不足时,也会触发主动清理。
4.redis内存不足时的策略
redis是一个基于内存的数据库,如果存储的数据量很大,达到了内存限制的最大值,将会出现内存不足的问题。redis允许用户通过配置maxmemory-policy参数,指定redis在内存不足时的解决策略
1.volatile-lru 使用LRU算法删除一个键(只针对设置了过期时间的key
2.allkeys-lru 使用LRU算法删除一个键
3.volatile-lfu 使用LFU算法删除一个键(只针对设置了过期时间的键)
4.allkeys-lfu 使用LFU算法删除一个键
5.volatile-random 随机删除一个键(只针对设置了过期时间的键)
6.allkeys-random 随机删除一个键
7.volatile-ttl 删除最早过期的一个键
8.noeviction 不删除键,返回错误信息(redis默认选项)
对于只针对设置了过期时间的键进行删除的策略,在所有的可被删除的键(非永久的键)都被删除时内存依然不足,将会抛出错误。
其中,LRU算法--->最近最少使用算法,较为注重于时间;LFU算法--->最近最不常用算法,较为注重于被访问频率。
redis的内存置换算法和操作系统中的内存置换算法类似,就不在这里展开了。
5.redis过期时间总结
redis的过期时间还有许多的细节值得去深入了解,例如持久化时对过期时间的处理,redis周期性的常规操作等等,只有这样才能更准确的定位问题,解决问题。
而想进一步的理解这些知识,除了仔细的思考外,最好的办法就是通过阅读源代码,理解redis的底层运行原理。但是这一目标对于现在的我来说难度过大,希望通过不断的学习,将来的我能够做到这一点。
文章浏览阅读1.9k次,点赞4次,收藏7次。文献”SEMI-SUPERVISED CLASSIFICATION WITH GRAPH CONVOLUTIONAL NETWORKS“解读。使用GCN解决KarateClub社交网络问题。_图神经网络节点分类示例
文章浏览阅读310次。当网页是静态的之后,就不需要像动态网页一样通过权威机构访问,动态网页搜索引擎更容易获取信息。但现在搜索引擎正在逐步改变算法,在这方面的优势并不是那么明显。也许动态网页会让搜索引擎更喜欢它们。网页静态后,访问速度更快,对服务器的压力小,承受访问的能力大。但是,如果你使用一些网站,会有大量的页面,这将在产生静态时对服务器造成很大的压力。此时,访问网站的响应速度将远低于动态网站的响应速度。二、动态页面的优缺点动态网页的优点是可以降低成本,更便于管理。目前,大多数网站使用动态页面,这也是未来网站发展.._静态网页的优势比动态网页明显。(3分)对错
文章浏览阅读1.8k次,点赞4次,收藏26次。上图是A*的轨迹规划效果,障碍分为两种分别是球体和圆柱,此时只考虑静止障碍假设ROV有探测功能,其探测半径为R,根据探测结果再次使用A*,当检测到运动障碍在之前的规划路径上时重新规划路径,以避开障碍。ROV采用MPC进行轨迹规划控制,效果如下:..._a*和mpc
文章浏览阅读1.1k次。版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。本文链接:https://blog.csdn.net/zab635590867/article/details/82874659用IDEA搭建springboot2.0.5项目选择Spring initializr就可以轻松搭建一个springboot项目,第一次搭建很费时在Group..._#{isweight,jdbctype=varchar}
文章浏览阅读2.6k次,点赞7次,收藏17次。Jekyll 是一个基于 Ruby 语言的,用于搭建静态网站的生成器,主要用于搭建博客网站(官方自己的介绍为:Jekyll is a blog-aware, static site generator in Ruby)。但是虽然是静态网站,但是可以实现一些使用数据库的动态网站的效果和功能,是很不错的一个框架。。虽然 Jekyll 官网提供了教学,GitHub 也提供了教学,但是二者需要交叉起来看,所以这个框架还是有点简单并且复杂的。并且有一些细节没有提到。因此,写此文来记录一下。_jekyll github
文章浏览阅读443次。错误截图错误描述在使用mybatis-plus进行连表查询的时候,发现写在xml里的sql语句执行不到,方法报错错误原因mybaitls默认的mapper.xml加载路径是再resource目录下的mapper包下而我这里自定义修改了名字导致加载不到xml文件解决方法所以解决方法也很简单要么服从要么需改我选服从改下名字测试一切正常..._mybatis plus org.apache.ibatis.binding.bindingexception: invalid bound state
文章浏览阅读7k次,点赞2次,收藏3次。今天我要分享的JavaScript鼠标移动事件的知识点1.首先准备一个文件夹和一张GIF的动图,打开VS Code,新建一个文件,Ctrl+S保存文件,输入文件名,文本类型设置成HTML,如下图所示;2.在文档里输入英文状态下的感叹号+回车键,如下图所示;3.在body里输入img标签,把GIF图引入,在img标签里输入style属性,设置定位,宽和高如下图所示;4.现在开始写JavaScript代码:(1)获取img标签,然后添加鼠..._js添加鼠标移动事件
文章浏览阅读5.6k次。在初始化数据库时使用如下命令:[root@localhost mysql]# bin/mysqld \--initialize-insecure \--user=mysql \--basedir=/usr/local/mysql \--datadir=/usr/local/mysql/data问题描述12020-08-16T18:34:32.735665Z 0 [ERROR] bin/mysqld: Error while setting value 'NO_ENGINE_SUBSTITUT_使用持久数据库初始化nss时出错
文章浏览阅读240次。【代码】马蹄集MT3010-英语考试。
文章浏览阅读987次,点赞11次,收藏23次。bodybytessent~*/url样例解释location = /url 等号表示精准匹配,只有完全匹配上才会生效,如找到,停止搜索location ^~ /url ^~开头表示对URL路径进行前缀匹配,并且在正则匹配之前,若找到,停止匹配location ~ /url 表示区分大小写的正则匹配,按照配置文件顺序匹配location ~*表示不区分大小写的正则匹配,按照配置文件顺序匹配。
文章浏览阅读133次。随着我国“十三五”规划中信息化战略的大力实施,截止2021年2月,光手机网民人数就达到近10亿由此,3D美术的崛起已经势不可挡,3D美术是每一个游戏中的核心岗位,在市面上无论是2D/3D游戏都需要去使用三维建模,王者荣耀为何可以皮肤上线一天就营收1.5亿,3D美术设计师当得首功。学3D建模能做什么?学后你可以从事哪些工作?行业趋势分析发展路线参加学习是选择线上还是线下?刚兴趣的同学可以参与今晚7点30分的试听课学习,并且送你海量学习资料。分享国内最全面的3D游戏建模系列相关资源,3D_0基础学游戏3d美术设计,高薪就业快人一步
文章浏览阅读340次。修改.editrc的indent为4'indent': [ 'error', 4, { SwitchCase: 1, flatTernaryExpressions: true } ], 修改webstorm的code style indent 4转载于:htt..._"switchcase\": 1, \"flatternaryexpressions\": false, \"ignorednodes\": [ \"propert"