作者:張豐哲鏈接:http://www.reibang.com/p/af7043e6c8f9來(lái)源:簡(jiǎn)書(shū)
Redis基礎(chǔ)類(lèi)型回顧
? ??????String:string是最簡(jiǎn)單的類(lèi)型,一個(gè)key對(duì)應(yīng)一個(gè)value滔金。string類(lèi)型是二進(jìn)制安全的,意思是redis的string可以包含任何數(shù)據(jù)惫周,比如jpg圖片或者序列化的對(duì)象。從內(nèi)部實(shí)現(xiàn)來(lái)看其實(shí)string可以看作byte數(shù)組康栈,最大上限是1G字節(jié)递递。Redis中最基本,也是最簡(jiǎn)單的數(shù)據(jù)類(lèi)型啥么。注意登舞,VALUE既可以是簡(jiǎn)單的String,也可以是復(fù)雜的String悬荣,如JSON菠秒,在實(shí)際中常常利用fastjson將對(duì)象序列化后存儲(chǔ)到Redis中。另外注意mget批量獲取可以提高效率氯迂。
?string類(lèi)型的定義:struct sdshdr { long len; long free; char buf[]; };
? ? ? ? 1. len是buf數(shù)組的長(zhǎng)度践叠。
? ? ? ? 2. free是數(shù)組中剩余可用字節(jié)數(shù),由此可以理解為什么string類(lèi)型是二進(jìn)制安全的了嚼蚀,因?yàn)樗?b>本質(zhì)上就是個(gè)byte數(shù)組禁灼,當(dāng)然可以包含任何數(shù)據(jù)了
? ? ? ? 3. buf是個(gè)char數(shù)組用于存貯實(shí)際的字符串內(nèi)容,其實(shí)char和c#中的byte是等價(jià)的轿曙,都是一個(gè)字節(jié)弄捕。
????????另外string類(lèi)型可以被部分命令按int處理僻孝。比如incr等命令,如果只用string類(lèi)型守谓,redis就可以被看作加上持久化特性的memcached穿铆。
? ??????setnx:設(shè)置key對(duì)應(yīng)的值為string類(lèi)型的value。如果key已經(jīng)存在分飞,返回0悴务,nx是not exist的意思睹限。 例如我們添加一個(gè)name= HongWan_new的鍵值對(duì)譬猫。
???? ???setex:設(shè)置key對(duì)應(yīng)的值為string類(lèi)型的value,并指定此鍵值對(duì)應(yīng)的有效期羡疗。 例如我們添加一個(gè)haircolor= red的鍵值對(duì)染服,并指定它的有效期是10秒,可以這樣做:setex haircolor 10 red
????setrange:設(shè)置指定key的value值的子字符串叨恨。 例如我們希望將HongWan的126郵箱替換為gmail郵箱柳刮,那么我們可以這樣做:
????????redis 127.0.0.1:6379> get name "HongWan@126.com"?
????????redis 127.0.0.1:6379> setrange name 8 gmail.com (integer) 17?
????????redis 127.0.0.1:6379> get name "HongWan@gmail.com" redis 127.0.0.1:6379>
????????其中的8是指從下標(biāo)為8(包含8)的字符開(kāi)始替換
????msetnx:?一次設(shè)置多個(gè)key的值,成功返回ok表示所有的值都設(shè)置了痒钝,失敗返回0表示沒(méi)有任何值被設(shè)置串远,但是不會(huì)覆蓋已經(jīng)存在的key硕糊。
????getset:設(shè)置key的值,并返回key的舊值。
????getrange:獲取指定key的value值的子字符串却妨。
? ??????Hash:Redis hash是一個(gè)string類(lèi)型的field和value的映射表。它的添加豪娜、刪除操作都是O(1)(平均)跟畅。hash特別適合用于存儲(chǔ)對(duì)象。相較于將對(duì)象的每個(gè)字段存成單個(gè)string類(lèi)型晌块。將一個(gè)對(duì)象存儲(chǔ)在hash類(lèi)型中會(huì)占用更少的內(nèi)存爱沟,并且可以更方便的存取整個(gè)對(duì)象。省內(nèi)存的原因是新建一個(gè)hash對(duì)象時(shí)開(kāi)始是用zipmap(又稱(chēng)為small hash)來(lái)存儲(chǔ)的匆背。這個(gè)zipmap其實(shí)并不是hash table呼伸,但是zipmap相比正常的hash實(shí)現(xiàn)可以節(jié)省不少hash本身需要的一些元數(shù)據(jù)存儲(chǔ)開(kāi)銷(xiāo)。盡管zipmap的添加钝尸,刪除蜂大,查找都是O(n),但是由于一般對(duì)象的field數(shù)量都不太多蝶怔。所以使用zipmap也是很快的奶浦,也就是說(shuō)添加刪除平均還是O(1)。
????????如果field或者value的大小超出一定限制后踢星,Redis會(huì)在內(nèi)部自動(dòng)將zipmap替換成正常的hash實(shí)現(xiàn)澳叉。這個(gè)限制可以在配置文件中指定。
????????hash-max-zipmap-entries 64 #配置字段最多64個(gè)
????????hash-max-zipmap-value 512 #配置value最大為512字節(jié)
? ? ? ?Hash結(jié)構(gòu)可以使你像在數(shù)據(jù)庫(kù)中Update一個(gè)屬性一樣只修改某一項(xiàng)屬性值,而且還可以快速定位數(shù)據(jù)成洗。比如五督,如果我們把表User中的數(shù)據(jù)可以這樣放置到Redis中:Hash存儲(chǔ),KEY:User瓶殃,F(xiàn)ield:USERID充包,VALUE:user序列化后的string。
????????實(shí)際上遥椿,可以利用List的先進(jìn)先出或者先進(jìn)后出的特性維護(hù)一段列表基矮,比如排行榜、實(shí)時(shí)列表等冠场,甚至還可以簡(jiǎn)單的當(dāng)做消息隊(duì)列來(lái)使用家浇。
????hset:設(shè)置hash field為指定值,如果key不存在碴裙,則先創(chuàng)建钢悲。
? ??List:Redis的list類(lèi)型其實(shí)就是一個(gè)每個(gè)子元素都是string類(lèi)型的雙向鏈表。鏈表的最大長(zhǎng)度是(2的32次方)舔株。我們可以通過(guò)push莺琳,pop操作從鏈表的頭部或者尾部添加刪除元素。這使得list既可以用作棧载慈,也可以用作隊(duì)列惭等。
????????有意思的是list的pop操作還有阻塞版本的,當(dāng)我們[lr]pop一個(gè)list對(duì)象時(shí)娃肿,如果list是空咕缎,或者不存在,會(huì)立即返回nil料扰。但是阻塞版本的b[lr]pop則可以阻塞凭豪,當(dāng)然可以加超時(shí)時(shí)間,超時(shí)后也會(huì)返回nil晒杈。為什么要阻塞版本的pop呢嫂伞,主要是為了避免輪詢(xún)。舉個(gè)簡(jiǎn)單的例子如果我們用list來(lái)實(shí)現(xiàn)一個(gè)工作隊(duì)列拯钻。執(zhí)行任務(wù)的thread可以調(diào)用阻塞版本的pop去獲取任務(wù)這樣就可以避免輪詢(xún)?nèi)z查是否有任務(wù)存在帖努。當(dāng)任務(wù)來(lái)時(shí)候工作線程可以立即返回,也可以避免輪詢(xún)帶來(lái)的延遲粪般。
????????實(shí)際操作的方法吧:
? ?????linsert:在key對(duì)應(yīng)list的特定位置之前或之后添加字符串元素
? ? ? ? ? ? ? ?redis 127.0.0.1:6379> linsert mylist3 before "world" "there"
???????lset:設(shè)置list中指定下標(biāo)的元素值(下標(biāo)從0開(kāi)始)
? ? ? ?lrem:從key對(duì)應(yīng)list中刪除count個(gè)和value相同的元素拼余。 count>0時(shí),按從頭到尾的順序刪除亩歹,count<0時(shí)匙监,按從尾到頭的順序刪除凡橱。count=0時(shí),刪除全部亭姥。
? ? ? ltrim:保留指定key 的值范圍內(nèi)的數(shù)據(jù)
? ? ??rpoplpush:從第一個(gè)list的尾部移除元素并添加到第二個(gè)list的頭部稼钩,最后返回被移除的元素值,整個(gè)操作是原子的达罗。如果第一個(gè)list是空或者不存在返回nil坝撑。
????Set:set的是通過(guò)hash table實(shí)現(xiàn)的,所以添加粮揉、刪除和查找的復(fù)雜度都是O(1)巡李。hash table會(huì)隨著添加或者刪除自動(dòng)的調(diào)整大小。需要注意的是調(diào)整hash table大小時(shí)候需要同步(獲取寫(xiě)鎖)會(huì)阻塞其他讀寫(xiě)操作滔蝉,可能不久后就會(huì)改用跳表(skip list)來(lái)實(shí)現(xiàn)击儡,跳表已經(jīng)在sorted set中使用了塔沃。關(guān)于set集合類(lèi)型除了基本的添加刪除操作,其他有用的操作還包含集合的取并集(union)蛀柴,交集(intersection)螃概,差集(difference)。通過(guò)這些操作可以很容易的實(shí)現(xiàn)sns中的好友推薦和blog的tag功能鸽疾。
?????????Set是String類(lèi)型的不重復(fù)無(wú)序集合吊洼。Set的特點(diǎn)在于,它提供了集合的一些運(yùn)算制肮,比如交集冒窍、并集、差集等豺鼻。這些運(yùn)算特性综液,非常方便的解決實(shí)際場(chǎng)景中的一些問(wèn)題,如共同關(guān)注儒飒、共同粉絲等谬莹。????
? ??sadd:向名稱(chēng)為key的set中添加元素
? ??spop:隨機(jī)返回并刪除名稱(chēng)為key的set中一個(gè)元素
????sdiffstore:返回所有給定key與第一個(gè)key的差集,并將結(jié)果存為另一個(gè)key
? ??smove:從第一個(gè)key對(duì)應(yīng)的set中移除member并添加到第二個(gè)對(duì)應(yīng)set中
????????????redis 127.0.0.1:6379> smove myset2 myset7 three
????scard:返回名稱(chēng)為key的set的元素個(gè)數(shù)
? ??srandmember:隨機(jī)返回名稱(chēng)為key的set的一個(gè)元素桩了,但是不刪除元素
????ZSet:是set的一個(gè)升級(jí)版本附帽,它在set的基礎(chǔ)上增加了一個(gè)順序?qū)傩?/b>,這一屬性在添加修改元素的時(shí)候可以指定井誉,每次指定后蕉扮,zset會(huì)自動(dòng)重新按新的值調(diào)整順序】攀ィ可以理解為有兩列的mysql表喳钟,一列存value爪模,一列存順序。操作中key理解為zset的名字荚藻。和set一樣sorted set也是string類(lèi)型元素的集合屋灌,不同的是每個(gè)元素都會(huì)關(guān)聯(lián)一個(gè)double類(lèi)型的score。sorted set的實(shí)現(xiàn)是skip list和hash table的混合體应狱。
????????當(dāng)元素被添加到集合中時(shí)共郭,一個(gè)元素到score的映射被添加到hash table中,所以給定一個(gè)元素獲取score的開(kāi)銷(xiāo)是O(1)疾呻,另一個(gè)score到元素的映射被添加到skip list除嘹,并按照score排序,所以就可以有序的獲取集合中的元素岸蜗。添加尉咕,刪除操作開(kāi)銷(xiāo)都是O(log(N))和skip list的開(kāi)銷(xiāo)一致,redis的skip list實(shí)現(xiàn)用的是雙向鏈表璃岳,這樣就可以逆序從尾部取元素年缎。sorted set最經(jīng)常的使用方式應(yīng)該是作為索引來(lái)使用.我們可以把要排序的字段作為score存儲(chǔ),對(duì)象的id當(dāng)元素存儲(chǔ)铃慷。
? ??zadd:向名稱(chēng)為key的zset中添加元素member单芜,score用于排序。如果該元素已經(jīng)存在犁柜,則根據(jù)score更新該元素的順序
????????????redis 127.0.0.1:6379> zadd myzset 1 "one"
????zincrby:如果在名稱(chēng)為key的zset中已經(jīng)存在元素member洲鸠,則該元素的score增加increment;否則向集合中添加該元素馋缅,其score的值為increment扒腕。
作者:OzanShareing
鏈接:http://www.reibang.com/p/d6b176370efd
來(lái)源:簡(jiǎn)書(shū)
著作權(quán)歸作者所有。商業(yè)轉(zhuǎn)載請(qǐng)聯(lián)系作者獲得授權(quán)萤悴,非商業(yè)轉(zhuǎn)載請(qǐng)注明出處瘾腰。
????????ZSet就是SortedSet。實(shí)際中稚疹,很多排序場(chǎng)景都可以考慮ZSet來(lái)做居灯。
Redis發(fā)展過(guò)程中的三種模式:主從、哨兵内狗、集群
????????Redis的發(fā)展可以從版本的變化看出來(lái)怪嫌,從1.X的主從模式,到2.X的哨兵模式柳沙,再到今天3.X的集群模式岩灭,可以說(shuō)這些都是Redis保證數(shù)據(jù)可靠性、高可用的思路赂鲤。下面我們來(lái)簡(jiǎn)單實(shí)踐下噪径。環(huán)境說(shuō)明:這里準(zhǔn)備了4臺(tái)Centos Linux柱恤,裝有redis的3.0版本。
主從模式
????????Redis早期用于保證數(shù)據(jù)可靠性的一種簡(jiǎn)單方式找爱。具體來(lái)說(shuō)梗顺,Master(主)可用于寫(xiě)、讀车摄,而Slave(從)一般只用于讀寺谤。通過(guò)主從復(fù)制可以允許多個(gè)slave server 擁有和master server 相同的數(shù)據(jù)庫(kù)副本。
redis 主從復(fù)制特點(diǎn):
????????master 可以擁有多個(gè)slave
????????多個(gè)slave 可以連接同一個(gè)master 外吮播,還可以連接到其他slave
????????主從復(fù)制不會(huì)阻塞master变屁,在同步數(shù)據(jù)時(shí),master 可以繼續(xù)處理client 請(qǐng)求
????????提高系統(tǒng)的伸縮性
redis 主從復(fù)制過(guò)程:
????????當(dāng)配置好slave 后意狠,slave 與master 建立連接粟关,然后發(fā)送sync 命令。無(wú)論是第一次連接還是重新連接环戈,master 都會(huì)啟動(dòng)一個(gè)后臺(tái)進(jìn)程闷板,將數(shù)據(jù)庫(kù)快照保存到文件中,同時(shí)master主進(jìn)程會(huì)開(kāi)始收集新的寫(xiě)命令并緩存谷市。后臺(tái)進(jìn)程完成寫(xiě)文件后蛔垢,master 就發(fā)送文件給slave击孩,slave將文件保存到硬盤(pán)上迫悠,再加載到內(nèi)存中,接著master 就會(huì)把緩存的命令轉(zhuǎn)發(fā)給slave巩梢,后續(xù)master 將收到的寫(xiě)命令發(fā)送給slave创泄。如果master 同時(shí)收到多個(gè)slave 發(fā)來(lái)的同步連接命令,master 只會(huì)啟動(dòng)一個(gè)進(jìn)程來(lái)寫(xiě)數(shù)據(jù)庫(kù)鏡像括蝠,然后發(fā)送給所有的slave鞠抑。
????????其實(shí)在配置上相當(dāng)簡(jiǎn)單,只需要在Slave節(jié)點(diǎn)配置下Master的IP忌警、PORT搁拙、密碼即可。
Master info
Slave info
????????一個(gè)Master可以擁有多個(gè)Slave法绵,主從復(fù)制不會(huì)阻塞住Master箕速,在同步數(shù)據(jù)時(shí)Master可以繼續(xù)處理client端請(qǐng)求。
哨兵模式
????????對(duì)于主從復(fù)制模式而言朋譬,有個(gè)明顯的缺點(diǎn):一旦主節(jié)點(diǎn)掛了盐茎,那么redis服務(wù)將不可用。在2.X中徙赢,為了確弊帜可高用探越,所以發(fā)展出來(lái)哨兵模式。顧名思義窑业,就是哨兵站崗钦幔,去監(jiān)聽(tīng)master心跳,如果master掛了常柄,那么將從slave中選舉出一個(gè)master來(lái)节槐,從而實(shí)現(xiàn)了故障自動(dòng)切換。
????????實(shí)質(zhì)上拐纱,在Master-Slave模式基礎(chǔ)上铜异,只需要在啟動(dòng)一個(gè)哨兵服務(wù)進(jìn)行監(jiān)聽(tīng)就可以,這個(gè)哨兵服務(wù)可以部署在Master/Slave上秸架,也可以部署到其他機(jī)器上揍庄。當(dāng)然,在實(shí)際中為了避免哨兵節(jié)點(diǎn)的單點(diǎn)性东抹,也會(huì)配置多個(gè)哨兵服務(wù)蚂子。
????????哨兵節(jié)點(diǎn)192.168.99.124? sentinel.conf:
????????????????sentinel monitor mymaster 192.168.99.121 6379 1
????????????????sentinel?down-after-milliseconds?mymaster?5000
????????????????sentinel?parallel-syncs?mymaster?2
????????我們需要告訴哨兵服務(wù):
? ??????????????監(jiān)控的主節(jié)點(diǎn)的IP,PORT
? ??????????????如果master掛了缭黔,那么選舉的時(shí)候食茎,slave達(dá)到多少票就可以成為主節(jié)點(diǎn)
? ??????????????監(jiān)控主節(jié)點(diǎn)的心跳頻率
? ??????????????主節(jié)點(diǎn)下有多少slave
集群模式
????????Redis集群模式是目前應(yīng)用非常廣泛的,Redis集群模式的出現(xiàn)馏谨,也使得以前的一些Redis技術(shù)别渔,比如分片、都不在適用了惧互,同時(shí)數(shù)據(jù)的高可靠哎媚、數(shù)據(jù)分布性、服務(wù)的高可用性進(jìn)一步加強(qiáng)喊儡。關(guān)于Redis集群將在下一篇博客中詳細(xì)介紹拨与。????
Redis的簡(jiǎn)單事務(wù)
????????目前來(lái)看,Redis對(duì)事務(wù)的支持是比較簡(jiǎn)單的艾猜,在實(shí)際應(yīng)用中买喧,我們基本上是不會(huì)使用的〈以撸看一個(gè)實(shí)例淤毛,你就會(huì)明白。通過(guò)multi開(kāi)啟事務(wù)炸庞,通過(guò)exec來(lái)提交事務(wù)钱床。可以看到埠居,redis的事務(wù)目前是不支持一起成功查牌,一起失敗這種基本要求的事期,即便在事務(wù)中有錯(cuò)誤,亦不會(huì)回退纸颜,和MySQL的事務(wù)功能相距甚遠(yuǎn)吧兽泣。
????????redis 只能保證一個(gè)client 發(fā)起的事務(wù)中的命令可以連續(xù)的執(zhí)行,而中間不會(huì)插入其他client 的命令胁孙。由于redis 是單線程來(lái)處理所有client 的請(qǐng)求的所以做到這點(diǎn)是很容易的唠倦。一般情況下redis 在接受到一個(gè)client 發(fā)來(lái)的命令后會(huì)立即處理并返回處理結(jié)果,但是當(dāng)一個(gè)client 在一個(gè)連接中發(fā)出multi 命令涮较,這個(gè)連接會(huì)進(jìn)入一個(gè)事務(wù)上下文稠鼻,該連接后續(xù)的命令并不是立即執(zhí)行,而是先放到一個(gè)隊(duì)列中狂票。當(dāng)從此連接受到exec 命令后候齿,redis 會(huì)順序的執(zhí)行隊(duì)列中的所有命令。并將所有命令的運(yùn)行結(jié)果打包到一起返回給client闺属。然后此連接就結(jié)束事務(wù)上下文慌盯。
multi
????????一般情況下redis在接受到一個(gè)client發(fā)來(lái)的命令后會(huì)立即處理并返回處理結(jié)果,但是當(dāng)一個(gè)client在一個(gè)連接中發(fā)出multi命令掂器,這個(gè)連接會(huì)進(jìn)入一個(gè)事務(wù)上下文亚皂,該連接后續(xù)的命令并不是立即執(zhí)行,而是先放到一個(gè)隊(duì)列中国瓮。當(dāng)從此連接受到exec命令后灭必,redis會(huì)順序的執(zhí)行隊(duì)列中的所有命令。并將所有命令的運(yùn)行結(jié)果打包到一起返回給client巍膘。然后此連接就結(jié)束事務(wù)上下文厂财。
watch
????????Watch監(jiān)視一個(gè)(或多個(gè)) key ,如果在事務(wù)執(zhí)行之前這個(gè)(或這些) key 被其他命令所改動(dòng)峡懈,那么事務(wù)將被打斷。
缺點(diǎn)
? ? ? ? 1. redis的事務(wù)實(shí)現(xiàn)是如此簡(jiǎn)單与斤,當(dāng)然會(huì)存在一些問(wèn)題肪康。第一個(gè)問(wèn)題是redis只能保證事務(wù)的每個(gè)命令連續(xù)執(zhí)行,但是如果事務(wù)中的一個(gè)命令失敗了撩穿,并不回滾其他命令磷支,比如使用的命令類(lèi)型不匹配。
? ? ? ? 2. 當(dāng)事務(wù)的執(zhí)行過(guò)程中食寡,如果redis意外的掛了雾狈。很遺憾只有部分命令執(zhí)行了,后面的也就被丟棄了抵皱。當(dāng)然如果我們使用的append-only file方式持久化善榛,redis會(huì)用單個(gè)write操作寫(xiě)入整個(gè)事務(wù)內(nèi)容辩蛋。即是是這種方式還是有可能只部分寫(xiě)入了事務(wù)到磁盤(pán)。發(fā)生部分寫(xiě)入事務(wù)的情況下移盆,redis重啟時(shí)會(huì)檢測(cè)到這種情況悼院,然后失敗退出≈溲可以使用redis-check-aof工具進(jìn)行修復(fù)据途,修復(fù)會(huì)刪除部分寫(xiě)入的事務(wù)內(nèi)容。修復(fù)完后就能夠重新啟動(dòng)了叙甸。
Redis持久化機(jī)制
????????Redis是一個(gè)支持持久化的內(nèi)存數(shù)據(jù)庫(kù)颖医,也就是說(shuō)Redis需要經(jīng)常將內(nèi)存中的數(shù)據(jù)同步到硬盤(pán)來(lái)保證持久化,有2種方式實(shí)現(xiàn)裆蒸。
RDB
????????RDB方式便脊,也稱(chēng)作快照snapshotting,將內(nèi)存中的數(shù)據(jù)以快照的方式寫(xiě)入到二進(jìn)制文件dump.rdb中光戈,這種方式也是redis的默認(rèn)方式哪痰。可以在redis.conf中設(shè)置保存的策略久妆。一句話(huà):redis在N秒內(nèi)如果超過(guò)M個(gè)KEY發(fā)生修改則自動(dòng)做快照保存晌杰。
AOF
????????AOF,即Append-Only File筷弦。要知道RDB的方式肋演,是在一定的時(shí)間間隔做一次,如果redis意外down掉烂琴,這將意味著會(huì)丟失最后一次快照后的所有修改數(shù)據(jù)爹殊,這在生產(chǎn)環(huán)境將不太可能接受。AOF比RDB有著更好的持久化方式奸绷,通過(guò)AOF梗夸,redis會(huì)將每一個(gè)收到的寫(xiě)命令都通過(guò)write函數(shù)追加到命令中,當(dāng)redis重新啟動(dòng)時(shí)号醉,會(huì)重新執(zhí)行文件中保存的寫(xiě)命令來(lái)重建數(shù)據(jù)內(nèi)容反症。
redis.conf:
????????在實(shí)際應(yīng)用中,為了確保數(shù)據(jù)高可靠性畔派,應(yīng)該使用always策略铅碍。
Redis案例設(shè)計(jì)分析
????????假設(shè)一個(gè)類(lèi)似的場(chǎng)景,有幾百萬(wàn)线椰,甚至幾千萬(wàn)的商品數(shù)據(jù)胞谈,考慮下如何快速實(shí)現(xiàn)搜索查詢(xún)呢?當(dāng)然,我們不可能直接查詢(xún)MySQL烦绳,應(yīng)該需要在MySQL上加一層卿捎,可以考慮加一層Redis。
????????將MySQL中的數(shù)據(jù)加載至Redis中爵嗅,給定條件娇澎,直接遍歷Hash數(shù)據(jù)進(jìn)行查詢(xún)。如果就這樣簡(jiǎn)單的設(shè)計(jì)的話(huà)睹晒,對(duì)于京東這樣的大流量平臺(tái)趟庄,每天有非常多的人進(jìn)行商品搜索,而且每個(gè)人搜索的條件還不一樣伪很,根本無(wú)法快速響應(yīng)戚啥。
如上圖所示,我們可以這樣設(shè)計(jì):
? ? ? ? (1) 我們事先建立好一系列的SET锉试,實(shí)際上這些Set都是各種分類(lèi)的ProductID集合
? ? ? ? (2) 用戶(hù)的搜索條件猫十,實(shí)際上就是各種SET進(jìn)行交、并呆盖、補(bǔ)的運(yùn)算而已
? ? ? ? (3) 要知道SET進(jìn)行運(yùn)算后的結(jié)果拖云,就是ProductID集合,此時(shí)范圍已經(jīng)有所縮小应又,比起直接遍歷全部商品數(shù)據(jù)要小不少宙项。從這里也可以看出,Redis雖然用起來(lái)簡(jiǎn)單株扛,但是要綜合運(yùn)用尤筐,并根據(jù)業(yè)務(wù)場(chǎng)景進(jìn)行設(shè)計(jì),還是挺有意思的洞就。