Java知識點系統(tǒng)整理之Redis

RDB和AOF機制

首先刑巧,我們必須清楚的一點喧兄,Redis是內存數(shù)據(jù)庫,如果不進行持久化啊楚,服務器在宕機或退出的時候吠冤,數(shù)據(jù)就會丟失,所以需要實現(xiàn)持久化恭理。

  • RDB(Redis Database)通過快照的形式將數(shù)據(jù)保存到磁盤中拯辙。RDB的實現(xiàn)是先fork出一個子進程,在指定的時間間隔內將內存中的數(shù)據(jù)集快照寫入臨時文件中蚯斯,寫入成功后薄风,覆蓋最終的RDB文件,用二進制壓縮存儲拍嵌。默認文件名為dump.rdb遭赂。RDB也是Redis默認的持久化機制。
  • AOF(Append Only-file)持久化的實現(xiàn)横辆,是將所有的寫命令都記錄下來撇他,以aof文件的形式進行記錄(在aof文件中,我們可以看到具體的命令)狈蚤,在redis啟動之后困肩,會讀取該文件,重新構建出內存中的數(shù)據(jù)脆侮,默認情況下AOF機制是關閉的锌畸,需要使用的時候需要進行配置。
    Redis持久化的兩種方式:RDB與AOF(詳解)

Redis的數(shù)據(jù)結構有哪幾種?

  • string(字符串)
  • list(列表)
  • hash(字典)
  • set(集合)
  • zset(有序集合)

Redis的過期鍵的刪除策略靖避?

對于過期鍵一般有三種刪除策略

  • 定時刪除:在設置鍵的過期時間的同時潭枣,創(chuàng)建一個定時器(timer)比默,讓定時器在鍵的過期時間來臨時,立即執(zhí)行對鍵的刪除操作盆犁;
  • 惰性刪除:放任鍵過期不管命咐,但是每次從鍵空間中獲取鍵時,都檢查取得的鍵是否過期谐岁,如果過期的話醋奠,就刪除該鍵;如果沒有過期伊佃,那就返回該鍵窜司;
  • 定期刪除:每隔一段時間,程序就對數(shù)據(jù)庫進行一次檢查航揉,刪除里面的過期鍵例证。至于刪除多少過期鍵,以及要檢查多少個數(shù)據(jù)庫迷捧,則由算法決定织咧。

三種策略的優(yōu)缺比較:

  • 定時刪除策略對內存是最友好的:通過使用定時器,定時刪除策略可以保證過期鍵會盡可能快地被刪除漠秋,并釋放過期鍵所占用的內存笙蒙;但另一方面,定時刪除策略的缺點是庆锦,他對CPU是最不友好的:在過期鍵比較多的情況下捅位,刪除過期鍵這一行為可能會占用相當一部分CPU時間,在內存不緊張但是CPU時間非常緊張的情況下搂抒,將CPU時間用在刪除和當前任務無關的過期鍵上艇搀,無疑會對服務器的響應時間和吞吐量造成影響;
  • 惰性刪除策略對CPU時間來說是最友好的:程序只會在取出鍵時才對鍵進行過期檢查求晶,這可以保證刪除過期鍵的操作只會在非做不可的情況下進行焰雕;惰性刪除策略的缺點是,它對內存是最不友好的:如果一個鍵已經(jīng)過期芳杏,而這個鍵又仍然保留在數(shù)據(jù)庫中矩屁,那么只要這個過期鍵不被刪除,它所占用的內存就不會釋放爵赵;
  • 定時刪除占用太多CPU時間吝秕,影響服務器的響應時間和吞吐量;惰性刪除浪費太多內存空幻,有內存泄漏的危險烁峭。定期刪除策略是前兩種策略的一種整合和折中:
    1.定期刪除策略每隔一段時間執(zhí)行一次刪除過期鍵操作,并通過限制刪除操作執(zhí)行的時長和頻率來減少刪除操作對CPU時間的影響秕铛;
    2.通過定期刪除過期鍵约郁,定期刪除策略有效地減少了因為過期鍵而帶來的內存浪費耘柱;
    3.定期刪除策略的難點是確定刪除操作執(zhí)行的時長和頻率。

