Redis核心原理

1.jpg

Redis的一些核心原理。

Redis系統(tǒng)介紹:

Redis的基礎(chǔ)介紹與安裝使用步驟:http://www.reibang.com/p/2a23257af57b
Redis的基礎(chǔ)數(shù)據(jù)結(jié)構(gòu)與使用:http://www.reibang.com/p/c95c8450c5b6
Redis核心原理:http://www.reibang.com/p/4e6b7809e10a
Redis 5 之后版本的高可用集群搭建:http://www.reibang.com/p/8045b92fafb2
Redis 5 版本的高可用集群的水平擴(kuò)展:http://www.reibang.com/p/6355d0827aea
Redis 5 集群選舉原理分析:http://www.reibang.com/p/e6894713a6d5
Redis 5 通信協(xié)議解析以及手寫一個(gè)Jedis客戶端:http://www.reibang.com/p/575544f68615

優(yōu)秀博客:
https://blog.csdn.net/hopeztm/article/details/79547052?utm_source=blogxgwz0
https://www.cnblogs.com/qq78292959/archive/2013/09/21/3331032.html


一袋马、Redis的單線程和高性能
Redis 單線程為什么還能這么快斧拍?

因?yàn)樗械臄?shù)據(jù)都在內(nèi)存中,所有的運(yùn)算都是內(nèi)存級(jí)別的運(yùn)算(納秒),而且單線程避免了多線程的切換(上下文切換)性能損耗問題。正因?yàn)?Redis 是單線程,所以要小心使用 Redis 指令鸠窗,對(duì)于那些耗時(shí)的指令(比如keys),一定要謹(jǐn)慎使用胯究,一不小心就可能會(huì)導(dǎo)致 Redis 卡頓稍计。

Redis 單線程如何處理那么多的并發(fā)客戶端連接?

Redis的IO多路復(fù)用:redis利用epoll來實(shí)現(xiàn)IO多路復(fù)用裕循,將連接信息和事件放到隊(duì)列中臣嚣,依次放到文件事件分派器,事件分派器將事件分發(fā)給事件處理器费韭。
Nginx也是采用IO多路復(fù)用原理解決C10K問題茧球。
c10k:http://www.reibang.com/p/ba7fa25d3590

1.png
持久化
RDB快照(snapshot)

在默認(rèn)情況下, Redis 將內(nèi)存數(shù)據(jù)庫(kù)快照保存在名字為dump.rdb的二進(jìn)制文件中星持。
你可以對(duì) Redis 進(jìn)行設(shè)置抢埋, 讓它在N秒內(nèi)數(shù)據(jù)集至少有M個(gè)改動(dòng)這一條件被滿足時(shí), 自動(dòng)保存一次數(shù)據(jù)集。
比如說揪垄, 以下設(shè)置會(huì)讓 Redis 在滿足60秒內(nèi)有至少有1000個(gè)鍵被改動(dòng)”這一條件時(shí)穷吮, 自動(dòng)保存一次數(shù)據(jù)集:

save 60 1000

redis.conf文件里面有默認(rèn)的3種情況,3種是或的關(guān)系


2.png
AOF(append-only file)

快照功能并不是非常耐久(durable): 如果 Redis 因?yàn)槟承┰蚨斐晒收贤C(jī)饥努, 那么服務(wù)器將丟失最近寫入捡鱼、且仍未保存到快照中的那些數(shù)據(jù)。從 1.1 版本開始酷愧, Redis 增加了一種完全耐久的持久化方式: AOF 持久化驾诈,將修改的每一條指令記錄進(jìn)文件
你可以通過修改配置文件來打開 AOF 功能:

appendonly yes

開啟后,每當(dāng) Redis 執(zhí)行一個(gè)改變數(shù)據(jù)集的命令時(shí)(比如SET)溶浴, 這個(gè)命令就會(huì)被追加到 AOF 文件的末尾乍迄。
這樣的話, 當(dāng) Redis 重新啟時(shí)士败, 程序就可以通過重新執(zhí)行 AOF 文件中的命令來達(dá)到重建數(shù)據(jù)集的目的闯两。
你可以配置 Redis 多久才將數(shù)據(jù)fsync到磁盤一次。

有三個(gè)選項(xiàng):

每次有新命令追加到 AOF 文件時(shí)就執(zhí)行一次fsync:非常慢谅将,也非常安全漾狼。
每秒fsync一次:足夠快(和使用 RDB 持久化差不多),并且在故障時(shí)只會(huì)丟失 1 秒鐘的數(shù)據(jù)饥臂。
從不fsync:將數(shù)據(jù)交給操作系統(tǒng)來處理逊躁。更快,也更不安全的選擇擅笔。

推薦(并且也是默認(rèn))的措施為每秒fsync一次志衣, 這種fsync策略可以兼顧速度和安全性屯援。
RDB 和 AOF 猛们,我應(yīng)該用哪一個(gè)?

