文檔地址
列表類型有兩個(gè)特點(diǎn):
第一庐船、列表中的元素是有序的,這就意味著可以
通過(guò)索引下標(biāo)獲取某個(gè)元素或者某個(gè)范圍內(nèi)的元素列表。
第二躲胳、列表中的元素可以是重復(fù)的,
內(nèi)部編碼
列表類型的內(nèi)部編碼有兩種纤勒。
ziplist(壓縮列表):
當(dāng)列表的元素個(gè)數(shù)小于list-max-ziplist-entries配置
(默認(rèn)512個(gè))坯苹,同時(shí)列表中每個(gè)元素的值都小于list-max-ziplist-value配置時(shí)
(默認(rèn)64字節(jié)),Redis會(huì)選用ziplist來(lái)作為列表的內(nèi)部實(shí)現(xiàn)來(lái)減少內(nèi)存的使
用摇天。linkedlist(鏈表):當(dāng)列表類型無(wú)法滿足ziplist的條件時(shí)粹湃,Redis會(huì)使用
linkedlist作為列表的內(nèi)部實(shí)現(xiàn)恐仑。
使用說(shuō)明
1.消息隊(duì)列
生產(chǎn)者消費(fèi)者模式:
生產(chǎn)者生產(chǎn)消息放到隊(duì)列里,多個(gè)消費(fèi)者同時(shí)監(jiān)聽隊(duì)列为鳄,誰(shuí)先搶到消息誰(shuí)就會(huì)從隊(duì)列中取走消息裳仆;即對(duì)于每個(gè)消息只能被最多一個(gè)消費(fèi)者擁有;(lpush+brpop)
發(fā)布者訂閱者模式:
發(fā)布者生產(chǎn)消息放到隊(duì)列里孤钦,多個(gè)監(jiān)聽隊(duì)列的消費(fèi)者都會(huì)收到同一份消息歧斟;即正常情況下每個(gè)消費(fèi)者收到的消息應(yīng)該都是一樣的;(Subscribe)
Redis的lpush+brpop命令組合即可實(shí)現(xiàn)阻塞隊(duì)列偏形,生產(chǎn)者客戶端使用lrpush從列表左側(cè)插入元素静袖,多個(gè)消費(fèi)者客戶端使用brpop命令阻塞式的“搶”列表尾部的元素,多個(gè)客戶端保證了消費(fèi)的負(fù)載均衡和高可用性俊扭。
2.文章列表
每個(gè)用戶有屬于自己的文章列表队橙,現(xiàn)需要分頁(yè)展示文章列表。此時(shí)可以
考慮使用列表萨惑,因?yàn)榱斜聿坏怯行虻木杩担瑫r(shí)支持按照索引范圍獲取元素。
設(shè)計(jì)方式:
對(duì)于文章的內(nèi)容可以使用哈希去存儲(chǔ)咒钟,一個(gè)用戶可以使用一個(gè)列表保存
使用
使用lrange取文章的列表
問(wèn)題
如果每次分頁(yè)獲取的文章個(gè)數(shù)較多吹由,需要執(zhí)行多次hgetall操作,此時(shí)可以考慮使用
Pipeline批量獲取朱嘴,或者考慮將文章數(shù)據(jù)序列化為字符串類
型倾鲫,使用mget批量獲取。分頁(yè)獲取文章列表時(shí)萍嬉,lrange命令在列表兩
端性能較好乌昔,但是如果列表較大,獲取列表中間范圍的元素性能會(huì)變差壤追,此
時(shí)可以考慮將列表做二級(jí)拆分磕道,或者使用Redis3.2的quicklist內(nèi)部編碼實(shí)現(xiàn),
它結(jié)合ziplist和linkedlist的特點(diǎn)行冰,獲取列表中間范圍的元素時(shí)也可以高效完
成溺蕉。
使用總結(jié)
- lpush+lpop=Stack(棧)
- lpush+rpop=Queue(隊(duì)列)
- lpsh+ltrim=Capped Collection(有限集合)
- lpush+brpop=Message Queue(消息隊(duì)列)