如何爲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。因此,咱們能夠將每一個時間段的數據放在一個集合中。而後對這個集合設置過時時間。

相關文章
相關標籤/搜索