如果你非常關(guān)心你的數(shù)據(jù)狞洋, 但仍然可以承受數(shù)分鐘以內(nèi)的數(shù)據(jù)丟失弯淘, 那么你可以只使用 RDB 持久化。

有很多用戶都只使用 AOF 持久化吉懊, 但我們并不推薦這種方式: 因?yàn)槎〞r(shí)生成 RDB 快照(snapshot)非常便于進(jìn)行數(shù)據(jù)庫(kù)備份庐橙, 并且 RDB 恢復(fù)數(shù)據(jù)集的速度也要比 AOF 恢復(fù)的速度要快。

Redis 4.0 混合持久化

重啟 Redis 時(shí)借嗽,我們很少使用 rdb 來恢復(fù)內(nèi)存狀態(tài)态鳖,因?yàn)闀?huì)丟失大量數(shù)據(jù)。我們通常使用 AOF 日志重放恶导,但是重放 AOF 日志性能相對(duì) rdb 來說要慢很多浆竭,這樣在 Redis 實(shí)例很大的情況下,啟動(dòng)需要花費(fèi)很長(zhǎng)的時(shí)間。 Redis 4.0 為了解決這個(gè)問題邦泄,帶來了一個(gè)新的持久化選項(xiàng)——混合持久化删窒。

AOF在重寫(aof文件里可能有太多沒用指令,所以aof會(huì)定期根據(jù)內(nèi)存的最新數(shù)據(jù)生成aof文件)時(shí)將重寫這一刻之前的內(nèi)存rdb快照文件的內(nèi)容和增量的 AOF修改內(nèi)存數(shù)據(jù)的命令日志文件存在一起顺囊,都寫入新的aof文件肌索,新的文件一開始不叫appendonly.aof,等到重寫完新的AOF文件才會(huì)進(jìn)行改名特碳,原子的覆蓋原有的AOF文件诚亚,完成新舊兩個(gè)AOF文件的替換;

aof 根據(jù)配置規(guī)則在后臺(tái)自動(dòng)重寫午乓,也可以人為執(zhí)行命令bgrewriteaof重寫AOF亡电。 于是在 Redis 重啟的時(shí)候,可以先加載 rdb 的內(nèi)容硅瞧,然后再重放增量 AOF 日志就可以完全替代之前的 AOF 全量文件重放份乒,重啟效率因此大幅得到提升。

開啟混合持久化:
aof-use-rdb-preamble yes
混合持久化aof文件結(jié)構(gòu)
3.png
緩存淘汰策略(解決數(shù)據(jù)熱點(diǎn)問題):

當(dāng) Redis 內(nèi)存超出物理內(nèi)存限制時(shí)腕唧,內(nèi)存的數(shù)據(jù)會(huì)開始和磁盤產(chǎn)生頻繁的交換 (swap)或辖。交換會(huì)讓 Redis 的性能急劇下降,對(duì)于訪問量比較頻繁的 Redis 來說枣接,這樣龜速的存取效率基本上等于不可用颂暇。

在生產(chǎn)環(huán)境中我們是不允許 Redis 出現(xiàn)交換行為的,為了限制最大使用內(nèi)存但惶,Redis 提供了配置參數(shù) maxmemory 來限制內(nèi)存超出期望大小耳鸯。

當(dāng)實(shí)際內(nèi)存超出 maxmemory 時(shí),Redis 提供了幾種可選策略 (maxmemory-policy) 來讓用戶自己決定該如何騰出新的空間以繼續(xù)提供讀寫服務(wù)膀曾。

noeviction:

不會(huì)繼續(xù)服務(wù)寫請(qǐng)求 (DEL 請(qǐng)求可以繼續(xù)服務(wù))县爬,讀請(qǐng)求可以繼續(xù)進(jìn)行。這樣可以保證不會(huì)丟失數(shù)據(jù)添谊,但是會(huì)讓線上的業(yè)務(wù)不能持續(xù)進(jìn)行财喳。這是默認(rèn)的淘汰策略。

volatile-lru:
嘗試淘汰設(shè)置了過期時(shí)間的 key斩狱,最少使用的 key 優(yōu)先被淘汰耳高。沒有設(shè)置過期時(shí)間的 key 不會(huì)被淘汰,這樣可以保證需要持久化的數(shù)據(jù)不會(huì)突然丟失所踊。

volatile-ttl:
跟上面一樣泌枪,除了淘汰的策略不是 LRU,而是 key 的剩余壽命 ttl 的值秕岛,ttl 越小越優(yōu)先被淘汰碌燕。

volatile-random:
跟上面一樣乍赫,不過淘汰的 key 是過期 key 集合中隨機(jī)的 key。

allkeys-lru:
區(qū)別于 volatile-lru陆蟆,這個(gè)策略要淘汰的 key 對(duì)象是全體的 key 集合雷厂,而不只是過期的 key 集合。這意味著沒有設(shè)置過期時(shí)間的 key 也會(huì)被淘汰叠殷。
allkeys-random跟上面一樣改鲫,不過淘汰的策略是隨機(jī)的 key。

