redis總結(jié)

Redis

Redis是一個(gè)基于內(nèi)存的高性能key-value數(shù)據(jù)庫

特點(diǎn)

  • Redis本質(zhì)上是一個(gè)Key-Value類型的內(nèi)存數(shù)據(jù)庫,很像memcached,整個(gè)數(shù)據(jù)庫統(tǒng)統(tǒng)加載在內(nèi)存當(dāng)中進(jìn)行操作,定期通過異步操作把數(shù)據(jù)庫數(shù)據(jù)flush到硬盤上進(jìn)行保存。因?yàn)槭羌儍?nèi)存操作,Redis的性能非常出色,每秒可以處理超過10萬次讀寫操作,是已知性能最快的Key-Value DB
  • Redis是支持保存多種數(shù)據(jù)結(jié)構(gòu),此外單個(gè)value的最大限制是1GB,不像 memcached只能保存1MB的數(shù)據(jù),因此Redis可以用來實(shí)現(xiàn)很多有用的功能,比方說用他的List來做FIFO雙向鏈表,實(shí)現(xiàn)一個(gè)輕量級(jí)的高性能消息隊(duì)列服務(wù),用他的Set可以做高性能的tag系統(tǒng)等等。另外Redis也可以對(duì)存入的Key-Value設(shè)置expire時(shí)間,因此也可以被當(dāng)作一 個(gè)功能加強(qiáng)版的memcached來用。
  • 主要缺點(diǎn)是數(shù)據(jù)庫容量受到物理內(nèi)存的限制,不能用作海量數(shù)據(jù)的高性能讀寫,因此Redis適合的場(chǎng)景主要局限在較小數(shù)據(jù)量的高性能操作和運(yùn)算上。

支持的數(shù)據(jù)類型

  • Strings
  • Lists
  • Sets
  • Sorted Set
  • hashes

為什么redis需要把所有數(shù)據(jù)放到內(nèi)存中?

Redis為了達(dá)到最快的讀寫速度將數(shù)據(jù)都讀到內(nèi)存中,并通過異步的方式將數(shù)據(jù)寫入磁盤。所以redis具有快速和數(shù)據(jù)持久化的特征。如果不將數(shù)據(jù)放在內(nèi)存中,磁盤I/O速度為嚴(yán)重影響redis的性能

單進(jìn)程,單線程

  • redis利用隊(duì)列技術(shù)將并發(fā)訪問變?yōu)榇性L問,消除了傳統(tǒng)數(shù)據(jù)庫串行控制的開銷

分布式

  • redis支持主從的模式。原則:Master會(huì)將數(shù)據(jù)同步到slave,而slave不會(huì)將數(shù)據(jù)同步到master。Slave啟動(dòng)時(shí)會(huì)連接master來同步數(shù)據(jù)。
  • 這是一個(gè)典型的分布式讀寫分離模型。我們可以利用master來插入數(shù)據(jù),slave提供檢索服務(wù)。這樣可以有效減少單個(gè)機(jī)器的并發(fā)訪問數(shù)量

讀寫分離

  • 通過增加Slave DB的數(shù)量,讀的性能可以線性增長。為了避免Master DB的單點(diǎn)故障,集群一般都會(huì)采用兩臺(tái)Master DB做雙機(jī)熱備,所以整個(gè)集群的讀和寫的可用性都非常高。
  • 讀寫分離架構(gòu)的缺陷在于,不管是Master還是Slave,每個(gè)節(jié)點(diǎn)都必須保存完整的數(shù)據(jù),如果在數(shù)據(jù)量很大的情況下,集群的擴(kuò)展能力還是受限于單個(gè)節(jié)點(diǎn)的存儲(chǔ)能力,而且對(duì)于Write-intensive類型的應(yīng)用,讀寫分離架構(gòu)并不適合。

