Key名稱
- Key名稱的使用規范如下:
使(shi)用(yong)統一(yi)的命名規范。
一般使用(yong)業務名(ming)(ming)(或數據庫名(ming)(ming))為前(qian)綴,用(yong)冒號分隔(ge),例如,業務名(ming)(ming):表名(ming)(ming):id。
控制key名稱的長度。
在保證(zheng)語義清晰的情況下,盡量(liang)減少Key的長度(du)。有些(xie)常用單詞可使(shi)用縮寫(xie),例如,user縮寫(xie)為u,messages縮寫(xie)為msg。
名稱(cheng)中不(bu)要(yao)包含特殊字(zi)符。
Value值
- Value值的使用規范如下:
要避免大Key。
大(da)Key會帶來網卡流量風(feng)暴和(he)慢查詢,一般string類型控制(zhi)在10KB以(yi)內,hash、list、set、zset元素個數不要超過5000。
選擇(ze)合適(shi)的數據類(lei)型(xing)。
比如存(cun)儲用戶(hu)的信息,可用使用多個(ge)key,使用set u:1:name "X"、set u:1:age 20這樣(yang)存(cun)儲,也可以使用hash數據結構,存(cun)儲成1個(ge)key,設置用戶(hu)屬性時使用hmset一(yi)次設置多個(ge),同時這樣(yang)存(cun)儲也能節省內(nei)存(cun)。
設置合理的過期時間。
最(zui)好是(shi)過(guo)期時間打散,不(bu)要集中在某個時間點過(guo)期。
Redis命令
- Redis命令的常用規范如下:
時間(jian)復雜度為O(N)的命令,需要(yao)特別注意N的值(zhi)。
例如:hgetall、lrange、smembers、zrange、sinter這(zhe)些(xie)命令(ling)都是做全集操作,如果元(yuan)素很多,是很耗性能的(de)。可使用hscan、sscan、zscan這(zhe)些(xie)分批(pi)掃描的(de)命令(ling)替代。
命(ming)令禁用,使(shi)用前,請(qing)參考Redis命(ming)令兼(jian)容性(xing)和(he)WebCli命(ming)令兼(jian)容性(xing)。
慎重使用select。
Redis多(duo)數據庫(ku)支持較弱,多(duo)業務(wu)用(yong)多(duo)數據庫(ku)實際還是(shi)單線程處理,會有干擾(rao)。最好是(shi)拆分使用(yong)多(duo)個Redis。天翼云集群(qun)實例不支持多(duo)DB。
如果有批(pi)量(liang)操作,可(ke)使用mget、mset或pipeline,提(ti)高效(xiao)率,但要注(zhu)意控(kong)制一次批(pi)量(liang)操作的元素個數。
- mget、mset和pipeline的區別如下:
mget和mset是原(yuan)子操作(zuo),pipeline是非原(yuan)子操作(zuo)。
pipeline可以打包不同的(de)命(ming)令,mget和mset做(zuo)不到。
使(shi)用pipeline,需要客戶端和(he)服務端同時支(zhi)持(chi)。
lua腳本(ben)的執行超時時間(jian)為(wei)5秒鐘,建議不要在lua腳本(ben)中使用比(bi)(bi)較耗(hao)時的代碼(ma),比(bi)(bi)如長(chang)時間(jian)的sleep、大的循環等語句。
調用lua腳本時,建議不(bu)要(yao)使用隨機函數(shu)去指定key,否則(ze)在主(zhu)備(bei)節點上執行結果不(bu)一(yi)致(zhi),從而(er)導致(zhi)主(zhu)備(bei)節點數(shu)據不(bu)一(yi)致(zhi)。
- 集群實例使用lua有如下限制:
使用(yong)EVAL和EVALSHA命(ming)令時,命(ming)令參數中必須帶有(you)至少1個key,否則客戶(hu)端會提示(shi)“ERR eval/evalsha numkeys must be bigger than zero in redis cluster mode”的錯誤。
使用EVAL和EVALSHA命令時(shi),DCS Redis集群實(shi)例使用第一個(ge)key來計算slot,用戶(hu)代碼需(xu)要保證(zheng)操作的(de)key是在(zai)同一個(ge)slot。
其他
建(jian)議(yi)使用連(lian)接(jie)(jie)池(chi)+長(chang)連(lian)接(jie)(jie),可以有(you)效控制連(lian)接(jie)(jie),同時提高效率。
合理(li)設置maxmemory-policy(最大(da)內存淘汰策略)。
noeviction:在這種策略下,如(ru)果(guo)緩(huan)存達(da)(da)到了配(pei)置的上限(xian),實(shi)(shi)例將不再處理(li)客(ke)戶端任(ren)何增加緩(huan)存數據(ju)的請(qing)求(qiu),比如(ru)寫(xie)命令(ling),實(shi)(shi)例直接返回錯(cuo)誤給客(ke)戶端。緩(huan)存達(da)(da)到上限(xian)后,實(shi)(shi)例只處理(li)刪除和少數幾(ji)個例外請(qing)求(qiu)。
allkeys-lru:根據LRU(Least recently used,最(zui)近最(zui)少使用(yong))算法嘗試回收最(zui)少使用(yong)的鍵(jian),使得新添加的數據有空間存放。
volatile-lru:根據LRU(Least recently used,最近最少使用(yong))算法嘗試回收最少使用(yong)的(de)鍵(jian),但僅限于在過期集(ji)合的(de)鍵(jian),使得新添加的(de)數據有空間(jian)存放。
allkeys-random:回收(shou)隨機的(de)鍵使得新添加的(de)數(shu)據(ju)有空間存放。
volatile-random:回(hui)收隨機的鍵使(shi)得新添(tian)加的數據有空間存放,但僅限于在過(guo)期集合的鍵。
volatile-ttl:回(hui)收(shou)在過期(qi)集合的(de)鍵,并且優先回(hui)收(shou)存活(huo)時間(TTL)較(jiao)短的(de)鍵,使得新(xin)添加的(de)數據有空(kong)間存放。
allkeys-lfu:從所有鍵中驅逐最不常用的(de)鍵。
volatile-lfu:從(cong)具有“expire”字段集的所有鍵中驅逐最(zui)不常用的鍵。
刪除大(da)Key時,不要直接使(shi)用del命令(ling)。
如果是Hash類型的大Key,推(tui)薦使用hscan + hdel
如果是(shi)List類型(xing)的大Key,推薦使用(yong)ltrim
如果是Set類(lei)型的(de)大(da)Key,推(tui)薦(jian)使用sscan + srem
如果是SortedSet類型的大Key,推薦使用(yong)zscan + zrem
使用Pipeline時(shi),建議不要一次太多命令,集群(qun)最(zui)大(da)1024。