緩存設計
設計Key的注意事項
注意以下幾點
簡單、簡潔、可讀、無特殊符號、分組。
簡單:不要過長,太長會占更多內存
簡潔:清晰明了、不拖泥帶水
可讀:可讀性良好,知道是什么
不使用特殊符號:不要用空格、引號或其他轉移符號。
key分組:防止在公共redis里key沖突。
Value值的注意事項
類型選擇
可能很多童鞋還在想著Redis只有5種數據類型,但是實際上現在明面上已經大致有八種數據類型。
Redis支持多種數據類型:字符串、散列表、列表、集合、有序集合、位圖、hyperloglogs、地理空間,我們要結合業務需求合理的選擇。
壓縮
如果使用String類型,Value內容過大,需要考慮進行壓縮、序列化(尤其使用json序列化后存儲,需要進行壓縮)。
Cache 批量執行
批量執行
批量執行主要有mset、mget和pipeline,這幾個基本上我們用哪個都可以提升我們的執行效率。
需要考慮兩種批量最大的區別,mget、mset是原生的命令,是原子的。而pipeline是管道,在管道上發送多個指令,是非原子的。
除此之外pipeline可以組合不同的命令,mget、mset則不行。
禁用命令
keys、flushall、flushdb等指令,我們直接在中間件層面進行攔截,終止。
內存回收
Redis自帶了很多內存回收策略。為了保證內存的可用,我們可以根據業務場景選擇不同的內存策略。
- noeviction:當內存達到閾值,申請內存操作會跑錯。
- allkeys-lru:在所有key上采用lru算法進行刪除回收內存。
- volatile-lru:在設置了expire的key上采用lru算法進行刪除回收內存。
- allkeys-random:在所有key中進行隨機刪除回收內存。
- volatile-random:在設置了expire的key上隨機進行刪除回收內存。
- volatile-ttl:在設置了expire的可以上搜索,找到具有更早過期時間的key優先刪除,回收內存。
內存碎片
內存碎片
Redis長期運行后,會出現一定程度的內存碎片,導致內存還有,但是內存不夠用了,這時候我們就需要做一些調優,尤其是對內存碎片的調優。
Redis4開始支持內存碎片清理功能,兩種方式:
支持在運行期進行自動內存碎片清理 (config set activedefrag yes)
支持通過命令 memory purge 進行清理(與自動清理區域不同)
過期時間
我們不能把Redis完全的當做DB使用,因為其使用的是內存,如果數據只添加不整理,那么很容易導致內存不夠,所以我們需要對數
設置過期時間,如果是熱點數據我們時間可以設置長一些,但是沒有永遠的熱點,所以不建議設置永久。
并發安全
并發安全
原子性
Redis自身提供了Watch,以及一些原子的加減指令,有時候已經夠用了,但是如果遇到多個key組成一個原子的操作,我們需要采用Lua來實現,提交lua腳本到服務端,保證操作是原子的。
熔斷降級
我們可以對客戶端做熔斷降級,比如訪問Redis超時,那么可以啟用熔斷,當前請求的后續其他Redis請求,都直接返回,不走redis
防止因為過度的超時,直接拖垮當前服務,甚至拖垮整個服務??梢钥紤]hystrix或sentinel,也可以自己通過滑動窗口統計實現一個簡單的斷路器。
密碼
推薦使用密碼,這樣可以保證一定程度的安全。
當然最好是可以有一個密碼管理服務,可以管理DB、Redis等數據源的密碼,可以通過一個token來獲取密碼,而不是直接配置明文密碼。