volatile-xxx :
策略只會(huì)針對(duì)帶過期時(shí)間的 key 進(jìn)行淘汰林束,allkeys-xxx 策略會(huì)對(duì)所有的 key 進(jìn)行淘汰像棘。如果你只是拿 Redis 做緩存,那應(yīng)該使用 allkeys-xxx壶冒,客戶端寫緩存時(shí)不必?cái)y帶過期時(shí)間缕题。如果你還想同時(shí)使用 Redis 的持久化功能,那就使用 volatile-xxx 策略胖腾,這樣可以保留沒有設(shè)置過期時(shí)間的 key烟零,它們是永久的 key 不會(huì)被 LRU 算法淘汰。


如有問題歡迎留言咸作,感覺有幫助锨阿,可以點(diǎn)個(gè)喜歡:)。
如需轉(zhuǎn)載记罚,請(qǐng)注明出處墅诡,謝謝:)。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末桐智,一起剝皮案震驚了整個(gè)濱河市末早,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌说庭,老刑警劉巖然磷,帶你破解...
    沈念sama閱讀 207,248評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異口渔,居然都是意外死亡样屠,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門缺脉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人悦穿,你說我怎么就攤上這事攻礼。” “怎么了栗柒?”我有些...
    開封第一講書人閱讀 153,443評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵礁扮,是天一觀的道長(zhǎng)知举。 經(jīng)常有香客問我,道長(zhǎng)太伊,這世上最難降的妖魔是什么雇锡? 我笑而不...
    開封第一講書人閱讀 55,475評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮僚焦,結(jié)果婚禮上锰提,老公的妹妹穿的比我還像新娘。我一直安慰自己芳悲,他們只是感情好立肘,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,458評(píng)論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著名扛,像睡著了一般谅年。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上肮韧,一...
    開封第一講書人閱讀 49,185評(píng)論 1 284
  • 那天融蹂,我揣著相機(jī)與錄音,去河邊找鬼弄企。 笑死殿较,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的桩蓉。 我是一名探鬼主播淋纲,決...
    沈念sama閱讀 38,451評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼院究!你這毒婦竟也來了洽瞬?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,112評(píng)論 0 261
  • 序言:老撾萬榮一對(duì)情侶失蹤业汰,失蹤者是張志新(化名)和其女友劉穎伙窃,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體样漆,經(jīng)...
    沈念sama閱讀 43,609評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡为障,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,083評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了放祟。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片鳍怨。...
    茶點(diǎn)故事閱讀 38,163評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖跪妥,靈堂內(nèi)的尸體忽然破棺而出鞋喇,到底是詐尸還是另有隱情,我是刑警寧澤眉撵,帶...
    沈念sama閱讀 33,803評(píng)論 4 323
  • 正文 年R本政府宣布侦香,位于F島的核電站落塑,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏罐韩。R本人自食惡果不足惜憾赁,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,357評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望散吵。 院中可真熱鬧龙考,春花似錦、人聲如沸错蝴。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,357評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽顷锰。三九已至柬赐,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間官紫,已是汗流浹背肛宋。 一陣腳步聲響...
    開封第一講書人閱讀 31,590評(píng)論 1 261
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留束世,地道東北人酝陈。 一個(gè)月前我還...
    沈念sama閱讀 45,636評(píng)論 2 355
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像毁涉,于是被迫代替她去往敵國(guó)和親沉帮。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,925評(píng)論 2 344

推薦閱讀更多精彩內(nèi)容

  • 一贫堰、Redis高可用概述 在介紹Redis高可用之前穆壕,先說明一下在Redis的語境中高可用的含義。 我們知道其屏,在w...
    空語閱讀 1,593評(píng)論 0 2
  • 轉(zhuǎn)自:https://www.toutiao.com/a6708324379190624782/ 使用 Redis...
    大魚燉海棠閱讀 434評(píng)論 0 1
  • 企業(yè)級(jí)redis集群架構(gòu)的特點(diǎn) 海量數(shù)據(jù) 高并發(fā) 高可用 要達(dá)到高可用喇勋,持久化是不可減少的,持久化主要是做災(zāi)難恢復(fù)...
    lucode閱讀 2,193評(píng)論 0 7
  • 在上一篇文章中對(duì)Redis的兩種持久化方式進(jìn)行了介紹偎行,還介紹了各自的優(yōu)缺點(diǎn)以及如何選擇川背,這篇文章就介紹一下...
    mkdlp閱讀 1,311評(píng)論 0 1
  • Redis雜談 Redis是近年來發(fā)展迅速的內(nèi)存數(shù)據(jù)庫(kù),網(wǎng)上也已經(jīng)有多Redis的文章蛤袒。但不管是英文還是中文熄云,多數(shù)...
    迷失于重逢閱讀 1,534評(píng)論 0 14