Redis是一个伟大的工具,用来在内存中存储列表是很合适的.
不过,如果你想要快速搜索列表,同时需要让列表中每项都在一定时间后过期,应该怎么做呢?
首先,当然不能使用不同的类似的key存储数据,然后使用keys命令来获取所有类似key的数据.这样的开销是不可接受的.
Redis并没有直接提供方法做这件事,但是这是可以做到的!虽然最后用的未必是Redis的List数据结构.
我想在cmdb数据采集中,为API 这里加上一个认证的功能,毕竟不能谁都可以随便提交数据给我, 我就接收的所以还是需要一个认证的.
参考了 tornado 中的一个验证方式.
然后我在网上找到这篇文章,它描述了两种办法.
Redis的集合:"无序的字符串集合",它的项有下面的特点
唯一的(如果加入重复的数据,redis会默默的拒绝)
无序,并且不可以用任何方法(在redis中)排序
Redis有序集合:"有序的字符串集合",它的项有下面的特点:
和集合一样,每个项都是唯一的
拥有积分(项的积分并不必须是唯一的)
根据积分排序(有索引)
① 有序集合
查询有序集合是非常快的,因为redis将一个列表转换成了集合,所以当我们访问它的时候,它已经是排好序的了.
根据Redis文档的描述:
当然,你不可以对有序集合中每个项设置过期时间.
你可以通过score对有序集合进行查询,我们可以利用这个地方来形成一个解决方案: (其中scroe指的就是该有序集合成员的次序.默认从小到大.)
对于加入到有序集合的每个项,我们都将它的score设置为 Unix Timestamp,这个timestamp代表它的过期时间.然后,我们加入一个定时任务,定时移除那些过期的数据.
这个方案使用普通的集合.
因为不能对集合中每项都设置TTL,但是可以对整个集合设置TTL.所以,我们可以将每个时间段的数据放在一个集合中.然后对这个集合设置过期时间.
Redis Expire 命令用于设置 key 的过期时间,key 过期后将不再可用.单位以秒计.
redis Expire 命令基本语法如下:
redis 12⑦0.0.1:6379> Expire KEY_NAME TIME_IN_SECONDS
>= 1.0.0
首先创建一个 key 并赋值:
redis 12⑦0.0.1:6379> SET runooobkey redis OK
为 key 设置过期时间:
redis 12⑦0.0.1:6379> EXPIRE runooobkey 60 (integer) 1
以上实例中我们为键 runooobkey 设置了过期时间为 1 分钟,1分钟后该键会自动删除.