[toc]
redis
數(shù)據(jù)結(jié)構(gòu)
image.png
字符串
- setnx可以作為分布式鎖的實現(xiàn)方法傻工;
- 內(nèi)部編碼
字符串類型的內(nèi)部編碼有3種:
·int:8個字節(jié)的長整型顷链。
·embstr:小于等于39個字節(jié)的字符串。
·raw:大于39個字節(jié)的字符串秘血。
Redis會根據(jù)當(dāng)前值的類型和長度決定使用哪種內(nèi)部編碼實現(xiàn)。
哈希表
- 內(nèi)部編碼
- ziplist
- hashtable
當(dāng)field個數(shù)比較少且沒有大的value時夭织,內(nèi)部編碼為ziplist:
當(dāng)有value大于64字節(jié)吃环,內(nèi)部編碼會由ziplist變?yōu)閔ashtable:
當(dāng)field個數(shù)超過512,內(nèi)部編碼也會由ziplist變?yōu)閔ashtable:
-
ziplist
image.png
- 場景
- 復(fù)雜api頻控
列表
- 內(nèi)部編碼
- ziplist
- linkedlist
當(dāng)元素個數(shù)較少且沒有大元素時伊滋,內(nèi)部編碼為ziplist
當(dāng)元素個數(shù)超過512個跛璧,內(nèi)部編碼變?yōu)閘inkedlist:
或者當(dāng)某個元素超過64字節(jié),內(nèi)部編碼也會變?yōu)閘inkedlist:
- 場景
- lpush+lpop=Stack(棧)
- lpush+rpop=Queue(隊列)
- lpsh+ltrim=Capped Collection(有限集合)
- lpush+brpop=Message Queue(消息隊列)
集合
- 內(nèi)部編碼
- intset
- hashtable
當(dāng)元素個數(shù)較少且都為整數(shù)時新啼,內(nèi)部編碼為intset:
當(dāng)元素個數(shù)超過512個,內(nèi)部編碼變?yōu)閔ashtable:
當(dāng)某個元素不為整數(shù)時刹碾,內(nèi)部編碼也會變?yōu)閔ashtable:
- 場景
- 用戶標(biāo)簽
- spop/srandmember=Random item(生成隨機(jī)數(shù)燥撞,比如抽獎)
- sadd+sinter=Social Graph(社交需求)
有序集合
- 內(nèi)部編碼
ziplist
skiplist
當(dāng)元素個數(shù)較少且每個元素較小時,內(nèi)部編碼為ziplist:
當(dāng)元素個數(shù)超過128個迷帜,內(nèi)部編碼變?yōu)閟kiplist:
當(dāng)某個元素大于64字節(jié)時物舒,內(nèi)部編碼也會變?yōu)閔ashtable:
-
skiplist
image.png
- 場景
- 排行榜
其他
- 純內(nèi)存存儲、IO多路復(fù)用技術(shù)戏锹、單線程架構(gòu)是造就Redis高性能的三個因素
- 由于Redis的單線程架構(gòu)冠胯,所以需要每個命令能被快速執(zhí)行完,否則會存在阻塞Redis的可能锦针,理解Redis單線程命令處理機(jī)制是開發(fā)和運維Redis的核心之一荠察。
- move置蜀、dump+restore、migrate是Redis發(fā)展過程中三種遷移鍵的方式悉盆,其中move命令基本廢棄盯荤,migrate命令用原子性的方式實現(xiàn)了dump+restore,并且支持批量操作焕盟,是Redis Cluster實現(xiàn)水平擴(kuò)容的重要工具秋秤。
- scan命令可以解決keys命令可能帶來的阻塞問題,同時Redis還提供了hscan脚翘、sscan灼卢、zscan漸進(jìn)式地遍歷hash、set来农、zset鞋真。