Redis線程模型棍现,單線程為什么快?

1.Redis線程模型镜遣?
多路I/O復用模型是利用 select己肮、poll、epoll 可以同時監(jiān)察多個流的 I/O 事件的能力悲关,在空閑的時候谎僻,會把當前線程阻塞掉,當有一個或多個流有 I/O 事件時寓辱,就從阻塞態(tài)中喚醒艘绍,于是程序就會輪詢一遍所有的流(epoll 是只輪詢那些真正發(fā)出了事件的流),并且只依次順序的處理就緒的流秫筏,這種做法就避免了大量的無用操作诱鞠。

這里“多路”指的是多個網(wǎng)絡連接,“復用”指的是復用同一個線程这敬。采用多路 I/O 復用技術可以讓單個線程高效的處理多個連接請求(盡量減少網(wǎng)絡 IO 的時間消耗)航夺,且 Redis 在內存中操作數(shù)據(jù)的速度非常快崔涂,也就是說內存內的操作不會成為影響Redis性能的瓶頸阳掐,主要由以上幾點造就了 Redis 具有很高的吞吐量。

2.Redis為什么這么快

  • 完全基于內存冷蚂,絕大部分請求是純粹的內存操作缭保,非常快速蝙茶。數(shù)據(jù)存在內存中艺骂,類似于HashMap,HashMap的優(yōu)勢就是查找和操作的時間復雜度都是O(1)隆夯;
  • 數(shù)據(jù)結構簡單彻亲,對數(shù)據(jù)操作也簡單,Redis中的數(shù)據(jù)結構是專門進行設計的吮廉;
  • 采用單線程苞尝,避免了不必要的上下文切換和競爭條件,也不存在多進程或者多線程導致的切換而消耗 CPU宦芦,不用去考慮各種鎖的問題宙址,不存在加鎖釋放鎖操作,沒有因為可能出現(xiàn)死鎖而導致的性能消耗调卑;
  • 使用多路I/O復用模型抡砂,非阻塞IO大咱;
  • 使用底層模型不同,它們之間底層實現(xiàn)方式以及與客戶端之間通信的應用協(xié)議不一樣注益,Redis直接自己構建了VM 機制 碴巾,因為一般的系統(tǒng)調用系統(tǒng)函數(shù)的話,會浪費一定的時間去移動和請求丑搔;

3.為什么Redis是單線程的厦瓢?
官方FAQ表示,因為Redis是基于內存的操作啤月,CPU不是Redis的瓶頸煮仇,Redis的瓶頸最有可能是機器內存的大小或者網(wǎng)絡帶寬。既然單線程容易實現(xiàn)谎仲,而且CPU不會成為瓶頸浙垫,那就順理成章地采用單線程的方案了(畢竟采用多線程會有很多麻煩!)郑诺。

參考為什么說Redis是單線程的以及Redis為什么這么快夹姥!

緩存穿透 緩存擊穿 緩存雪崩

  • 緩存穿透是指緩存和數(shù)據(jù)庫中都沒有的數(shù)據(jù),而用戶不斷發(fā)起請求辙诞,如發(fā)起為id為“-1”的數(shù)據(jù)或id為特別大不存在的數(shù)據(jù)佃声。這時的用戶很可能是攻擊者,攻擊會導致數(shù)據(jù)庫壓力過大倘要。
  • 緩存擊穿是指緩存中沒有但數(shù)據(jù)庫中有的數(shù)據(jù)(一般是緩存時間到期)圾亏,這時由于并發(fā)用戶特別多,同時讀緩存沒讀到數(shù)據(jù)封拧,又同時去數(shù)據(jù)庫去取數(shù)據(jù)志鹃,引起數(shù)據(jù)庫壓力瞬間增大,造成過大壓力
  • 緩存雪崩是指緩存中數(shù)據(jù)大批量到過期時間泽西,而查詢數(shù)據(jù)量巨大曹铃,引起數(shù)據(jù)庫壓力過大甚至down機。和緩存擊穿不同的是捧杉, 緩存擊穿指并發(fā)查同一條數(shù)據(jù)陕见,緩存雪崩是不同數(shù)據(jù)都過期了,很多數(shù)據(jù)都查不到從而查數(shù)據(jù)庫味抖。

簡述redis事物實現(xiàn)评甜?

Redis事務的實現(xiàn)原理
Redis通過MULTI、EXEC仔涩、WATCH忍坷、DISCARD等命令來實現(xiàn)事務功能。主要有以下三個階段:

  • 事務開始:MULTI命令的執(zhí)行,標識著一個事務的開始佩研。MULTI命令會將客戶端狀態(tài)的flags屬性中打開REDIS_MULTI標識來完成的柑肴。
  • 命令入隊:當一個客戶端切換到事務狀態(tài)之后,服務器會根據(jù)這個客戶端發(fā)送來的命令來執(zhí)行不同的操作旬薯。如果客戶端發(fā)送的命令為MULTI晰骑、EXEC、WATCH绊序、DISCARD中的一個硕舆,立即執(zhí)行這個命令,否則將命令放入一個事務隊列里面政模,然后向客戶端返回QUEUED回復
  • 事務執(zhí)行:當一個處于事務狀態(tài)的客戶端向服務器發(fā)送EXEC命令時,服務器會遍歷這個客戶端的事務隊列蚂会,執(zhí)行隊列中保存的所有命令淋样,最后將執(zhí)行完的結果全部返回給客戶端(每個命令對應一個返回)
  • WATCH命令的實現(xiàn):WATCH命令是一個樂觀鎖,它可以在EXEC命令執(zhí)行之前胁住,監(jiān)視任意數(shù)量的數(shù)據(jù)庫鍵趁猴,并在執(zhí)行EXEC命令時,檢查被監(jiān)視的鍵是否至少有一個已經(jīng)被修改彪见,如果有儡司,服務器拒絕執(zhí)行事務,向客戶端返回代表事務執(zhí)行失敗的空回復

Redis事務的ACID性質

  • 原子性:對于Redis的事務功能來說余指,事務隊列中的命令要么就全部執(zhí)行捕犬,要么就一個都不執(zhí)行,但是Redis的事務是不支持回滾操作的酵镜;
  • 一致性:Redis通過謹慎的錯誤檢測和簡單的設計保證事務的一致性碉碉。Redis事務可能出錯的地方以及解決方案:
    1.入隊錯誤:如果一個事務在入隊命令的過程中發(fā)現(xiàn)命令不存在或者命令格式不正確,Redis將拒絕執(zhí)行這個事務淮韭;
    2.執(zhí)行錯誤:事務在執(zhí)行的過程中發(fā)生錯誤的命令會被服務器識別出來垢粮,并進行相應的錯誤處理,所以這些出錯的命令不會對數(shù)據(jù)庫做任何修改靠粪,也不會對事務的一致性產生任何影響蜡吧;
    3.服務器停機:如果Redis服務器在執(zhí)行事務的過程中停機,且服務器運行在任意模式下(無持久化的內存模式占键、RDB模式或者AOF模式)昔善,事務執(zhí)行中途發(fā)生的停機都不會影響數(shù)據(jù)庫的一致性;
  • 隔離性:Redis使用單線程的方式執(zhí)行事務畔乙,并且服務器保證在執(zhí)行事務期間不會對事務進行中斷耀鸦,因此,Redis的事務總是串行的方式運行,并且事務總是具有隔離性的袖订;
    4.耐久性:當服務器運行在AOF持久化模式下氮帐,并且appendfsync選項的值是always時,事務是具有耐久性的洛姑,其他情況不具有耐久性;

Redis事務的實現(xiàn)原理

