如何为Redis中list中的项设置过期时间
Redis是一个伟大的工具,用来在内存中存储列表是很合适的。
不过,如果你想要快速搜索列表,同时需要让列表中每项都在一定时间后过期,应该怎么做呢?
首先,当然不能使用不同的类似的key存储数据,然后使用keys
命令来获取所有类似key的数据。这样的开销是不可接受的。
Redis并没有直接提供方法做这件事,但是这是可以做到的!虽然最后用的未必是Redis的List数据结构。
问题:
我想在cmdb数据采集中,为API 这里加上一个认证的功能,毕竟不能谁都可以随便提交数据给我, 我就接收的所以还是需要一个认证的。
参考了 tonadou 中的一个验证方式。
1. 服务端 于 客户端共同维护同一个key。 客户端在发送数据过来时要携带token。 这个token 由这个key + 客户端的当前时间,MD5加密之后的字符串, 和 客户端的当前时间的时间戳组成。
2. 服务端 除了维护key意外,另外维护一个 过期时间。 比如是10秒钟。 当客户端token过来后。
1)取出token中的 客户端的时间戳,减去过期时间10秒, 于服务器端的当前时间做对比。 如果客户端的这个时间 比服务端当前时间减去10秒后,还要小的话。 那就说明这个时间太久远了直接不准链接。
2)拿着客户端的时间戳 和自己维护的key, 同样的加密后。 判断一下这个加密后的值是否已经访问过了。(就是用redis解决这个). 如果访问过了就不准再访问
3)最后比对一下, 服务端和客户端的加密值是否一样, 一样就通过。 并且把这个加密后的值,再加到redis中。
然后我在网上找到这篇文章,它描述了两种办法。
Redis的集合:“无序的字符串集合”,它的项有下面的特点
- 唯一的(如果加入重复的数据,redis会默默的拒绝)
- 无序,并且不可以用任何方法(在redis中)排序
Redis有序集合:“有序的字符串集合“,它的项有下面的特点:
- 和集合一样,每个项都是唯一的
- 拥有积分(项的积分并不必须是唯一的)
- 根据积分排序(有索引)
两种解决方法:
1. 有序集合
查询有序集合是非常快的,因为redis将一个列表转换成了集合,所以当我们访问它的时候,它已经是排好序的了。
根据Redis文档的描述:
“排序集是通过一个双端口数据结构实现的,其中包含一个跳跃列表和一个哈希表,所以每次我们添加一个元素Redis都会执行一个O(log(N))操作。这很好,但当我们要求排序后的元素时Redis根本不需要做任何工作,它已经排好序了“
当然,你不可以对有序集合中每个项设置过期时间。
你可以通过score
对有序集合进行查询,我们可以利用这个地方来形成一个解决方案: (其中scroe指的就是该有序集合成员的次序。默认从小到大。)
对于加入到有序集合的每个项,我们都将它的score设置为 Unix Timestamp,这个timestamp代表它的过期时间。然后,我们加入一个定时任务,定时移除那些过期的数据。
2. 多个集合以及过期时间
这个方案使用普通的集合。
因为不能对集合中每项都设置TTL,但是可以对整个集合设置TTL。所以,我们可以将每个时间段的数据放在一个集合中。然后对这个集合设置过期时间。
转载于:https://www.cnblogs.com/chengege/p/11075023.html
如何为Redis中list中的项设置过期时间相关推荐
- c# redis 如何设置过期时间_Redis 过期时间与内存管理
http://www.redis.cn/commands/expire.html http://www.redis.cn/topics/lru-cache.html 内存管理 当 Redis 作为缓存 ...
- c# redis hashid如何设置过期时间_Redis中Key过期策略amp;淘汰机制
1. Redis中设置Key过期时间 我们有两种方式设置过期时间 1.1 设置多久后过期 设置一个 key 10s 过期,可以这样 127.0.0.1:6379> SET key value E ...
- redis list设置过期时间_面试官:你在Redis中设置过带过期时间的Key吗?
点击上方小伟后端笔记关注公众号 每天阅读Java干货文章 熟悉Redis的同学应该知道,Redis的每个Key都可以设置一个过期时间,当达到过期时间的时候,这个key就会被自动删除. 在为key设置过 ...
- Spring中RedisTemplate方法中,redis相关操作笔记。[redis生成指定长度自增批次号,删除、设置过期时间等]
Spring中RedisTemplate方法中,redis相关操作笔记. redis获取自增批次号 // opsForValue()生成long UUID = redisTemplate.opsFor ...
- 设置过期时间_在Redis中设置了过期时间的Key,需要注意哪些问题?
点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 作者:千山qianshan juejin.im/post/5d6b ...
- java cookie过期_Java中Servlet Cookie设置过期时间(expires,max-age)
Java中Servlet Cookie设置过期时间(expires,max-age) expires或者max-age指定了coolie的生存期,默认情况下coolie是暂时存在的,他们存储的值只在浏 ...
- 前端小白闲着没事,封装一个可以设置过期时间的localStorage存储函数,在vue脚手架中使用
本身localStorage 是没有这个功能的,除非手动删除要不永久保存在本地. seesionStorage 我们就不考虑 他这个只要网页的标签关闭了 在当前标签就自动清除了存储. 在工作中 我们用 ...
- c# redis hashid如何设置过期时间_Redis数据库实现原理(划重点)
Redis服务器将所有数据库都保存在服务器状态redis.h/redisServer结构的db数组中,db数组的每一项都是一个redis.h/redisDb结构,每个redisDb结构代表一个数据库, ...
- Redis 笔记(03)— string类型(设置key、获取key、设置过期时间、批量设置获取key、对key进行加减、对key值进行追加、获取value子串)
字符串 string 是 Redis 最简单的数据结构.Redis 所有的数据结构都是以唯一的 key 字符串作为名称,然后通过这个唯一 key 值来获取相应的 value 数据.不同类型的数据结构的 ...
- c# redis 如何设置过期时间_Redis Hash存储token、及设置过期时间
相信大家在很多业务场景都会遇到对数据设置过期时间,如安全认证token.短信验证码等.一般我们的解决有几种:存redis.存数据库.实时计算(如JWT),不管使用哪种方式,需求就是过期了对数据的清理. ...
最新文章
- python encoding报错_python用requests递归查询页面 报错 ChunkedEncodingError
- winhex使用经验
- 【附赠PPT】 KubeMeet 成都站回顾:让云原生应用交付和管理变得更简单
- php 打乱数组顺序_PHP实现大转盘抽奖算法
- 【Python】shutil内置模块复制和重命名文件
- c#如何实现excel导入到sqlserver,如何实现从sqlserver导出到excel中(详细)
- c#获取部分DRAW
- Windows平台调查网络程序的2个系统工具
- 关于一个正弦波程序表格生成器
- 痴情人, 浮生梦(上)
- 计算机基础技能培养,计算机基础技能培养大纲(非计算机专业).doc
- 矩阵微分常用公式整理
- php做seo优化,php做seo优化能力有哪些
- 隐函数存在定理1及求导公式_20160505
- resnet—吴恩达
- LVS+Keepalived之DR模式配置
- 如何购买云服务器----以华为云服务器为例
- MSSQLSERVER 2019修改数据库文件存放路径的简单实现
- 达梦物化视图概念及简单示例
- 在编写了一个c语言源程序c001.c,C习题及答案
热门文章
- Kernel: Do NOT use global variable as possible as you can 尽量不使用全局变量
- 计算机科学为什么重要,数学 – 为什么在计算机科学中有8和256个如此重要的数字?...
- 微软在线实验室启用谷歌的reCAPTCHA,我们又丢失了一个好东东
- js,jquery的数字型字符串变量比较大小
- socket编程—— 服务器遇到Broken Pipe崩溃
- javascript面向对象技术基础
- AS3改变显示对象亮度
- 阿里云Link Security为企业级区块链提供易用性安全解决方案
- 脱欧临近引民众忧心食品短缺 英“脱欧生存包”热卖
- windows 7系统安装与配置Tomcat服务器环境