如何为Redis中list中的项设置过时时间

Redis是一个伟大的工具,用来在内存中存储列表是很合适的。redis

不过,若是你想要快速搜索列表,同时须要让列表中每项都在必定时间后过时,应该怎么作呢?服务器

首先,固然不能使用不一样的相似的key存储数据,而后使用keys命令来获取全部相似key的数据。这样的开销是不可接受的。数据结构

Redis并无直接提供方法作这件事,可是这是能够作到的!虽然最后用的未必是Redis的List数据结构。工具

问题:

我想在cmdb数据采集中,为API 这里加上一个认证的功能,毕竟不能谁均可以随便提交数据给我, 我就接收的因此仍是须要一个认证的。ui

参考了 tonadou 中的一个验证方式。加密

1. 服务端 于 客户端共同维护同一个key。  客户端在发送数据过来时要携带token。 这个token 由这个key + 客户端的当前时间,MD5加密以后的字符串, 和 客户端的当前时间的时间戳组成。spa

2. 服务端 除了维护key意外,另外维护一个 过时时间。 好比是10秒钟。 当客户端token过来后。code

  1)取出token中的 客户端的时间戳,减去过时时间10秒,  于服务器端的当前时间作对比。  若是客户端的这个时间 比服务端当前时间减去10秒后,还要小的话。 那就说明这个时间过久远了直接不许连接。blog

  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。因此,咱们能够将每一个时间段的数据放在一个集合中。而后对这个集合设置过时时间。

相关文章
相关标签/搜索