美好只能封裝在記憶的信封之中,喜悅猶如彈指之間飛逝的花瓣。終究只屬于當(dāng)下和日后的回憶。往事不能抹去,當(dāng)下才是新的征程與起點(diǎn)。
網(wǎng)站最初通常不會(huì)存在高并發(fā)的情況,使用最簡(jiǎn)單的LNMP架構(gòu)即可滿足網(wǎng)站中的需求,但隨著網(wǎng)站運(yùn)營(yíng)時(shí)間的累加,用戶量的增多,網(wǎng)站在應(yīng)對(duì)大量的用戶請(qǐng)求時(shí)。將會(huì)出現(xiàn)卡頓、5xx系列錯(cuò)誤、頁(yè)面加載緩慢等問(wèn)題。最初網(wǎng)站的流暢運(yùn)行將隨風(fēng)而逝,眼下就需要程序員解決網(wǎng)站因?yàn)椴l(fā)而造成的一系列問(wèn)題。
因?yàn)閱我皇褂脭?shù)據(jù)庫(kù)來(lái)保存數(shù)據(jù)的系統(tǒng)是面向于磁盤,磁盤讀/寫(xiě)速度比較慢的問(wèn)題而存在嚴(yán)重的性能弊端,一瞬間成千上萬(wàn)的請(qǐng)求到來(lái),需要系統(tǒng)在極短的時(shí)間內(nèi)完成 成千上萬(wàn)次的讀/寫(xiě)操作,這個(gè)時(shí)候往往不是數(shù)據(jù)庫(kù)能夠承受的,極其容易造成數(shù)據(jù)庫(kù)系統(tǒng)癱瘓,最終導(dǎo)致服務(wù)宕機(jī)的嚴(yán)重生產(chǎn)問(wèn)題。
為了克服上述的問(wèn)題,Web項(xiàng)目通常會(huì)引入NoSQL技術(shù),這是一種基于內(nèi)存的數(shù)據(jù)庫(kù),并且提供一定的持久化功能。
redis作為一款高性能的Key-Value的鍵值對(duì)緩存數(shù)據(jù)庫(kù),因豐富的數(shù)據(jù)類型而廣泛應(yīng)用于項(xiàng)目不同的應(yīng)用場(chǎng)景。redis可以支持每秒十幾萬(wàn)此的讀/寫(xiě)操作,并且還支持集群、分布式、主從同步等配置,原則上可以無(wú)限擴(kuò)展。
但多數(shù)情況下,絕大多數(shù)開(kāi)發(fā)者只是單純用Redis做緩存的保留使用,對(duì)于其它的數(shù)據(jù)類型基本都避而不見(jiàn),但是往往采用Redis其它的數(shù)據(jù)類型可以代替其應(yīng)用業(yè)務(wù)中 需要數(shù)據(jù)庫(kù)提供的關(guān)系型數(shù)據(jù)。例如:投票、排行榜、粉絲統(tǒng)計(jì)、消息隊(duì)列、發(fā)布訂閱等等。這些場(chǎng)景的取代可以大幅度的提高網(wǎng)站的響應(yīng)速度。
如果只是單純的接觸緩存還無(wú)妨,但往往實(shí)際場(chǎng)景中用到Redis的地方很多,關(guān)鍵是在于自身如何去接入Redis到網(wǎng)站中。
會(huì)使用,干嘛還要會(huì)用redis
1、使用最簡(jiǎn)單,提升最緩慢
任何一門技術(shù)想快速入門,莫過(guò)于它的使用,因?yàn)檫@個(gè)過(guò)程中的,你的目的很明確,我就需要知道它大致的操作步驟、使用條件。入門后在是熟練操作的步驟,總結(jié)為自己的經(jīng)驗(yàn)內(nèi)容。
但這樣往往有個(gè)問(wèn)題,就是對(duì)于項(xiàng)目的業(yè)務(wù)場(chǎng)景分析不深刻,沒(méi)有根據(jù)業(yè)務(wù)的情況選擇合適的內(nèi)容,而是萬(wàn)能的套模板式的開(kāi)發(fā),久而久之就感覺(jué)像在做簡(jiǎn)單的業(yè)務(wù)開(kāi)發(fā),沒(méi)有什么實(shí)質(zhì)性的突破,感覺(jué)自己的提升非常的緩慢。
這就是所謂的認(rèn)知偏見(jiàn),在你意識(shí)中Redis只可用于緩存,那么任何的業(yè)務(wù)條件下都是用它按照set 、get的方式來(lái)解決實(shí)際問(wèn)題,對(duì)于業(yè)務(wù)場(chǎng)景下面的過(guò)程就少了業(yè)務(wù)場(chǎng)景下結(jié)果的分析。但隨著業(yè)務(wù)快速的發(fā)展很快就會(huì)出現(xiàn)瓶頸問(wèn)題。
例如:今日頭條的青云計(jì)劃中,每天中獎(jiǎng)的名單會(huì)有100-1000個(gè),同時(shí)還有分類的問(wèn)題,一級(jí)、二級(jí)、三級(jí),如果按照使用的方式可能就是根據(jù)你每個(gè)分類+ID值作為key,value就是固定長(zhǎng)度標(biāo)題+文章內(nèi)容(也可分開(kāi)設(shè)計(jì)key+value)。 雖然設(shè)置為緩存了,那如果需要展示的時(shí)候怎么好查詢呢?
如果設(shè)置的時(shí)候每個(gè)分類對(duì)應(yīng)一條記錄對(duì)于一個(gè)key-->value,那你查詢就需要規(guī)則匹配,這樣很容易發(fā)生阻塞問(wèn)題,同時(shí)每個(gè)分類下面的1 2 3三級(jí)的文章,如果在value里面設(shè)置對(duì)應(yīng)的標(biāo)識(shí),取值出來(lái)還需要進(jìn)行修改。費(fèi)時(shí)又費(fèi)力。
那如果把業(yè)務(wù)拆分成不同的分類、1 2 3級(jí)、標(biāo)題。我們就可以用有序集合來(lái)確定分類名稱,對(duì)應(yīng)的標(biāo)題,等級(jí),用Hash結(jié)構(gòu)做文章內(nèi)容存儲(chǔ)、發(fā)布時(shí)間、作者、瀏覽量等。這樣是不是就可以按照業(yè)務(wù)的組成來(lái)選擇對(duì)應(yīng)的數(shù)據(jù)呢?
從而讓我們更好的去理解業(yè)務(wù)。對(duì)于redis的認(rèn)識(shí)也更加深刻,思維上也不在是按照普通的方式,而是根據(jù)業(yè)務(wù)場(chǎng)景選擇合適的工具來(lái)做
2、好的方法可以節(jié)省時(shí)間
俗話說(shuō)“工欲善其事,必先利其器”。好的數(shù)據(jù)類型就是我們的工具,如果在開(kāi)始階段對(duì)業(yè)務(wù)的分析,決定了選擇什么好的數(shù)據(jù)類型,那么再去做的時(shí)候就可業(yè)務(wù)條件編寫(xiě)即可。而不是在書(shū)寫(xiě)的時(shí)候就是那緩存說(shuō)話,這樣你會(huì)花費(fèi)很多的時(shí)間去修改對(duì)應(yīng)的數(shù)據(jù)存儲(chǔ)機(jī)構(gòu)到Redis中。
因?yàn)槠胀ǖ膋ey->value的模式就像當(dāng)與一對(duì)一的模式,如果你有其他的需求那么你知道在對(duì)應(yīng)的value中做標(biāo)記達(dá)到你需要的存儲(chǔ)結(jié)構(gòu)。同時(shí)效率也會(huì)很低的。但往往絕大多數(shù)開(kāi)發(fā)者都不會(huì)提前的構(gòu)思,直接動(dòng)手寫(xiě),如果有經(jīng)驗(yàn)的工程師還好,因?yàn)閯e人知道書(shū)寫(xiě)的方向,但初學(xué)者就是會(huì)不斷的碰壁,碰壁之后自己也沒(méi)有任何的積累過(guò)程。后面遇到同樣的問(wèn)題,開(kāi)發(fā)效率也不會(huì)高到哪里去。
3、價(jià)值產(chǎn)生不一樣
任何一個(gè)人都是喜歡優(yōu)秀的人,如果你做的事情都是滿大街都有的東西,沒(méi)得自己的方法與經(jīng)驗(yàn)。那你的價(jià)值如何體現(xiàn)呢?
比如:幾十年前的時(shí)候,通訊不發(fā)達(dá),那時(shí)候有一個(gè)手機(jī),可能是成功的人了。就在于絕大數(shù)人都沒(méi)有手機(jī)這個(gè)東西。“物以稀為貴”就是這個(gè)理
如果問(wèn)到你對(duì)Redis的使用,張口閉口就是緩存,而不在理會(huì)其它的數(shù)據(jù)類型,用于解決業(yè)務(wù)場(chǎng)景中的問(wèn)題,這樣的情況下如何證明自己熟練Redis呢?同時(shí)對(duì)于Redis的優(yōu)化和高級(jí)、底層這些內(nèi)容沒(méi)了解,如何應(yīng)對(duì)難度的問(wèn)題呢?
總是說(shuō)自己不會(huì),那有過(guò)深入的研究準(zhǔn)備嗎?一切都停留在初級(jí)的階段不打破,何來(lái)提升。 因?yàn)檫@才是固之根本所在。
如何更好的使用Redis
一、數(shù)據(jù)結(jié)構(gòu)不將就,好鋼用在刀刃上
使用好Redis的第一步,需要對(duì)Redis的數(shù)據(jù)方式有全新的認(rèn)識(shí)。認(rèn)識(shí)每個(gè)數(shù)據(jù)類型的結(jié)構(gòu)特點(diǎn)。同數(shù)據(jù)結(jié)構(gòu)的組成上對(duì)應(yīng)到業(yè)務(wù)數(shù)據(jù)存儲(chǔ)上,在由業(yè)務(wù)數(shù)據(jù)特點(diǎn)對(duì)應(yīng)到所適合的數(shù)據(jù)類型有那些。有時(shí)候選擇好工具后,會(huì)事半功倍。
以下就是Redis的5大基礎(chǔ)類型特點(diǎn):
1、String 可以包含任何數(shù)據(jù),比如jpg圖片或者序列化的對(duì)象,一個(gè)鍵最大能存儲(chǔ)512M。
常用場(chǎng)景:分布式session會(huì)話、計(jì)數(shù)器、接口限速、分布式鎖等。
特點(diǎn):對(duì)于數(shù)字遞增處理、字符串處理都可以,因?yàn)樗荎ye->Value關(guān)系的結(jié)構(gòu)。就是相 當(dāng)于對(duì)一個(gè)key的描述,前提是要找好key屬于要準(zhǔn)備操作什么數(shù)據(jù)類型。
常用命令:
SET key value GET key MSET key1 value1 [key2 value2] MGET key1 key2 INCR key DECR key SETNX key value #只有key 不存在時(shí),才設(shè)置key的值
2、Hash 鍵值對(duì)集合,即編程語(yǔ)言中的Map類型。適合存儲(chǔ)對(duì)象,并且可以像數(shù)據(jù)庫(kù)中update一個(gè)屬性一樣只修改某一項(xiàng)屬性值。
常用場(chǎng)景:存儲(chǔ)、讀取、修改用戶屬性、購(gòu)物車等
特點(diǎn):Hash的結(jié)構(gòu)類似于與字典結(jié)構(gòu),有一個(gè)key指定名稱,value用于描述這個(gè)可以的信息,一般用于描述對(duì)象的基本信息。
例如:購(gòu)物車?yán)锩嫔唐稩D、商品數(shù)量、用戶ID、銷量、關(guān)注等這些信息都算是購(gòu)物車需要的信息結(jié)構(gòu)。采用它靈活性是非常高的
常用命令:
HSET%20key%20field%20value HGET%20key%20field HGETALL%20key HMSET%20key%20field1%20value1%20[field2%20value2] HMGET%20key%20field1%20[filed2]
3、List 鏈表(雙向鏈表)。存儲(chǔ)數(shù)據(jù)的特點(diǎn)猶如一個(gè)有序列表的形式,由左、右邊可插入數(shù)據(jù)到其中。
常用場(chǎng)景:最新消息排行等功能、消息隊(duì)列、評(píng)論列表、令牌桶算法等。
特點(diǎn):List結(jié)構(gòu)關(guān)鍵部分它是一個(gè)雙向鏈表,可以雙向的添加信息到列表中,使用的時(shí)候在以出隊(duì)的方式取出,所以只要滿足操作的條件即可。同時(shí)列表也可做類似消息的排隊(duì)處理操作。
常用命令:
LPUSH key value1 [value2] #將一個(gè)或多個(gè)值插入到列表頭部 LPOP key #移出并獲取列表的第一個(gè)元素 RPUSH key value1 [value2] #在列表尾部添加一個(gè)或多個(gè)值 RPOP key #移除并獲取列表最后一個(gè)元素 LREM key count value #移除列表元素 LRANGE key start stop #獲取列表指定范圍內(nèi)的元素
4、Set 由哈希表實(shí)現(xiàn),用于存儲(chǔ)多個(gè)字符串的元素,但和列表不同的是集合中不允許有重復(fù)的元素,并且集合中的元素是無(wú)序的。
常用場(chǎng)景: 標(biāo)簽、共同好友、共同好友等
特點(diǎn): 集合的內(nèi)部有hash表實(shí)現(xiàn),這個(gè)很重要。也就是它的特別和hash的字典結(jié)構(gòu)差不多,只不過(guò)它相當(dāng)于內(nèi)部沒(méi)有key的指定,直接是信息的存儲(chǔ)。把結(jié)果堆積在一起。
常用命令:
SADD key member1 [member2] #向集合添加一個(gè)或多個(gè)成員 SDIFF key1 [key2] #返回給定所有集合的差集 SINTER key1 [key2] #返回給定所有集合的交集 SUNION key1 [key2] #返回所有給定集合的并集 SISMEMBER key member #判斷 member 元素是否是集合 key 的成員 SMEMBERS key #返回集合中的所有成員 SREM key member1 [member2] # 移除集合中一個(gè)或多個(gè)成員
5、Sorted Set:有序集合。將Set中的元素增加一個(gè)權(quán)重參數(shù)score,元素按score有序排列。數(shù)據(jù)插入集合時(shí),已經(jīng)是進(jìn)行天然排序。
常用場(chǎng)景:排行榜、帶權(quán)重的消息隊(duì)列、時(shí)間線等
特點(diǎn):存儲(chǔ)結(jié)構(gòu)特點(diǎn)像hash的結(jié)構(gòu),只不過(guò)是把hash內(nèi)部的key變?yōu)榱薙core用于技術(shù)的分值。但是數(shù)據(jù)存儲(chǔ)結(jié)構(gòu)還是一致的,后面選擇它的時(shí)候可以用于排行、權(quán)重這一塊的業(yè)務(wù),內(nèi)部有一個(gè)計(jì)數(shù)的選項(xiàng)來(lái)保持內(nèi)容的結(jié)果。
常用命令:
ZADD key score1 member1 [score2 member2] #向有序集合添加一個(gè)或多個(gè)成員,或者更新已存在成員的分?jǐn)?shù) ZINCRBY key increment member #有序集合中對(duì)指定成員的分?jǐn)?shù)加上增量 increment ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT] #通過(guò)分?jǐn)?shù)范圍返回有序集合指定區(qū)間內(nèi)的成員 ZINTERSTORE destination numkeys key [key …] #計(jì)算給定的一個(gè)或多個(gè)有序集的交集,并將結(jié)果集存儲(chǔ)在新的有序集合 key 中 ZUNIONSTORE destination numkeys key [key …] #計(jì)算給定的一個(gè)或多個(gè)有序集的并集,并存儲(chǔ)在新的 key 中
對(duì)于數(shù)據(jù)結(jié)構(gòu)更多是需要明白每個(gè)數(shù)據(jù)類型的組成,當(dāng)拿到業(yè)務(wù)情況時(shí)。首先拆解業(yè)務(wù)組成的屬性,從而用Redis的數(shù)據(jù)類型來(lái)代替原來(lái)需要MySQL結(jié)構(gòu)化數(shù)據(jù)實(shí)現(xiàn)的業(yè)務(wù),從而提升性能。同時(shí)應(yīng)對(duì)一些情況特殊的場(chǎng)景,例如:秒殺用隊(duì)列的時(shí)候、分布式時(shí)采用session共享會(huì)話等等
二、提升緩存命中率
說(shuō)到底R(shí)edis再好,它的本質(zhì)就是用于緩存數(shù)據(jù),如果請(qǐng)求沒(méi)有在Redis里面找到緩存的內(nèi)容,那么同樣還是不能減輕數(shù)據(jù)的壓力。同時(shí)如果內(nèi)存存儲(chǔ)一些冷數(shù)據(jù)也不能為那些高頻率使用網(wǎng)站的用戶提供服務(wù)。
所以提升緩存的命中率顯得異常重要。那么如何來(lái)提升緩存的命令率呢?
那我們可設(shè)想,既然緩存的數(shù)據(jù)是需要通過(guò)Key的方式獲取,那么我們?cè)诜?wù)端進(jìn)行key的監(jiān)控,把那些不經(jīng)常使用的key換成熱點(diǎn)數(shù)據(jù)的key。同時(shí)緩存是為了提供業(yè)務(wù)的快速訪問(wèn),但網(wǎng)站中熱點(diǎn)的業(yè)務(wù)并不是所有的業(yè)務(wù)都需要等等。
歸納起來(lái)就是每個(gè)請(qǐng)求應(yīng)該在哪里去找到key? 這個(gè)key使用的頻率高嗎?這個(gè)key會(huì)受那些因素影響后而導(dǎo)致緩存的命中率降低呢?
以下是一些因素問(wèn)題的影響:
1. 業(yè)務(wù)場(chǎng)景
緩存適合“讀多寫(xiě)少”的業(yè)務(wù)場(chǎng)景,反之,使用緩存的意義不大,命中率會(huì)很低。緩存時(shí)間越長(zhǎng),命中率會(huì)越高。時(shí)效性要求越低,就越適合緩存。
2. 更新策略
緩存的粒度越小,命中率會(huì)越高。舉個(gè)實(shí)際的例子說(shuō)明:
當(dāng)緩存單個(gè)對(duì)象的時(shí)候(例如:?jiǎn)蝹€(gè)用戶信息),只有當(dāng)該對(duì)象對(duì)應(yīng)的數(shù)據(jù)發(fā)生變化時(shí),我們才需要更新緩存或者讓移除緩存。而當(dāng)緩存一個(gè)集合的時(shí)候(例如:所有用戶數(shù)據(jù)),其中任何一個(gè)對(duì)象對(duì)應(yīng)的數(shù)據(jù)發(fā)生變化時(shí),都需要更新或移除緩存
3. 清理策略
對(duì)于持續(xù)運(yùn)行的Redis服務(wù)器來(lái)說(shuō), 服務(wù)器需要定期對(duì)自身的資源和狀態(tài)進(jìn)行必要的檢查和整理,有三種不同的刪除策略,立即刪除會(huì)短時(shí)間內(nèi)占用大量cpu,惰性刪除會(huì)在一段時(shí)間內(nèi)浪費(fèi)內(nèi)存,所以定時(shí)刪除是一個(gè)折中的辦法。
(1)立即清理。在設(shè)置鍵的過(guò)期時(shí)間時(shí),創(chuàng)建一個(gè)回調(diào)事件,當(dāng)過(guò)期時(shí)間達(dá)到時(shí),由時(shí)間處理器自動(dòng)執(zhí)行鍵的刪除操作。
(2)惰性清理。鍵過(guò)期了就過(guò)期了,不管。當(dāng)讀/寫(xiě)一個(gè)已經(jīng)過(guò)期的key時(shí),會(huì)觸發(fā)惰性刪除策略,直接刪除掉這個(gè)過(guò)期key
(3)定期清理。每隔一段時(shí)間,對(duì)expires字典進(jìn)行檢查,刪除里面的過(guò)期鍵。
4. 緩存容量
緩存的容量有限,則容易引起Redis自身的緩存被淘汰淘汰策略。
5. 緩存故障
緩存節(jié)點(diǎn)故障,也會(huì)引起緩存失效,所以業(yè)內(nèi)比較典型的做法就是通過(guò)一致性Hash算法來(lái)均衡分布緩存,或者通過(guò)集群采用節(jié)點(diǎn)冗余的方式。
6、監(jiān)控Redis緩存操作命令
首先可通過(guò)info命令來(lái)分析緩存的率是否滿足業(yè)務(wù),如果太低那么就可以采用monitor命令或者第三方工具(如:redis-faina)分析操作key的訪問(wèn)頻率,進(jìn)而動(dòng)態(tài)更改業(yè)務(wù)場(chǎng)景需要訪問(wèn)key的類型。
三、優(yōu)化服務(wù)器內(nèi)存
內(nèi)存可以說(shuō)是服務(wù)器最寶貴的資源運(yùn)行地,所以對(duì)于Redis使用過(guò)程中,應(yīng)該來(lái)優(yōu)化Redis的內(nèi)存,從而使其發(fā)揮出更大的性能。
那這個(gè)Redis的內(nèi)存應(yīng)該如何優(yōu)化呢? 首先存儲(chǔ)任何的緩存都是基于Redis的數(shù)據(jù)類型進(jìn)行選擇,但Redis設(shè)置key的時(shí)候選擇對(duì)應(yīng)的類型就顯得的很重要。設(shè)置key和value的時(shí)候也不要過(guò)長(zhǎng)等
就應(yīng)該從Redis緩存的組成結(jié)構(gòu),淘汰緩存上做到避免無(wú)用數(shù)據(jù)占用緩存、內(nèi)存碎片、數(shù)據(jù)類型使用內(nèi)存上等問(wèn)題來(lái)做分析
如下一些常用的思路
Redis主進(jìn)程的內(nèi)存消耗:
- Redis自身使用的內(nèi)存:消耗很少,3MB多點(diǎn)
- 對(duì)象內(nèi)存
- 緩沖內(nèi)存
- 內(nèi)存碎片
3.1對(duì)象內(nèi)存:所有key對(duì)象長(zhǎng)度 + 所有value對(duì)象長(zhǎng)度
- 每次創(chuàng)建鍵值對(duì)時(shí),至少創(chuàng)建兩個(gè)類型對(duì)象:key對(duì)象、value對(duì)象,應(yīng)該使用短鍵名
3.2緩沖內(nèi)存:
- 每個(gè)客戶端的輸入、輸出緩沖內(nèi)存:
- 輸入緩沖最大1G,超出則關(guān)閉該客戶端連接;
- 輸出緩沖:16KB的固定緩沖區(qū)、動(dòng)態(tài)緩沖區(qū),動(dòng)態(tài)緩沖區(qū)可通過(guò)client-output-buffer-limit配置參數(shù)限制(根據(jù)客戶端類型normal、slave、pubsub,分開(kāi)設(shè)置)
- client-output-buffer-limit normal 0 0 0
- client-output-buffer-limit slave 256mb 64mb 60 //超過(guò)256MB時(shí),或者持續(xù)超過(guò)64MB達(dá)60秒,關(guān)閉連接
- client-output-buffer-limit pubsub 32mb 8mb 60
- 復(fù)制積壓緩沖內(nèi)存:用于主從復(fù)制的部分復(fù)制,所有客戶端共享該緩沖區(qū),默認(rèn)1MB,可通過(guò)repl-backlog-size調(diào)整,適當(dāng)調(diào)大,可有效避免全量復(fù)制;
- AOF緩沖內(nèi)存:用于保存在AOF重寫(xiě)期間的寫(xiě)命令,便于重寫(xiě)完畢后把緩沖的命令追加到AOF文件中;
3.3內(nèi)存碎片:
- 當(dāng)存儲(chǔ)的數(shù)據(jù)長(zhǎng)短差異較大時(shí),就容易出現(xiàn)大量?jī)?nèi)存碎片,應(yīng)該盡可能地保持?jǐn)?shù)據(jù)對(duì)齊或使用固定長(zhǎng)度的字符串;
- 內(nèi)存碎片只能通過(guò)完全重啟Redis來(lái)清除;
3.4內(nèi)存回收策略:
- 為鍵設(shè)置過(guò)期屬性,Redis采用惰性刪除和定時(shí)任務(wù)刪除機(jī)制實(shí)現(xiàn)過(guò)期鍵的內(nèi)存回收;
- 惰性刪除:在讀取鍵時(shí)才檢查是否過(guò)期
- 定時(shí)任務(wù)刪除:通過(guò)hz配置參數(shù)設(shè)置頻率,默認(rèn)每秒10次;
- 內(nèi)存溢出控制策略:共6中策略,通過(guò)maxmemory-policy配置參數(shù)控制,默認(rèn)noeviction(不刪除,拒絕寫(xiě)入,返回錯(cuò)誤)
- LRU算法表示最近最少使用的,LFU算法表示最不常用的:
- #volatile-lru - >在設(shè)置了過(guò)期的key中,刪除最近最少使用的key,直到空間足夠?yàn)橹?/li>
- #allkeys-lru - >從所有key里刪除最近最少使用的key,不管有沒(méi)設(shè)置過(guò)期,直到空間足夠?yàn)橹?/li>
- #volatile-lfu - >在設(shè)置了過(guò)期的key中,刪除最少使用的key,直到空間足夠?yàn)橹?/li>
- #allkeys-lfu - >從所有key里刪除最少使用的key,不管有沒(méi)設(shè)置過(guò)期,直到空間足夠?yàn)橹?/li>
- #volatile-random - >刪除一個(gè)過(guò)期集合中的隨機(jī)key。
- #allkeys-random - >刪除一個(gè)隨機(jī)key,不管有沒(méi)設(shè)置過(guò)期。
- #volatile-ttl - >刪除即將過(guò)期的key(次TTL)
- #noviction - >不刪除,拒絕寫(xiě)入,寫(xiě)入操作時(shí)返回錯(cuò)誤。
- maxmemory-samples 5 是說(shuō)每次進(jìn)行淘汰的時(shí)候,會(huì)隨機(jī)抽取5個(gè)key 從里面淘汰最少使用的(默認(rèn)選項(xiàng))
- 應(yīng)避免內(nèi)存溢出,因?yàn)樵趦?nèi)存溢出且非noeviction策略時(shí),會(huì)頻繁觸發(fā)回收內(nèi)存的操作,影響Redis性能,若有從節(jié)點(diǎn),還會(huì)把刪除命令同步給從節(jié)點(diǎn);
- 對(duì)于只做緩存的場(chǎng)景下,可通過(guò)調(diào)小maxmemory,并執(zhí)行一次命令,如果使用非noeviction策略,則會(huì)一次性回收到maxmemory指定的內(nèi)存使用量,實(shí)現(xiàn)內(nèi)存的快速回收,但會(huì)導(dǎo)致數(shù)據(jù)丟失和短暫阻塞
不單要使用,而是要會(huì)用。會(huì)用Redis可以幫助提升自己能力,展示自己的價(jià)值。很多時(shí)候應(yīng)該先接觸在代入到實(shí)際的工作場(chǎng)景中去使用,考慮的時(shí)候先進(jìn)行知識(shí)的搜捕。然后與實(shí)際的場(chǎng)景業(yè)務(wù)進(jìn)行類比處理。更多是知與行的結(jié)合