
緩存設(shè)計(jì)
設(shè)計(jì)Key的注意事項(xiàng)
注意以下幾點(diǎn)
簡單、簡潔、可讀、無特殊符號、分組。
簡單:不要過長,太長會占更多內(nèi)存
簡潔:清晰明了、不拖泥帶水
可讀:可讀性良好,知道是什么
不使用特殊符號:不要用空格、引號或其他轉(zhuǎn)移符號。
key分組:防止在公共redis里key沖突。
Value值的注意事項(xiàng)
類型選擇
可能很多童鞋還在想著Redis只有5種數(shù)據(jù)類型,但是實(shí)際上現(xiàn)在明面上已經(jīng)大致有八種數(shù)據(jù)類型。
Redis支持多種數(shù)據(jù)類型:字符串、散列表、列表、集合、有序集合、位圖、hyperloglogs、地理空間,我們要結(jié)合業(yè)務(wù)需求合理的選擇。
壓縮
如果使用String類型,Value內(nèi)容過大,需要考慮進(jìn)行壓縮、序列化(尤其使用json序列化后存儲,需要進(jìn)行壓縮)。

Cache 批量執(zhí)行
批量執(zhí)行
批量執(zhí)行主要有mset、mget和pipeline,這幾個基本上我們用哪個都可以提升我們的執(zhí)行效率。
需要考慮兩種批量最大的區(qū)別,mget、mset是原生的命令,是原子的。而pipeline是管道,在管道上發(fā)送多個指令,是非原子的。
除此之外pipeline可以組合不同的命令,mget、mset則不行。
禁用命令
keys、flushall、flushdb等指令,我們直接在中間件層面進(jìn)行攔截,終止。
內(nèi)存回收
Redis自帶了很多內(nèi)存回收策略。為了保證內(nèi)存的可用,我們可以根據(jù)業(yè)務(wù)場景選擇不同的內(nèi)存策略。
- noeviction:當(dāng)內(nèi)存達(dá)到閾值,申請內(nèi)存操作會跑錯。
- allkeys-lru:在所有key上采用lru算法進(jìn)行刪除回收內(nèi)存。
- volatile-lru:在設(shè)置了expire的key上采用lru算法進(jìn)行刪除回收內(nèi)存。
- allkeys-random:在所有key中進(jìn)行隨機(jī)刪除回收內(nèi)存。
- volatile-random:在設(shè)置了expire的key上隨機(jī)進(jìn)行刪除回收內(nèi)存。
- volatile-ttl:在設(shè)置了expire的可以上搜索,找到具有更早過期時(shí)間的key優(yōu)先刪除,回收內(nèi)存。

內(nèi)存碎片
內(nèi)存碎片
Redis長期運(yùn)行后,會出現(xiàn)一定程度的內(nèi)存碎片,導(dǎo)致內(nèi)存還有,但是內(nèi)存不夠用了,這時(shí)候我們就需要做一些調(diào)優(yōu),尤其是對內(nèi)存碎片的調(diào)優(yōu)。
Redis4開始支持內(nèi)存碎片清理功能,兩種方式:
支持在運(yùn)行期進(jìn)行自動內(nèi)存碎片清理 (config set activedefrag yes)
支持通過命令 memory purge 進(jìn)行清理(與自動清理區(qū)域不同)
過期時(shí)間
我們不能把Redis完全的當(dāng)做DB使用,因?yàn)槠涫褂玫氖莾?nèi)存,如果數(shù)據(jù)只添加不整理,那么很容易導(dǎo)致內(nèi)存不夠,所以我們需要對數(shù)
設(shè)置過期時(shí)間,如果是熱點(diǎn)數(shù)據(jù)我們時(shí)間可以設(shè)置長一些,但是沒有永遠(yuǎn)的熱點(diǎn),所以不建議設(shè)置永久。

并發(fā)安全
并發(fā)安全
原子性
Redis自身提供了Watch,以及一些原子的加減指令,有時(shí)候已經(jīng)夠用了,但是如果遇到多個key組成一個原子的操作,我們需要采用Lua來實(shí)現(xiàn),提交lua腳本到服務(wù)端,保證操作是原子的。
熔斷降級
我們可以對客戶端做熔斷降級,比如訪問Redis超時(shí),那么可以啟用熔斷,當(dāng)前請求的后續(xù)其他Redis請求,都直接返回,不走redis
防止因?yàn)檫^度的超時(shí),直接拖垮當(dāng)前服務(wù),甚至拖垮整個服務(wù)。可以考慮hystrix或sentinel,也可以自己通過滑動窗口統(tǒng)計(jì)實(shí)現(xiàn)一個簡單的斷路器。
密碼
推薦使用密碼,這樣可以保證一定程度的安全。
當(dāng)然最好是可以有一個密碼管理服務(wù),可以管理DB、Redis等數(shù)據(jù)源的密碼,可以通過一個token來獲取密碼,而不是直接配置明文密碼。