創(chuàng)新互聯(lián)建站致力于網(wǎng)站設(shè)計制作、成都做網(wǎng)站,成都網(wǎng)站設(shè)計,集團網(wǎng)站建設(shè)等服務(wù)標準化,推過標準化降低中小企業(yè)的建站的成本,并持續(xù)提升建站的定制化服務(wù)水平進行質(zhì)量交付,讓企業(yè)網(wǎng)站從市場競爭中脫穎而出。 選擇創(chuàng)新互聯(lián)建站,就選擇了安全、穩(wěn)定、美觀的網(wǎng)站建設(shè)服務(wù)!
(圖片來源于網(wǎng)絡(luò))
面試官: 我看到你的簡歷上說你熟練使用Redis,那么你講一下Redis是干嘛用的?
小明: (心中竊喜,Redis不就是緩存嗎?)Redis主要用作緩存,通過內(nèi)存高效地存儲非持久化數(shù)據(jù)。
面試官: Redis可以用作持久化的存儲嗎?
小明:嗯...應(yīng)該可以吧...
面試官: 那Redis怎么進行持久化操作呢?
小明:嗯...不是太清楚。
面試官: Redis的內(nèi)存淘汰機制有哪些?
小明:嗯...沒了解過
面試官:我們還可以用Redis做哪些事情?分別利用了Redis的哪個指令?
小明:我只知道Redis還可以做分布式鎖、消息隊列...
面試官:好了,我們進入下一個話題...
思考:很明顯,小明同學(xué)在面試過程中關(guān)于Redis的表現(xiàn)和回答肯定是比較失敗的。Redis是我們工作中每天都會使用到的東西,為什么一到面試卻變成了丟分項呢?
作為開發(fā)者,我們習(xí)慣了使用大神們已經(jīng)封裝好的東西,以此保障我們能夠更專注于業(yè)務(wù)開發(fā),卻不知道這些常用工具的底層實現(xiàn)是什么,因此盡管平時應(yīng)用起來得心應(yīng)手,但一到面試還是無法讓面試官眼前一亮。
本文總結(jié)了一些Redis的知識點,有原理有應(yīng)用,希望可以幫助到大家。
REmote DIctionary Server(Redis) 是一個由Salvatore Sanfilippo寫的key-value存儲系統(tǒng)。
Redis是一個開源的使用ANSI 、C語言編寫、遵守BSD協(xié)議、支持網(wǎng)絡(luò)、可基于內(nèi)存亦可持久化的日志型、Key-Value數(shù)據(jù)庫,并提供多種語言的API。
這里我引用了Redis教程里對Redis的描述,很官方,但是很標準。
可基于內(nèi)存亦可持久化的日志型、Key-Value數(shù)據(jù)庫。
我認為這個描述很貼切很全面。
Redis是互聯(lián)網(wǎng)技術(shù)領(lǐng)域使用最為廣泛的存儲中間件,因超高的性能、完美的文檔、多方面的應(yīng)用能力以及豐富完善的客戶端支持在存儲方面獨當(dāng)一面,廣受好評,尤其以其性能和讀取速度而成為了領(lǐng)域中最受青睞的中間件?;旧厦恳粋€軟件公司都會使用Redis,其中包括很多大型互聯(lián)網(wǎng)公司,比如京東、阿里、騰訊、github等。因此,Redis也成為了后端開發(fā)人員必不可少的技能。
在我看來,學(xué)習(xí)每一項技術(shù),都需要有一個清晰的脈絡(luò)和結(jié)構(gòu),不然你也不知道自己會了哪些、還有多少沒學(xué)會。就像一本書,如果沒有目錄章節(jié),也就失去了靈魂。
因此我試圖總結(jié)出Redis的知識圖譜,也稱為腦圖,如下圖所示,可能知識點不是很全,后續(xù)會不斷更新補充。
本系列文章的知識點也會和這個腦圖基本一致,本文先介紹Redis的基本知識,后續(xù)文章會詳細介紹Redis的數(shù)據(jù)結(jié)構(gòu)、應(yīng)用、持久化等多個方面。
作為緩存工具,Redis最廣為人知的特點就是快,到底有多快呢?Redis單機qps(每秒的并發(fā))可以達到110000次/s,寫的速度是81000次/s。
那么,Redis為什么這么快呢?
Redis有5種常用的數(shù)據(jù)類型:String、List、Hash、set、zset,每種數(shù)據(jù)類型都有自己的用處。
Redis支持事務(wù),并且它的所有操作都是原子性的,同時Redis還支持對幾個操作合并后的原子性執(zhí)行。
Redis具有豐富的特性,比如可以用作分布式鎖;可以持久化數(shù)據(jù);可以用作消息隊列、排行榜、計數(shù)器;還支持publish/subscribe、通知、key過期等等。當(dāng)我們要用中間件來解決實際問題的時候,Redis總能發(fā)揮出自己的用處。
Memcache和Redis都是優(yōu)秀的、高性能的內(nèi)存數(shù)據(jù)庫,一般我們說到Redis的時候,都會拿Memcache來和Redis做對比。(為什么要做對比呢?當(dāng)然是要襯托出Redis有多好,沒有對比,就沒有傷害~)對比的方面包括:
Memcache把數(shù)據(jù)全部存在內(nèi)存之中,斷電后會掛掉,無法做到數(shù)據(jù)的持久化,且數(shù)據(jù)不能超過內(nèi)存大小。
Memcache對數(shù)據(jù)類型支持相對簡單,只支持String類型的數(shù)據(jù)結(jié)構(gòu)。
它們之間底層實現(xiàn)方式以及與客戶端之間通信的應(yīng)用協(xié)議不一樣。
看到這里,會不會覺得Redis特別好,全是優(yōu)點,完美無缺?其實Redis還是有很多缺點的,這些缺點平常我們該如何克服呢?
問題:一致性的問題是分布式系統(tǒng)中很常見的問題。一致性一般分為兩種:強一致性和最終一致性,當(dāng)我們要滿足強一致性的時候,Redis也無法做到完美無瑕,因為數(shù)據(jù)庫和緩存雙寫,肯定會出現(xiàn)不一致的情況,Redis只能保證最終一致性。
解決:我們?nèi)绾伪WC最終一致性呢?
第一種方式是給緩存設(shè)置一定的過期時間,在緩存過期之后會自動查詢數(shù)據(jù)庫,保證數(shù)據(jù)庫和緩存的一致性。
問題:我們應(yīng)該都在電影里看到過雪崩,開始很平靜,然后一瞬間就開始崩塌,具有很強的毀滅性。這里也是一樣的,我們執(zhí)行代碼的時候?qū)⒑芏嗑彺娴膶嵭r間設(shè)定成一樣,接著這些緩存在同一時間都會實效,然后都會重新訪問數(shù)據(jù)庫更新數(shù)據(jù),這樣會導(dǎo)致數(shù)據(jù)庫連接數(shù)過多、壓力過大而崩潰。
解決:
問題:緩存穿透是指一些非正常用戶(***)故意去請求緩存中不存在的數(shù)據(jù),導(dǎo)致所有的請求都集中到到數(shù)據(jù)庫上,從而導(dǎo)致數(shù)據(jù)庫連接異常。
解決:
利用互斥鎖。緩存失效的時候,不能直接訪問數(shù)據(jù)庫,而是要先獲取到鎖,才能去請求數(shù)據(jù)庫。沒得到鎖,則休眠一段時間后重試。
采用異步更新策略。無論key是否取到值,都直接返回。value值中維護一個緩存失效時間,緩存如果過期,異步起一個線程去讀數(shù)據(jù)庫,更新緩存。需要做緩存預(yù)熱(項目啟動前,先加載緩存)操作。
問題:
緩存并發(fā)競爭的問題,主要發(fā)生在多線程對某個key進行set的時候,這時會出現(xiàn)數(shù)據(jù)不一致的情況。
比如Redis中我們存著一個key為amount的值,它的value是100,兩個線程同時都對value加100然后更新,正確的結(jié)果應(yīng)該是變?yōu)?00。但是兩個線程拿到這個值的時候都是100,最后結(jié)果也就是200,這就導(dǎo)致了緩存的并發(fā)競爭問題。
解決
Redis隨著數(shù)據(jù)的增多,內(nèi)存占用率會持續(xù)變高,我們以為一些鍵到達設(shè)置的刪除時間就會被刪除,但是時間到了,內(nèi)存的占用率還是很高,這是為什么呢?
Redis采用的是定期刪除和惰性刪除的內(nèi)存淘汰機制。
定期刪除和定時刪除是有區(qū)別的:
定時刪除是必須嚴格按照設(shè)定的時間去刪除緩存,這就需要我們設(shè)置一個定時器去不斷地輪詢所有的key,判斷是否需要進行刪除。但是這樣的話cpu的資源會被大幅度地占據(jù),資源的利用率變低。所以我們選擇采用定期刪除,。
舉個簡單的例子:中學(xué)的時候,平時作業(yè)太多,根本做不完,老師說下節(jié)課要講這個卷子,你們都做完了吧?其實有很多人沒做完,所以需要在下節(jié)課之前趕緊補上。
惰性刪除也是這個道理,我們的這個值按理說應(yīng)該沒了,但是它還在,當(dāng)你要獲取這個key的時候,發(fā)現(xiàn)這個key應(yīng)該過期了,趕緊刪了,然后返回一個'沒有這個值,已經(jīng)過期了!'。
現(xiàn)在我們有了定期刪除 + 惰性刪除的過期策略,就可以高枕無憂了嗎?并不是這樣的,如果這個key一直不訪問,那么它會一直滯留,也是不合理的,這就需要我們的內(nèi)存淘汰機制了。
Redis的內(nèi)存淘汰機制一般有6種,如下圖所示:
那么我們?nèi)绾稳ヅ渲肦edis的內(nèi)存淘汰機制呢?
在Redis.conf中我們可以進行配置
# maxmemory-policy allkeys-lru
本文初探Redis,大概整理出了Redis的知識圖譜,對照之下可以發(fā)現(xiàn)Redis居然有這么多的知識點需要學(xué)習(xí);接著我們分析了Redis的優(yōu)缺點,知道了其基于內(nèi)存的高效的讀寫速度和豐富的數(shù)據(jù)類型,也分析了Redis面對數(shù)據(jù)一致性、緩存穿透、緩存雪崩等問題時該如何處理;最后我們了解了Redis的過期策略和緩存淘汰機制。
相信大家已經(jīng)對Redis有了一些了解,下篇文章我們將分析Redis的數(shù)據(jù)結(jié)構(gòu)、每一種數(shù)據(jù)類型是如何實現(xiàn)的、對應(yīng)的命令有哪些。
作者:楊亨
來源:宜信技術(shù)學(xué)院
本文名稱:Redis閑談(1):構(gòu)建知識圖譜
路徑分享:http://muchs.cn/article2/jiogoc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供軟件開發(fā)、動態(tài)網(wǎng)站、網(wǎng)站內(nèi)鏈、定制網(wǎng)站、移動網(wǎng)站建設(shè)、網(wǎng)頁設(shè)計公司
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)