Redis和DelayQueue設計具有過期時間的快取
1、場景:
有一款APP,使用者登陸後。會將使用者的使用者號,手機號、以及裝置號等上報給後臺的清洗程式(這裡裝置號是唯一的)。後臺因為需要根據這三個做一定的運算。所以希望對於每一個訪客-使用者關係進行快取,並只快取10分鐘,並且快取使用redis。注意,是每一條記錄都只快取10分鐘。而不是一批記錄!
2、解決方案
1、在redis裡有個函式,hset(String key,String field ,String value),也有對應的hexpire(String key,int second),但是這裡如果以裝置號為key的話,
field和value要怎麼設定??因為快取進去後,因為我們取的時候是不知道裝置號的,只能說一條記錄10分鐘到了,就應該從redis取出來。並刪除redis的記錄。
這裡筆者還注意到有另一個函式,刪除函式為hdel(String key,String ..fields).如果將裝置號放到hset的field 欄位,key為一個固定的字串。但是還是那一個問題
怎麼知道有一個裝置號已快取10分鐘了?反覆思考,想到Java的一個類,叫DelayQueue。就是它。
DelayQueue是一個支援延時獲取元素的無界阻塞佇列。佇列使用PriorityQueue來實現。佇列中的元素必須實現Delayed介面,在建立元素時可以指定多久才能從佇列中獲取當前元素。只有在延遲期滿時才能從佇列中提取元素。我們可以將DelayQueue運用在以下應用場景:
其主要有以下兩種使用場景:
快取系統的設計:可以用DelayQueue儲存快取元素的有效期,使用一個執行緒迴圈查詢DelayQueue,一旦能從DelayQueue中獲取元素時,表示快取有效期到了。
定時任務排程。使用DelayQueue儲存當天將會執行的任務和執行時間,一旦從DelayQueue中獲取到任務就開始執行,從比如TimerQueue就是使用DelayQueue實現的。
注:
hset
描述:將雜湊表key中的域field的值設為value。如果key不存在,一個新的雜湊表被建立並進行HSET操作。如果域field已經存在於雜湊表中,舊值將被覆蓋。
引數:key field value
返回值:如果field是雜湊表中的一個新建域,並且值設定成功,返回1。如果雜湊表中域field已經存在且舊值已被新值覆蓋,返回0。
hdel
描述:刪除指定的field
引數:key field:
3、編碼設計
上面的方案還要注意一點,進行快取操作和刪除快取操作應該要在不同的執行緒。
這是strom的版本:
(1)延遲佇列設計
(2)初始化函式
這裡prepare在整個strom工程起來之後,只會執行一次,而execute只要會資料會一直不斷執行。
然後是進行快取操作:
刪除訪客記錄的執行緒:
相關文章
- redis設定過期時間Redis
- 優雅的快取解決方案--設定過期時間快取
- redis 過期時間Redis
- localstorage實現帶過期時間的快取功能快取
- redis 設定過期時間,以資料夾形式展示key顯示快取資料Redis快取
- redis hset hmset過期時間Redis
- JavaScript獲取cookie過期時間JavaScriptCookie
- 在IDEAL下執行測試Memcached快取資料功能的時候,快取時間過期之坑Idea快取
- 如何正確的評估redis過期時間Redis
- localStorage設定過期時間
- Redis 過期時間與記憶體管理Redis記憶體
- [ASP.NET] 如果將快取“滑動過期時間”設定為1秒會怎樣?ASP.NET快取
- JavaScript 設定cookie 過期時間JavaScriptCookie
- 設定phpsession過期時間PHPSession
- Redis快取使用技巧和設計方案,有必要看看Redis快取
- 億級系統的Redis快取如何設計???Redis快取
- 直播間原始碼,透過Redis實現資料快取原始碼Redis快取
- 倒數計時快取時間問題總結快取
- Redis快取穿透和雪崩Redis快取穿透
- 請問laraveld的redis中有$redis->expires(key,過期時間)這個方法嗎LaravelRedis
- JavaScript 設定Cookie過期時間無效JavaScriptCookie
- C#如何設定session過期時間C#Session
- 通過offsets.retention.minutes設定kafkaoffset的過期時間Kafka
- 設定有過期時間的廣告程式碼例項
- httpsession過期時間HTTPSession
- 如何優雅的設計和使用快取?快取
- spring-redis SortedSet型別成員的過期時間處理SpringRedis型別
- C# 給PDF文件設定過期時間C#
- 如何給localStorage設定一個過期時間?
- 關於 session 未到設定的過期時間就過期的問題(分享坑點)Session
- 面試官:RabbitMQ過期時間設定、死信佇列、延時佇列怎麼設計?面試MQ佇列
- Redis 快取雪崩,快取擊穿和快取穿透技術方案總結Redis快取穿透
- 對於Redis中設定了過期時間的Key,你需要知道這些內容Redis
- 二次封裝的快取框架wCache(支援快取時間、預設值)--微信小程式封裝快取框架微信小程式
- 檢視Cookie過期時間Cookie
- Redis的快取穿透、快取雪崩、快取擊穿的區別Redis快取穿透
- Redis快取擊穿、快取穿透、快取雪崩Redis快取穿透
- [Redis]快取穿透/快取擊穿/快取雪崩Redis快取穿透