Redis集群方案上沐?

Redis主從復制的核心原理?

1.什么是主從復制楞艾?
主從復制参咙,是指將一臺Redis服務器的數(shù)據(jù),復制到其他的Redis服務器硫眯。前者稱為主節(jié)點(master)蕴侧,后者稱為從節(jié)點(slave);
2.為什么要主從復制两入?

  • 數(shù)據(jù)冗余:主從復制實現(xiàn)了數(shù)據(jù)的熱備份净宵,是持久化之外的一種數(shù)據(jù)冗余方式。
  • 故障恢復:當主節(jié)點出現(xiàn)問題時裹纳,可以由從節(jié)點提供服務择葡,實現(xiàn)快速的故障恢復;實際上是一種服務的冗余剃氧。
  • 負載均衡:在主從復制的基礎上敏储,配合讀寫分離,可以由主節(jié)點提供寫服務朋鞍,由從節(jié)點提供讀服務(即寫Redis數(shù)據(jù)時應用連接主節(jié)點已添,讀Redis數(shù)據(jù)時應用連接從節(jié)點),分擔服務器負載滥酥;尤其是在寫少讀多的場景下酝碳,通過多個從節(jié)點分擔讀負載,可以大大提高Redis服務器的并發(fā)量恨狈。
  • 高可用基石:主從復制還是哨兵和集群能夠實施的基礎疏哗,因此說主從復制是Redis高可用的基礎。

3.主從復制可能會造成的問題禾怠?
4.主從復制的核心原理返奉?

CAP理論 BASE理論

負載均衡算法、類型吗氏?

負載均衡(Load balancing)是一種計算機技術芽偏,用來在多個計算機(計算機集群)、網(wǎng)絡連接弦讽、CPU污尉、磁盤驅動器或其他資源中分配負載膀哲,以達到最優(yōu)化資源使用、最大化吞吐率被碗、最小化響應時間驳阎、同時避免過載的目的木柬。 使用帶有負載均衡的多個服務器組件疯特,取代單一的組件荆姆,可以通過冗余提高可靠性。負載均衡服務通常是由專用軟件和硬件來完成焚志。 主要作用是將大量作業(yè)合理地分攤到多個操作單元上進行執(zhí)行衣迷,用于解決互聯(lián)網(wǎng)架構中的高并發(fā)和高可用的問題。
類型

  • 輪詢法:每個請求按時間順序逐一分配到不同的后端服務器酱酬,如果服務器down掉壶谒,能自動剔除。
  • weight(權重):指定輪詢幾率膳沽,weight和訪問比率成正比汗菜,用于服務器性能不均的情況。
  • ip_hash:每個請求按訪問ip的hash結果分配贵少,這樣每個訪客固定訪問一個服務器呵俏,可以解決session的問題堆缘。
  • fair(第三方):按服務器的響應時間來分配請求滔灶,響應時間短的優(yōu)先分配。
  • url_hash(第三方):按訪問url的hash結果來分配請求吼肥,使每個url定向到同一個服務器录平,服務器為緩存時比較有效。在upstream中加入hash語句缀皱,server語句中不能寫入weight等其他的參數(shù)斗这,hash_method使用的是hash算法。

負載均衡的算法種類

分布式架構下啤斗,session共享有什么方案表箭?

分布式架構下,session共享有什么方案么钮莲?

簡述你對RPC免钻、RMI的理解?

分布式id的生成方案崔拥?

  1. 數(shù)據(jù)庫自增長序列或字段
  2. UUID
  3. UUID的變種:為了解決UUID不可讀极舔,可以使用UUID to Int64的方法。
  4. Redis生成ID
  5. Twitter的snowflake算法
  6. 利用zookeeper生成唯一ID
  7. MongoDB的ObjectId
  8. TiDB的主鍵

分布式鎖解決方案链瓦?

  • 數(shù)據(jù)庫
  • redis
  • zookeeper

分布式事務解決方案拆魏?