數(shù)據(jù)分片

  • 為了解決讀寫分離模型的缺陷
  • 將每個(gè)節(jié)點(diǎn)看成都是獨(dú)立的master,然后通過業(yè)務(wù)實(shí)現(xiàn)數(shù)據(jù)分片

使用redis好處

  • 速度快,因?yàn)閿?shù)據(jù)存在內(nèi)存中,類似于HashMap,HashMap的優(yōu)勢(shì)就是查找和操作的時(shí)間復(fù)雜度都是O(1)
  • 支持豐富數(shù)據(jù)類型,支持string,list,set,sorted set,hash
  • 支持事務(wù),操作都是原子性,所謂的原子性就是對(duì)數(shù)據(jù)的更改要么全部執(zhí)行,要么全部不執(zhí)行
  • 豐富的特性:可用于緩存,消息,按key設(shè)置過期時(shí)間,過期后將會(huì)自動(dòng)刪除

redis相比memcached有哪些優(yōu)勢(shì)

  • memcached所有的值均是簡單的字符串,redis作為其替代者,支持更為豐富的數(shù)據(jù)類型
  • redis的速度比memcached快很多
  • redis可以持久化其數(shù)據(jù)

Redis回收策略

  • volatile-lru:從已設(shè)置過期時(shí)間的數(shù)據(jù)集(server.db[i].expires)中挑選最近最少使用的數(shù)據(jù)淘汰
  • volatile-ttl:從已設(shè)置過期時(shí)間的數(shù)據(jù)集(server.db[i].expires)中挑選將要過期的數(shù)據(jù)淘汰
  • volatile-random:從已設(shè)置過期時(shí)間的數(shù)據(jù)集(server.db[i].expires)中任意選擇數(shù)據(jù)淘汰
  • allkeys-lru:從數(shù)據(jù)集(server.db[i].dict)中挑選最近最少使用的數(shù)據(jù)淘汰
  • allkeys-random:從數(shù)據(jù)集(server.db[i].dict)中任意選擇數(shù)據(jù)淘汰
  • no-enviction(驅(qū)逐):禁止驅(qū)逐數(shù)據(jù)

緩存穿透

一般的緩存系統(tǒng),都是按照key去緩存查詢,如果不存在對(duì)應(yīng)的value,就應(yīng)該去后端系統(tǒng)查找(比如DB)。如果key對(duì)應(yīng)的value是一定不存在的,并且對(duì)該key并發(fā)請(qǐng)求量很大,就會(huì)對(duì)后端系統(tǒng)造成很大的壓力。這就叫做緩存穿透

  • 如果查詢數(shù)據(jù)庫也為空,直接設(shè)置一個(gè)默認(rèn)值存放到緩存,這樣第二次到緩沖中獲取就有值了,而不會(huì)繼續(xù)訪問數(shù)據(jù)庫,

緩存雪崩

緩存服務(wù)器重啟或者大量緩存到期時(shí)間一致,集中在某個(gè)時(shí)間段失效,這樣在失效的時(shí)候給后臺(tái)帶來很大的壓力

  • 并發(fā)量不大的時(shí)候可以選擇加鎖,多個(gè)線程同時(shí)只允許一個(gè)線程請(qǐng)求數(shù)據(jù)庫
  • 給每一個(gè)緩存數(shù)據(jù)增加相應(yīng)的緩存標(biāo)記,記錄緩存的是否失效,如果緩存標(biāo)記失效,則更新數(shù)據(jù)緩存
  • 二級(jí)緩存,兩個(gè)緩存過期時(shí)間設(shè)置不一致,緩存A失效后去緩存B查找

