如何為Redis中list中的項設置過期時間


Redis是一個偉大的工具,用來在內存中存儲列表是很合適的。

不過,如果你想要快速搜索列表,同時需要讓列表中每項都在一定時間后過期,應該怎么做呢?

首先,當然不能使用不同的類似的key存儲數據,然后使用keys命令來獲取所有類似key的數據。這樣的開銷是不可接受的。

Redis並沒有直接提供方法做這件事,但是這是可以做到的!雖然最后用的未必是Redis的List數據結構。

問題:

我想在cmdb數據采集中,為API 這里加上一個認證的功能,畢竟不能誰都可以隨便提交數據給我, 我就接收的所以還是需要一個認證的。

參考了 tornado 中的一個驗證方式。

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。所以,我們可以將每個時間段的數據放在一個集合中。然后對這個集合設置過期時間。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM