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有序集合:“有序的字符串集合“,它的项有下面的特色:
1. 有序集合
查询有序集合是很是快的,由于redis将一个列表转换成了集合,因此当咱们访问它的时候,它已是排好序的了。
根据Redis文档的描述:
“排序集是经过一个双端口数据结构实现的,其中包含一个跳跃列表和一个哈希表,因此每次咱们添加一个元素Redis都会执行一个O(log(N))操做。这很好,但当咱们要求排序后的元素时Redis根本不须要作任何工做,它已经排好序了“
固然,你不能够对有序集合中每一个项设置过时时间。
你能够经过score
对有序集合进行查询,咱们能够利用这个地方来造成一个解决方案: (其中scroe指的就是该有序集合成员的次序。默认从小到大。)
对于加入到有序集合的每一个项,咱们都将它的score设置为 Unix Timestamp,这个timestamp表明它的过时时间。而后,咱们加入一个定时任务,定时移除那些过时的数据。
2. 多个集合以及过时时间
这个方案使用普通的集合。
由于不能对集合中每项都设置TTL,可是能够对整个集合设置TTL。因此,咱们能够将每一个时间段的数据放在一个集合中。而后对这个集合设置过时时间。