緩存淘汰的策略有兩種: (1) 定時(shí)去清理過期的緩存。 (2)當(dāng)有用戶請(qǐng)求過來時(shí),再判斷這個(gè)請(qǐng)求所用到的緩存是否過期,過期的話就去底層系統(tǒng)得到新數(shù)據(jù)并更新緩存。
兩者各有優(yōu)劣,第一種的缺點(diǎn)是維護(hù)大量緩存的key是比較麻煩的,第二種的缺點(diǎn)就是每次用戶請(qǐng)求過來都要判斷緩存失效,邏輯相對(duì)比較復(fù)雜,具體用哪種方案,大家可以根據(jù)自己的應(yīng)用場(chǎng)景來權(quán)衡。

  1. 預(yù)估失效時(shí)間 2. 版本號(hào)(必須單調(diào)遞增,時(shí)間戳是最好的選擇)3. 提供手動(dòng)清理緩存的接口。

Redis哨兵(Redis Sentinel)

Redis 的主從復(fù)制模式下,一旦主節(jié)點(diǎn)由于故障不能提供服務(wù),需要手動(dòng)將從節(jié)點(diǎn)晉升為主節(jié)點(diǎn),同時(shí)還要通知客戶端更新主節(jié)點(diǎn)地址,這種故障處理方式從一定程度上是無法接受的。Redis 2.8 以后提供了 Redis Sentinel哨兵機(jī)制來解決這個(gè)問題

Redis哨兵是用來管理多個(gè)redis實(shí)例的工具,可以實(shí)現(xiàn)對(duì)redis的監(jiān)控、通知和自動(dòng)故障轉(zhuǎn)移

基本名詞說明:

基本名詞 邏輯結(jié)構(gòu) 物理結(jié)構(gòu)
Redis數(shù)據(jù)節(jié)點(diǎn) 主節(jié)點(diǎn)和從節(jié)點(diǎn) 主節(jié)點(diǎn)和從節(jié)點(diǎn)的進(jìn)程
主節(jié)點(diǎn)(master) Redis主數(shù)據(jù)庫 一個(gè)獨(dú)立的Redis進(jìn)程
從節(jié)點(diǎn)(slave) Redis從數(shù)據(jù)庫 一個(gè)獨(dú)立的Redis進(jìn)程
Sentinel節(jié)點(diǎn) 監(jiān)控Redis數(shù)據(jù)節(jié)點(diǎn) 一個(gè)獨(dú)立的Sentinel進(jìn)程
Sentinel節(jié)點(diǎn)集合 若干Sentinel節(jié)點(diǎn)的抽象組合 若干Sentinel節(jié)點(diǎn)進(jìn)程
Redis Sentinel Redis高可用實(shí)現(xiàn)方案 Sentinel節(jié)點(diǎn)集合和Redis數(shù)據(jù)節(jié)點(diǎn)進(jìn)程
應(yīng)用客戶端 泛指一個(gè)或多個(gè)客戶端 一個(gè)或者多個(gè)客戶端進(jìn)程或者線程
Redis的主從復(fù)制模式和Sentinel 高可用架構(gòu)的示意圖

Redis主從復(fù)制的問題

Redis 主從復(fù)制 可將 主節(jié)點(diǎn) 數(shù)據(jù)同步給 從節(jié)點(diǎn),從節(jié)點(diǎn)此時(shí)有兩個(gè)作用:
1、一旦主節(jié)點(diǎn)宕機(jī),從節(jié)點(diǎn)作為主節(jié)點(diǎn)的備份可以隨時(shí)頂上來。
2、擴(kuò)展主節(jié)點(diǎn)的讀能力,分擔(dān)主節(jié)點(diǎn)讀壓力

主從復(fù)制 同時(shí)存在以下幾個(gè)問題:

  • 一旦主節(jié)點(diǎn)宕機(jī),從節(jié)點(diǎn)晉升成主節(jié)點(diǎn),同時(shí)需要修改應(yīng)用方的主節(jié)點(diǎn)地址,還需要命令所有從節(jié)點(diǎn)去復(fù)制 新的主節(jié)點(diǎn),整個(gè)過程需要人工干預(yù)。
  • 主節(jié)點(diǎn)的寫能力受到單機(jī)的限制。
  • 主節(jié)點(diǎn) 的存儲(chǔ)能力受到單機(jī)的限制。
  • 原生復(fù)制的弊端在早期的版本中也會(huì)比較突出,比如:Redis 復(fù)制中斷后,從節(jié)點(diǎn)會(huì)發(fā)起 psync。此時(shí)如果同步不成功,則會(huì)進(jìn)行全量同步,主庫執(zhí)行全量備份的同時(shí),可能會(huì)造成毫秒或秒級(jí)的卡頓。

