转载: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的底层运行原理。但是这一目标对于现在的我来说难度过大,希望通过不断的学习,将来的我能够做到这一点。
mybatis是ibatis的升级版,spring也有自带mybatis的orm。所以,搭建ibatis的框架也会有多种方式(我这里mybatis是3.0的,ibatis是2.3的,spring是3.0的,数据库是mysql)。下面介绍3中方式1,只是用mybatis3。2,使用mybatis3+spring3(使用mybatis的SqlSessionFactory )。3,使..._spring同时集成mybatis和ibatis
写在前面的话我们在《特斯拉系列专题报告(三):颠覆性创新重塑汽车产业,零部件厂商破壳重生》中提到,在特斯拉的引领之下,汽车E/E架构、软件架构、通信架构正全面升级,传统汽车产业链正在被颠覆性重塑。此外,《特斯拉系列专题报告(五):域控制器—智能汽车的“大脑”》中重点探讨了智能汽车中核心增量零部件域控制器的相关内容。我们认为,当E/E架构正由传统的分布式走向集中化时,原本孤立的ECU相互融合为域控制器,并将以此有效减少汽车智能化升级进程中的线束成本、研发成本等,加速汽车智能化时代的到来。不过,集中化的E/
BombTime Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/65536 K (Java/Others)Total Submission(s): 15805 Accepted Submission(s): 5761Problem DescriptionThe counter-terrori
本文主要介绍 Qt Creator 7.0 系列版本(如 Qt Creator 7.0.1)的常见问题和常见用法。Qt Creator 是跨平台 Qt 集成开发环境(IDE),可在 Windows、Linux 和 macOS 桌面操作系统上运行,并允许开发人员在桌面、移动和嵌入式平台创建应用程序。Qt Creator 的设计目标是使开发人员能够利用 Qt 这个应用程序框架更加快速及轻易地完成开发任务。本章主要介绍在使用 Qt Creator 7.0 系列版本的过程中的常见问题和常见用法。通过 Notepad_qtcreator 设置控件隐藏
集中式:先说集中式版本控制系统。简单的说就是,版本库是集中的存放于中央服务器的。干活的时候,先要去中央服务器里领取最新的版本,然后在开始干活。干完活在将自己的版本上传到中央服务器。就好比要改一本书,先要从图书馆里将书籍借阅出来,然后改完了之后,在将图书归还给图书馆。然后别人看到的就是最新的版本了。缺点:缺点就是,一但没有网或者网络不好的话,自己写的东西就很难得传上去。别人也不能及时的看到..._集中式和分布式的区别
在 Vue 中,父组件通过 props 向子组件传递数据 (props down),子组件通过 events 向父组件发送消息(events up)。父子组件<div id="example"> <parent></parent><_对于props生命的属性来说,在父级html模板中,属性名的命名方式?
QQ交流群:607330463 GIS开发技术最强交流群 未经允许 禁止转载 可以参考目录(1)简介(2)代码参考(1)简介ServerObjectExtension 简称SOE 是WebGIS和AE空间分析结合的利器,每一次不同的请求会发起新的进程,就所谓的客户端启动一个“.exe”软件,实例是高级隔离的!但是根据配置,soe会闲置三十分钟才会被处理掉,或者过了24小时,重新自自动启动soe,保证进程释放资源;这种情况下万一soe占用大量内存导致崩坏也是有可能的!下图Ar..._arcsoc怎么关
1)滚动条:document.documentElement.scrollTop||document.body.scrollTop2) 获取样式兼容function getStyle(dom, styleName){return dom.currentStyle?dom.currentStyle[styleName] :getComputedStyle(dom)[styleName];}3) 网页...
/* Json数据格式["ID",True,msg],ajax参数见 1188 var data = { "fieldId": field.attr("id"), "fieldValue": field.val() }; *
distinct 查找某列中不重复的值,如某一列值查出来后,有很很多重复的,直接用 如下语句,就把重复的值过滤了,方便很多SELECT DISTINCT Company FROM Orders substring_index()些函数是截取字段中值用的,如我要截取www.abc.com,我只如下代码就可以了SELECT substring_index(domain,'.',-2) FROM sp
1、小明和弟弟过桥(3秒) + 小明回bai来du(1秒)+ 爷爷和妈妈过桥(12秒) + 弟弟回zhi来(3秒)dao+ 爸爸和小zhuan明过桥(6秒) + 小明回来(1秒) + 小明和弟弟过桥(3秒)= 29秒2、小明和弟弟过桥(3秒) + 弟弟回来(3秒)+ 爷爷和妈妈过桥(12秒) + 小明回来(1秒)+ 爸爸和小明过桥(6秒) + 小明回来(1秒) + 小明和弟弟过桥(3秒)= 29秒..._小明过桥
前言在项目中经常会用到表单的校验,前端校验会减少对服务器的压力并且能提升用户体验,达到各种交互效果练习: 通用校验函数编写思考: 一般校验有哪几种情况从上至下,提示语只有一个位置只显示错误的第一条(标红/不标红错误的相关项)每个元素下方提示当前元素的错误提示 不适合以弹框的形式显示提示语在元素右侧 弹框安全高度640px以内..._校验函数