在大型分散式系統架構中,必須選擇適合的快取技術以應對高併發,實現系統相應的高效能,酷客多小程式經過慎重選型,選擇了採用基於騰訊雲服務的Redis彈性快取技術,結合Redis官方推薦的.NET驅動類庫Service.Stack.Redis,實現Redis彈性快取在系統中的應用。
現針對Redis在實際應用中需注意的要點,就如下幾個方面進行總結:
一、 應用注意事項
在企業級應用過程,任何技術的引入都需要考慮可能產生的各種影響,對於快取應用來說,首先需要考慮的是記憶體的佔用狀況。對於應用系統來說,記憶體是極其寶貴的資源,對於每一個儲存到Redis快取中的內容,都必須嚴格控制其內容的有效性和儲存期限,具體需要注意的事項如下:
- 1. 跟蹤所有儲存在Redis中的鍵
a) 使用合適的命名方法,可以簡化儲存項的管理。建議使用帶有業務意義的名稱,可以採用類似DotNet名稱空間的類似命名管理方式(可使用冒號來劃分鍵名,例如Product:Category 鍵名來儲存商品分類資料),這樣有助於快取資料的資料管理及後期資料的遷移,刪除等
b) 進行資料刪除時,需注意同時刪除掉相關聯無效的級聯資料
- 儘量控制鍵名的長度
a) 採用合適命名方式的同時,要控制鍵的名稱長度,快取資料量達到一定程度時,鍵(Key)所佔用的儲存空間也會是記憶體的一筆較大的開銷,因此需要嚴格控制鍵的長度。
- 選擇合適的資料結構
a) 可以使用list的情況下儘量用list代替set。如果你不需要使用set特性,List在使用更少記憶體的情況下可以提供比set更快的速度。
b) Sorted sets是及其昂貴的資料結構,不管是對記憶體的消耗還是基本操作時的開銷。如果只是需要一個儲存查詢記錄的場景,不在意排序這樣的屬性,那麼建議使用雜湊表結構來儲存。
二、 實際應用場景
對於在系統中實際對於Redis的使用,結合酷客多實際使用業務,可以考慮在如下幾個場景中
- 1. 取最新X條資料
a) 例如可以將 最新100條評論Id 放在Redis的List中
b) 使用LPUSH latest.comments<ID>命令,向list集合中插入資料
c) 插入完成後再用LTRIM latest.comments 0 100命令使其永遠只儲存最近100條
- 2. 排行榜應用
a) 取Top N操作 按照某個條件為權重,使用sorted set,將要排序的值設定成sorted set的score,將具體的資料設定成相應的value,每次只需要執行一條ZADD命令即可。
- 3. 佇列系統 使用
d) 使用list可以構建佇列,使用SortSet可構建有優先順序要求的佇列
- 4. 資料快取
e) 最基本的應用,其總體效能優於Memcached,資料結構更加豐富實用
- 5. 需要精準設定過期時間
a) Sorted set的score設計成過期時間戳,通過過期時間排序定期清理資料,或根據此依據定期清理資料庫中過期資料(官網推薦的使用場景之一,感覺應用方式不太好,不推薦)
- 6. Pub/Sub構建實時訊息系統
f) Redis的Pub/Sub系統可以構建實時的訊息系統,比如很多用Pub/Sub構建的實時聊天系統的例子(網上推薦,暫未用到)
三、 Redis過期策略注意
Rdis自身的過期策略為兩種結合使用:
- 惰性刪除
a) 進行 get 或setnx 時,先檢查key是否過期,若過期,則刪除key,並執行相關操作
b) 若沒過期,直接執行相關操作
- 定期刪除
定期迴圈 隨機查是否過期,查到後,刪除
當進行命令操作Redis快取的資料時,需注意操作命令對Redis中資料的的過期時間的影響,簡單概括如下:
- 當key被DEL命令刪除或者被SET、GETSET命令重置後與之關聯的過期時間會被清除
- 從概念上更新了儲存在key中的值而沒有用全新的值替換key原有值的所有操作都不會影響在該key上設定的過期時間(例如使用INCR命令增加key的值或者通過LPUSH命令在list中增加一個新的元素或者使用HSET命令更新hash欄位的值 都不會清空原來的過期時間設定)
- 可通過PERSIST命令清除已設定的過期時間重新將key變為持久的
- 若key被RENAME命令重新命名則與之關聯的過期時間將傳遞到新名稱的key,若key被RENAME命令重寫,比如本存在名為mykey_a和mykey_b的key一個RENAME mykey_b mykey_a命令將mykey_b重新命名為本已存在的mykey_a那麼無論mykey_a原來的設定如何都將繼承mykey_b的所有特性,包括過期時間設定。
關於過期時間:
Redis2.4中expire精度不高,通常在0到1秒間,Redis2.6以後expire精度可以控制在0到1毫秒內
作者:酷客多小程式 徐冰