Redis集群

Redis 集群是一個(gè)可以在多個(gè) Redis 節(jié)點(diǎn)之間進(jìn)行數(shù)據(jù)共享的設(shè)施

Redis 集群通過分區(qū)(partition)來提供一定程度的可用性(availability): 即使集群中有一部分節(jié)點(diǎn)失效或者無法進(jìn)行通訊, 集群也可以繼續(xù)處理命令請(qǐng)求。
Redis 集群提供了以下兩個(gè)好處:

  • 將數(shù)據(jù)自動(dòng)切分(split)到多個(gè)節(jié)點(diǎn)的能力。
  • 當(dāng)集群中的一部分節(jié)點(diǎn)失效或者無法進(jìn)行通訊時(shí), 仍然可以繼續(xù)處理命令請(qǐng)求的能力。
數(shù)據(jù)分片

Redis 集群使用數(shù)據(jù)分片(sharding)而非一致性哈希(consistency hashing)來實(shí)現(xiàn): 一個(gè) Redis 集群包含 16384 個(gè)哈希槽(hash slot), 數(shù)據(jù)庫中的每個(gè)鍵都屬于這 16384 個(gè)哈希槽的其中一個(gè), 集群使用公式 CRC16(key) % 16384 來計(jì)算鍵 key 屬于哪個(gè)槽, 其中 CRC16(key) 語句用于計(jì)算鍵 key 的 CRC16 校驗(yàn)和 。

集群中的每個(gè)節(jié)點(diǎn)負(fù)責(zé)處理一部分哈希槽

https://segmentfault.com/a/1190000014442144

http://www.cnblogs.com/liyasong/p/redis_jiqun.html
redis集群投票機(jī)制

redis集群中有多臺(tái)redis服務(wù)器不可避免會(huì)有服務(wù)器掛掉。redis集群服務(wù)器之間通過互相的ping-pong判斷是否節(jié)點(diǎn)可以連接上。如果有一半以上的節(jié)點(diǎn)去ping一個(gè)節(jié)點(diǎn)的時(shí)候沒有回應(yīng),集群就認(rèn)為這個(gè)節(jié)點(diǎn)宕機(jī)了

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1.什么是redis? Redis 是一個(gè)基于內(nèi)存的高性能key-value數(shù)據(jù)庫。 支持string...
    付存閱讀 520評(píng)論 0 1
  • 1、什么是redis redis是一個(gè) key-value的 高性能 數(shù)據(jù)庫,是基于內(nèi)存的; 2、redis的特點(diǎn)...
    一個(gè)喜歡燒磚的人閱讀 274評(píng)論 0 0
  • 主要內(nèi)容 redis 簡介 為什么要用 redis /為什么要用緩存 為什么要用 redis 而不用 map/gu...
    java成功之路閱讀 643評(píng)論 0 4
  • NOSQL類型簡介鍵值對(duì):會(huì)使用到一個(gè)哈希表,表中有一個(gè)特定的鍵和一個(gè)指針指向特定的數(shù)據(jù),如redis,volde...
    MicoCube閱讀 4,160評(píng)論 2 27
  • 1.1 資料 ,最好的入門小冊(cè)子,可以先于一切文檔之前看,免費(fèi)。 作者Antirez的博客,Antirez維護(hù)的R...
    JefferyLcm閱讀 17,322評(píng)論 1 51

友情鏈接更多精彩內(nèi)容