分布式鎖簡單入門以及三種實現(xiàn)方式介紹

如何實現(xiàn)接口冪等性?

冪等性說的是:如何防止接口的重復無效請求。
對于一個接口而言渤刃,無論調用了多少次拥峦,最終得到的結果都是一樣的。

四種解決方法:
前端攔截溪掀。不安全事镣,可能被專業(yè)人士修改,跳過該過程揪胃。
使用數(shù)據(jù)庫實現(xiàn)冪等性
使用 JVM 鎖實現(xiàn)冪等性璃哟。缺點:只能引用于單機環(huán)境
使用分布式鎖實現(xiàn)冪等性。通常使用redis或者zookeeper實現(xiàn)分布式鎖喊递。保證分布式鎖的key是業(yè)務id的唯一標識随闪。

如何實現(xiàn)接口冪等性?什么是冪等性

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末骚勘,一起剝皮案震驚了整個濱河市铐伴,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌俏讹,老刑警劉巖当宴,帶你破解...
    沈念sama閱讀 212,884評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異泽疆,居然都是意外死亡户矢,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,755評論 3 385
  • 文/潘曉璐 我一進店門殉疼,熙熙樓的掌柜王于貴愁眉苦臉地迎上來梯浪,“玉大人,你說我怎么就攤上這事瓢娜」衣澹” “怎么了?”我有些...
    開封第一講書人閱讀 158,369評論 0 348
  • 文/不壞的土叔 我叫張陵眠砾,是天一觀的道長虏劲。 經(jīng)常有香客問我,道長褒颈,這世上最難降的妖魔是什么柒巫? 我笑而不...
    開封第一講書人閱讀 56,799評論 1 285
  • 正文 為了忘掉前任,我火速辦了婚禮哈肖,結果婚禮上吻育,老公的妹妹穿的比我還像新娘。我一直安慰自己淤井,他們只是感情好布疼,可當我...
    茶點故事閱讀 65,910評論 6 386
  • 文/花漫 我一把揭開白布摊趾。 她就那樣靜靜地躺著,像睡著了一般游两。 火紅的嫁衣襯著肌膚如雪砾层。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,096評論 1 291
  • 那天贱案,我揣著相機與錄音肛炮,去河邊找鬼。 笑死宝踪,一個胖子當著我的面吹牛侨糟,可吹牛的內容都是我干的。 我是一名探鬼主播瘩燥,決...
    沈念sama閱讀 39,159評論 3 411
  • 文/蒼蘭香墨 我猛地睜開眼秕重,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了厉膀?” 一聲冷哼從身側響起溶耘,我...
    開封第一講書人閱讀 37,917評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎服鹅,沒想到半個月后凳兵,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,360評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡企软,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,673評論 2 327
  • 正文 我和宋清朗相戀三年庐扫,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片澜倦。...
    茶點故事閱讀 38,814評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡聚蝶,死狀恐怖杰妓,靈堂內的尸體忽然破棺而出藻治,到底是詐尸還是另有隱情,我是刑警寧澤巷挥,帶...
    沈念sama閱讀 34,509評論 4 334
  • 正文 年R本政府宣布桩卵,位于F島的核電站,受9級特大地震影響倍宾,放射性物質發(fā)生泄漏雏节。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 40,156評論 3 317
  • 文/蒙蒙 一高职、第九天 我趴在偏房一處隱蔽的房頂上張望钩乍。 院中可真熱鬧,春花似錦怔锌、人聲如沸寥粹。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽涝涤。三九已至媚狰,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間阔拳,已是汗流浹背崭孤。 一陣腳步聲響...
    開封第一講書人閱讀 32,123評論 1 267
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留糊肠,地道東北人辨宠。 一個月前我還...
    沈念sama閱讀 46,641評論 2 362
  • 正文 我出身青樓,卻偏偏與公主長得像货裹,于是被迫代替她去往敵國和親彭羹。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,728評論 2 351

推薦閱讀更多精彩內容