天天看點

Redis詳解【持久化、讀寫分離、主從同步、哨兵模式】

Redis

知識體系結構:

​ 資料類型、基本操作

​ 持久化AOF/RDB

​ 事務的控制

​ 複制

NoSQL: not only sql 泛指非關系性資料庫,克服了關系性資料庫在【海量資料】和【高并發】情況下的缺點

  • 非關系性資料的特點:
    1. 資料主要存儲在記憶體中,因而讀寫效率高,但斷電易丢失資料。
    2. 有些非關系性資料支援持久化資料到硬碟,如redis
  • 非關系型資料庫的分類:
    1. 鍵值(key-value)型資料庫:代表Redis、MemcacheDB
    2. 列存儲資料庫:代表Hbase
    3. 文檔型資料庫:代表MongoDB
    4. 圖形資料庫
  • 什麼是Redis?

    Redis:Remote Dictionary Server 遠端字典伺服器

    Redis是開源的、C語言寫的非關系性資料庫,鍵值(key-value)型資料庫

  • Redis的特點
    1. 資料存儲在記憶體中,為保證資料安全,能不定期持久化資料到硬碟
    2. Redis支援的五種資料類型:

      字元串【String】、哈希【hash】、清單【list】、集合【set】、有序集合【sorted set】

      • Hash存儲對象的指令:HMSet key field value,其中key為對象名,field為對象的字段名,value為對象的字段值
      • Set存儲對象的指令:SADD key member1 ,其中key為集合名,member1為String類型的元素。

        set是無序集合,元素不能重複

      • ZSet存儲對象的指令:ZADD key score member1,其中key為集合名,score為用于排序分數,member1為String類型的元素。

        (1)zset是有序集合,元素重複,但分數(score)卻可以重複

        (2)添加的key與集合中已經存在,但分值不同,則更新這個分值

        (3)ZSet類型中分數值非常重要

      • Redis的list資料類型是雙向連結清單實作的,set和zset底層是哈希包
    3. 存取速度快,支援高并發、叢集、分布式、主從同步
    4. 支援多種語言的用戶端
    5. 支援存儲過期----存儲過期:存儲資料設定一個有效期,時間到了就沒了,如vip、微信紅包、短信驗證碼
    6. 支援訂閱和釋出
  • Redis的應用場景
  1. 中央緩存:最主要的應用
  2. 計數器和定時器:利用Redis的自增和自減方法
  3. 防止暴力攻擊:登入失敗次數達到指定次數後鎖死,通路量大的時候,采用redis叢集,支援存儲過期(達到一定時長後解鎖)
  • Redis和MemcacheDB的異同:

    MemcacheDB逐漸被Redis取代

    相同點:都是key-value類型的nosql,資料存儲在記憶體中,存取速度快,支援并發和叢集,都支援存儲過期

    不同點:(1)Redis支援的value資料類型比memcached多

    ​ (2)Redis支援持久化資料到硬碟,資料更安全,MemcacheDB隻能存記憶體

Redis的安裝

  1. 下載下傳:Redis官網隻支援linux版本,windows版本由微軟進行維護,需要導GitHub上下載下傳:

    https://github.com/MicrosoftArchive/redis/releases

    Redis的安裝:編譯後的版本免安裝,解壓到指定位置即可

  2. 啟動redis

Windows版的Redis有2個配置檔案,一個是:redis.windows.conf,另一個是redis.windows-service.conf

以服務的方式啟動Redis

注冊服務:redis-server --service-install 配置檔案名【redis.windows-service.conf一般用于注冊服務】

停止服務:redis-server --service-stop

解除安裝服務:redis-server --service-uninstall 【解除安裝服務之前必須停止服務】

開啟服務:redis-server --service-start

直接以dos指令的方式

  • Redis服務端的啟動:Redis服務端目錄下cmd進行dos視窗:redis-server.exe redis.windows.conf
  • Redis自帶用戶端的啟動:

    (1)服務端在本地時,輕按兩下redis-cli.exe,預設取連接配接本地6379端口----這種方式隻能連接配接本地Redis伺服器(2)服務端不在本地時【端口預設為6379】,Redis用戶端目錄的dos視窗下:

    ​ Redis-cli.exe -h ip位址 -p 6379----------這種方式既能連接配接本地,也能連接配接非本地redis伺服器

    注意:在本地時,啟動Redis的服務端和用戶端要分别打開2個dos視窗進行指令操作

  • 界面化的用戶端工具:redis desktop manager

Redis密碼的設定

  • 設定臨時密碼,重新開機就會失效:config set requirepass 密碼

    登入:auth 密碼

    取消密碼:config set requirepass “”—必須登入才能取消

  • 設定永久密碼:

    (1)在配置檔案redis.windows.conf中搜尋requirepass,找到後在【#requirepass】設定密碼

    (2)重新開機redis,服務端啟動時需要加載該檔案

    (3)用戶端密碼登入:auth 密碼

  • Redis的16個資料庫

    Redis預設有16個資料庫,索引為0-15,在redis.windows.conf配置檔案中可以修改。預設使用 0 号資料庫

    • 選擇1号資料庫:select 1
    • 将1号庫的資料移動到5号庫:【move 鍵名 庫的編号】
    • 清空目前資料庫中的所有key:flushdb
    • 清空所有資料庫中的所有key:flushall
    • 請求伺服器關閉與目前用戶端的連接配接:quit
    • 用戶端測試服務端是否正常運作指令:ping ,如果傳回pong,則服務端運作正常

常用簡單指令

  • 檢視Redis資料庫中所有的key:keys *

    Redis模糊查詢指令:keys k?, 其中?隻占一位,也可以用:keys h???

  • 删除某個鍵值對:del age
  • 檢視類型:type age
  • 設定某個某個鍵值對的過期時間:expire sex 30【expire 鍵 時間】

    設定值的時候設定過期時間:setex key 過期時間 value

  • 檢視某個某個鍵值對還有多少秒過期:ttl sex 【檢視鍵為sex的值還有多久過期,-1為永不過期】

    當過期後查詢get sex,顯示為nil【沒有該值】

  • 自增:incr age----age對應的value自增1(如果鍵不存在,則設定初始化age對應的value為0,再加1)

    自減:decr age-----age對應的value自減1(如果鍵不存在,則設定初始化age對應的value為0,再減1)

    增加多少:incrBy age 10 age對應的value值加10

    減少多少:decrBy age 5 age對應的value值加5

String類型的常用指令

  • 單個操作

設定值:set name zs----字元串值 value 關聯到 key

(1)如果key已有value,則覆寫它。

(2)如果已存在的鍵值對存在有效期,則有效期對覆寫後的新值不起作用

擷取值: get name----假如 key 儲存的值不是字元串類型,傳回一個錯誤,因為 GET 隻能用于處理字元串值。

追加值:append name ls-----結果:zsls

  • 批量操作 m字首表示:more

批量設定value值:mset name ls age 18 sex true【mset key1 value1 key2 value2】

批量擷取value值:mget age name【mget key1 key2】

  • 區間操作

getrange key start stop:擷取指定區間的資料

setrange key start value :設定從指定起點開始的内容,覆寫原有内容,未覆寫的保留

不存在相同的key鍵才存儲值:setnx key value【if not exist】
批量也可以:msetnx key1 value1 key2 value2
           

List類型的常用指令

List清單中:0表示第一個元素,1表示第2個元素,-1表示倒數第1個元素,-2表示倒數第2個元素

  • 添加清單元素

lpush key value1 value2:各個 value 值按從左到右的順序依次插入到表頭----傳回值:清單長度

rpush key value1 value2:各個 value 值按從左到右的順序依次插入到表尾----傳回值:清單長度

如果 key 不存在,一個空清單會先建立再執行 lpush/rpush操作

  • 擷取清單元素

lrange key start stop:傳回清單 key 中指定區間内的元素【閉區間】

lrange key 0 -1:查詢清單的所有元素

  • 擷取清單長度:llen key
  • 删除清單元素
lpop key:移除并傳回清單 key 的第一個元素【key為清單名】
rpop key: 移除并傳回清單 key 的最後一個元素
           
lrem key cout value:根據參數 count 的值,移除清單key中與參數 value 相等的元素。
count > 0 : 從表頭開始向表尾搜尋,移除與 value 相等的元素,數量為 count 。
count < 0 : 從表尾開始向表頭搜尋,移除與 value 相等的元素,數量為 count 的絕對值。
count = 0 : 移除表中所有與 value 相等的值。
           
lindex key index:傳回清單 key 中,下标為 index 的元素
ltrim key start stop:讓清單隻保留指定區間内的元素,不在指定區間之内的元素都将被删除
           

Hash類型的常用指令

單個
HSET key field value:将哈希表 key 中的域 field 的值設為 value 
HGET key field:傳回哈希表 key 中給定域 field 的值

批量
HMSET key field value [field value ...]:同時将多個 field-value (域-值)對設定到哈希表 key 中
HMGET key field [field ...]:傳回哈希表 key 中,一個或多個給定域的值


HKEYS key 傳回哈希表 key 中的所有鍵
HVALS key 傳回哈希表 key 中所有域的值
HGETALL key 傳回哈希表 key 中,所有的域和值

hdel obj field value 删除對象裡某個字段
hlen key  擷取對象中的字段個數
hexists obj field  判斷對象中是否存在某個字段,存在傳回1,不存在傳回-1
           

Redis六大最大記憶體淘汰政策

**Redis淘汰政策:**當redis緩存的資料到達配置的最大記憶體後,會按照配置淘汰政策進行淘汰,可以在redis.windows.conf配置檔案中的【 MAXMEMORY POLICY】處進行配置

LRU算法:Least Recently Used 最近最少使用的算法

  1. volatile-lru :在設定了過期時間的Key空間中,移除最近最少使用的key。
  2. allkeys-lru: 在所有Key中,優先移除最近最少使用的key
  3. volatile-random : 在設定了過期時間的key中,随機移除一個鍵
  4. allkeys-random : 在所有Key中,随機移除某個key。
  5. volatile-ttl: 在設定了過期時間的Key中,優先移除最先過期的key
  6. noeviction:不做任何處理,記憶體達到閥值時,傳回錯誤指令

Redis的配置檔案redis.conf

Redis的配置檔案redis.conf中:

  1. daemonize 守護程序,設為yes,背景運作的意思,linux下它不會彈視窗,windows下不起作用
  2. 端口号設定
  3. bind ip位址—綁定位址,Redis伺服器隻能有綁定的IP位址來通路
  4. 資料庫個數,預設16個
  5. 密碼設定requirepass
  6. 配置淘汰政策
  7. 持久化政策
  8. 配置日志等級

Redis的持久化政策

  • 什麼是Redis的持久化政策:通過RDB快照和AOF日志政策來持久化緩存資料,以保證資料安全
  • Redis有兩種持久化政策:RDB快照和AOF日志,RDB預設是開啟的,AOF預設是關閉的

RDB快照

  • RDB快照政策:Redis在【指定時間間隔内】【至少執行了指定次數】的寫操作,就将緩存資料的快照儲存到磁盤中,恢複時直接将快照讀取到記憶體中。
  • RDB快照政策儲存的預設檔案名為dump.rdb,備份時後一次備份會覆寫前一次備份
  • 每次快照持久化都是将記憶體資料完整寫入到新的rdb檔案,并不是隻同步髒資料(更新部分的資料)
  • RDB的缺點:RDB檔案每隔一段時間才會儲存一次記憶體中的緩存資料,一旦發生掉電,伺服器将丢失最後一次寫入的資料
  • 如果想立即備份,則控制台直接輸入:save或者bgsave,不等到指定時間就可以立即備份
  • 禁用RDB政策:在配置檔案中,不要使用任何save指令,或者save “” 【save一個空字元串】
# save ""
save 900 1   -------------900秒内至少有1個更改
save 300 10  -------------300秒内至少有10個更改
save 60 10000-------------60秒内至少有10000個更改

dbfilename dump.rdb-----設定儲存資料的RDB檔案名稱,預設的檔案名為:dump.rdb
dir ./----------------設定RDB檔案的存放目錄,預設本地資料庫目錄下
           
  • RDB快照政策的應用場景:适合大規模的資料恢複
save與bgsave儲存RDB檔案的差別

執行save和bgsave指令後,不必等時間間隔到了再執行

  • Save 指令執行一個同步儲存操作,将緩存中所有資料的快照以RDB檔案的形式儲存到硬碟

    bgsave指令執行後,Redis會fork出一個新子程序,原來的 Redis 程序繼續處理用戶端請求,而子程序則負責将資料儲存到磁盤

  • SAVE 儲存是阻塞主程序,用戶端無法連接配接redis,等SAVE完成後,主程序才開始工作,用戶端可以連接配接。

    BGSAVE 是fork一個save的子程序,在執行save過程中,不影響主程序,用戶端可以正常連結redis,等子程序fork執行save完成後,通知主程序,子程序關閉。

  • BGSAVE方式比較适合線上的維護操作
    Redis詳解【持久化、讀寫分離、主從同步、哨兵模式】

AOF日志

  • AOF政策:Append Only File 以日志的形式來記錄每個寫操作,将Redis執行過的所有寫操作指令記錄下來(讀操作不記錄),每條記錄都追加到AOF日志檔案的末尾。重新開機時,就日志中儲存的寫操作指令從前往後執行一次,來恢複資料
  • AOF日志儲存的預設檔案名為:appendonly.aof
  • AOF政策預設關閉,在redis.windows.conf配置檔案中進行配置
  • AOF日志檔案遵循resp協定編寫。
    Redis詳解【持久化、讀寫分離、主從同步、哨兵模式】
appendonly no  #開關AOF模式-----------yes開啟 no則關閉
appendfilename "appendonly.aof"--------設定儲存資料的AOF檔案名稱,預設檔案名為appendonly.aof
           

注意:

AOF政策和RDB政策可以同時配置,當同時存在dump.rdb和appendonly.aof兩個檔案時,redis啟動時優先加載appendonly.aof 檔案來恢複資料

  • RDB快照檔案是二進制檔案,遠比AOF日志檔案小,恢複時直接加裝檔案到記憶體,AOF日志檔案則是将日志檔案中的指令一條一條執行,效率要比RDB慢
  • Redis啟動時,即有aof檔案,又有rdb檔案,優先選擇aof檔案恢複資料,因為aof檔案資料完整一些。aof需要一條指令一條指令的去恢複,恢複速度相對較慢;rdb是二進制檔案,恢複要快些

RDB快照和AOF日志的修複

修飾時都要從redis-check-aof.exe指令和edis-check-rdb.exe指令所在目錄進入dos視窗執行

  • aof修複指令:redis-check-aof --fix appendonlly.aof

    掃描aof檔案找出第一個出錯的指令,并且删除出錯指令之後的所有指令,隻保留那些為出錯的指令,在大多情況下,被删除的都是aof檔案末尾的不完整的指令

  • rdb修複指令:redis-check-rdb --fix dump.rdb

    目前沒有辦法修複出錯的快照檔案,因為快照檔案本身時進行過了壓縮,快照中的錯誤可能會導緻剩餘不問無法讀取,解決辦法是将重要的快照保留多個備份,在後期的資料恢複是通過計算快照檔案的SHA1散列值和SHA256散列值來對内容進行驗證

AOF持久化三種政策

  • appendfsync always:每次發送資料變化會立即同步到磁盤-----性能差,但資料完整性比較好
  • appendfsync Everysec:出廠預設配置,異步操作,每秒記錄一次 -----掉電會丢失一秒内的資料
  • appendfsync no:redis不主動同步,由作業系統決定何時同步-----丢失的資料不确定

redis.windows.conf配置檔案中進行配置

# appendfsync always
appendfsync everysec
# appendfsync no
           

AOF的重寫機制

Redis詳解【持久化、讀寫分離、主從同步、哨兵模式】
  • 主動觸發:使用bgrewriteaof指令,前提是必須開啟AOF日志功能。
    Redis詳解【持久化、讀寫分離、主從同步、哨兵模式】
  • 被動觸發:

    重寫原理: 随着AOF檔案越來越大,需要定期對AOF檔案進行重寫,父程序執行fork建立子程序,由子程序根據記憶體快照執行AOF重寫,父進行繼續響應後面的指令,在子程序完成重寫後,父程序再把新增的寫入指令寫入到新的AOF檔案中

注意: aof重寫會fork一個子程序去做,不會對redis正常指令處理有太多影響。

觸發重寫的條件: Redis會記錄上次重寫時aof檔案的大小,預設當aof檔案大小是上次重寫後大小的一倍且檔案大于64M,觸發一次重寫。

auto-aof-rewrite-percentage 100----100%即上次重寫檔案大小的一倍
auto-aof-rewrite-min-size 64mb----重寫時檔案最小為64M
           

AOF和RDB的對比: aof占用空間比RDB大,aof恢複速度比RDB慢,AOF比RDB丢失資料少

建議隻在從伺服器上使用RDB政策

RDB快照檔案和AOF日志檔案的建立時間: dump.rdb檔案是在滿足rdb持久化的條件或直接指向save指令時才建立,appendonly.aof檔案是配置檔案中開啟了aof持久化功能啟動redis時建立

Redis重新開機時持久化資料的加載順序: redis重新開機時讀取配置檔案,如果開啟了aof持久化功能,則優先加載aof日志檔案恢複資料;如果沒有則使用rdb快照恢複資料

混合持久化

Redis 4.0 開始引入混合持久化,配置檔案中配置開啟混合持久化。

aof-use-rdb-preamble yes
           

原理:

(1)将目前Redis的記憶體資料生成快照,以RDB檔案的格式寫入新的aof檔案中。

(2)快照寫入完成後,将寫入快照期間修改資料的指令追加到新aof檔案。新的aof檔案一開始還不叫appendonly.aof,等到重寫完新的aof檔案才會改名,覆寫舊的aof檔案。

(3)Redis重新開機時,先加載aof檔案中的rdb格式的資料,再加載aof日志格式的資料,這樣大大提高了恢複資料的效率。

混合持久化結合了RDB持久化 和 AOF 持久化的優點, 由于絕大部分都是RDB格式,加載速度快,同時結合AOF,增量的資料以AOF方式儲存了,資料更少的丢失。

Redis事務

Redis事務的三階段:開啟、入隊、執行

muti:開啟事務

exec:執行事務

入隊:将多個指令入隊到事務中,接收到指令後事務并不會立即執行,而是放到等待執行隊列當中

discard:放棄事務 watch key:監控key unwatch:放棄監控

Redis事務不是同生共死,執行過程報錯,其餘未報錯的繼續執行

  • watch監控,相當于key加一把了樂觀鎖。通過watch指令監控了多個key,如果在watch之後任何key的值發送了變化,exec執行的事務都會放棄,同時傳回調用失敗的通知
  • 執行exec後,watch監控會終止

Redis的訂閱釋出機制

程序間的通信機制:消息釋出者釋出消息,sub消息訂閱者訂閱消息後接收消息

主從複制

Redis常見的主從複制架構:一主多從、級聯

Redis主從複制的原理

Redis主從複制分為兩步:全量複制和增量複制

  • 全量複制:Redis全量複制一般發生在slave發初始化階段,将master上的所有資料都複制一份到slave

    隻要是重新連接配接master,就會執行一次全量複制

  1. slave連接配接master,發送SYNC指令
  2. master接收到SYNC命名後,開始執行BGSAVE指令生成快照,并記錄生成快照期間的寫指令
  3. master器執行完bgsave指令後,向所有slave發送快照檔案,并記錄發送快照期間的寫指令
  4. slave收到快照檔案後丢棄所有舊資料,載入收到的快照生成資料
  • 增量複制:全量複制完成後,master每執行一個寫指令就會向slave發送相同的寫指令,slave接收并執行收到的寫指令

總結:全量複制實際是将建立同步關系之前的資料一次性完全複制到slave,增量複制實際是将建立同步關系之後master執行的每條寫指令同步到slave

一主多從

  • 複制redis的安裝目錄【本身就是免安裝】,分别命名為master、slave,并修改兩者的配置檔案redis.windows.conf,将端口号分别命名為9000、9002
  • 将slave的redis.windows.conf配置檔案都進行修改:【Replication功能區的配置】

修改前:

# slaveof <masterip> <masterport> 從伺服器綁定主伺服器
# masterauth <master-password>  從伺服器綁定主伺服器的密碼

           

修改後:

slaveof 127.0.0.1 9000
masterauth root

           
  • 測試主從複制:在master伺服器進行寫操作,slave伺服器也會跟随主伺服器發生變化

在任何一個redis的用戶端執行指令:info,可以檢視該伺服器的所有相關資訊

在master用戶端執行此指令:info replication ,可以檢視跟主伺服器綁定的從伺服器數量和狀态

Redis預設作為slave作為從伺服器時不能進行寫操作

配置檔案中的預設配置:
slave-read-only yes

           

總結:

  • 從Redis會同步主Redis的所有檔案,即使是在配置主從複制之前的檔案,也會複制到從伺服器【與Mysql的不同之處】
  • Redis通過配置檔案配置主從複制,當機重新開機後仍然可以繼續工作

級聯複制

級聯複制:級聯複制模式下,部分slave的資料同步不連接配接主節點,而是連接配接從節點

隻需将redis的配置檔案redis.windows.conf中配好端口号和綁定的主伺服器即可,這裡的主伺服器有可能本身也是從伺服器

slaveof 127.0.0.1 9002
masterauth root

           

哨兵模式

  • Redis2.6版本開始提供哨兵模式,但不穩定。Redis2.8開始提供穩定的哨兵模式
  • 哨兵模式是主從模式的更新版,哨兵模式擁有主從複制的所有優點,哨兵為Redis提供了高可用性
  • 單個哨兵程序來監控redis叢集是不可靠的,單個哨兵故障後整個叢集系統将無法按照預期的方式運作,是以有必要将哨兵叢集
  • 哨兵可以監視任意多個主伺服器(複用),以及主伺服器屬下的從伺服器,并在被監視的主伺服器下線時,自動執行故障轉移操作。

哨兵系統的作用

Redis的哨兵系統主要有以下三個功能:監控、提醒、自動故障轉移

  1. 監控(Monitoring):哨兵(sentinel) 會不斷地檢查你的Master和Slave是否運作正常。
  2. 提醒(Notification):當被監控的某個 Redis出現問題時, 哨兵(sentinel) 可以通過 API 向管理者或者其他應用程式發送通知。
  3. 自動故障遷移(Automatic failover):當一個Master不能正常工作時,哨兵(sentinel) 會開始一次自動故障遷移操作,它會将失效Master的其中一個Slave更新為新的Maste,并讓失效Master的其他Slave改為複制新的Master; 當用戶端試圖連接配接失效的Master時,叢集也會向用戶端傳回新Master的位址,使得叢集可以使用Master代替失效Master。
  • 主觀下線(Subjectively Down, 簡稱 SDOWN)指的是單個哨兵對伺服器做出的下線判斷。
  • 客觀下線(Objectively Down, 簡稱 ODOWN)指的是多個哨兵在對同一個伺服器做出 SDOWN 判斷,系統就會認為該伺服器下線

哨兵的自動故障轉移原理

哨兵的自動故障轉移原理:當主伺服器master當機,那麼哨兵會通過選舉(算法)機制,從Salve中選出一個作為新Master,并删除監聽清單中出現故障的Master伺服器。之前當機的master重新啟動,自動切換成slave,不會自動恢複成master。

哨兵模式的配置

  1. 複制三份redis的安裝目錄,分别命名為redis1、redis2、redis3,将redis.windows.conf配置檔案中端口号分别修改為9000,9001,9002
  2. 啟動三個redis伺服器,通過redis2、redis3的用戶端,分别執行指令:slaveof 127.0.0.1 9000【slaveof 主伺服器IP 端口号】,将redis1做為主伺服器,redis2、redis3作為從伺服器

    如果配置檔案中配置:slaveof 主伺服器IP 端口号,則不需要執行指令

  3. 配置哨兵:在redis1、redis2、redis3的安裝目錄下,分别建立一個哨兵的配置檔案:sentinel.conf【名稱随便取】,配置内容如下:
    # 配置哨兵服務的端口号
    port 9600
    # 配置哨兵監視的主伺服器和表決的最少票數
    sentinel monitor mymaster 127.0.0.1 9000 2
    # 3s内mymaster無響應,則認為mymaster當機了
    sentinel down-after-milliseconds mymaster 3000
    #如果10秒後,mysater仍沒啟動過來,則啟動failover  
    sentinel failover-timeout mymaster 10000  
    
               

    sentinel.conf中的重要配置:sentinel monitor 主伺服器的名稱 主伺服器的IP位址 端口号 表決票數

    failover:故障切換,指系統中其中一項裝置或服務失效而無法運作時,另一項裝置或服務即可自動接手原失效系統所執行的工作

    • 主伺服器的名稱随便取
    • 表決票數:用來判斷某個Redis 伺服器是否下線的參數,Redis下線需要的最少票數。比如有10個哨兵在監控某個master節點,如果需要至少6個哨兵發現master下線後,才認為master真正下線,那麼指令中就需要配置參數為6
  4. 啟動哨兵:從redis-server.exe 所在的目錄進入dos指令視窗,執行:

    redis-server.exe sentinel.conf --sentinel

  5. 啟動哨兵後發現:每個哨兵會監視主伺服器、從伺服器和其他哨兵的運作情況
  6. 關掉主伺服器redis1,從伺服器會變為主伺服器,這個過程中會删除配置檔案中的原配置:salveof 新master的IP位址 端口号,另一個從伺服器也會更新配置檔案中綁定主機IP位址
  7. 一段時間後再啟動原主伺服器redis1,redis1自動由 master狀态變為salve狀态,配置檔案的末尾會自動添加一行配置:salveof 新master的IP位址 端口号
  • 注意:在哨兵模式的監控過程中,哨兵的配置檔案根據master、slave的狀态動态修改,主從伺服器的配置檔案也會動态的添加或删除【salveof 新master的IP位址 端口号】

DOS指令行配置Redis主從複制

  • 直接從伺服器的用戶端輸入指令:slaveof 主伺服器IP位址 端口号,也可以實作主從複制
  • 指令行的方式進行配置,會暫時替代配置檔案中配置,但重新開機後就是失效了,仍然以配置檔案的為準
  • 當主伺服器當機後,直接在某從伺服器的用戶端輸入指令:slaveof no one,目前從服務就會變為主伺服器,其他從伺服器隻需在用戶端輸入指令:slaveof 新主伺服器IP位址 端口号。如果從伺服器變為新的主伺服器後,原來的主伺服器又恢複正常了,原主伺服器就無小弟了。

Redis日志檔案

安裝目錄下的logs檔案夾下的redis.log日志檔案可以檢視redis的相關操作

緩存雪崩

  • **緩存雪崩:**同一時刻,大量的key的集中過期,造成資料庫瞬時壓力大,甚至引起當機

    原因:設定了相同的緩存過期時間,重新開機後過期時間完全相同

  • 解決辦法:
  1. 設定不同的緩存過期時間,比如設定10分鐘+1到5的随機分鐘數
  2. 給每條緩存設定相應的緩存标記,緩存标記的過期時間比緩存資料的過期時間短,緩存标記失效就更新緩存

緩存穿透

  • 緩存穿透: 使用者查詢的資料,資料庫中沒有,自然緩存中也沒有。這樣使用者每次查詢的時候,相當于進行了兩次無效查詢:在緩存中找不到,每次都要去資料庫查詢一次,然後傳回空。
  • 解決辦法:
  1. 采用布隆過濾器,使用一個足夠大的bitmap,用于存儲可能通路的key,不存在的key直接被過濾
  2. 通路key未在資料庫查詢到,也将空值寫進緩存,但設定較短過期時間,這樣下次同樣的請求就有值

緩存擊穿

  • 緩存擊穿: 一個存在的key,在緩存過期的瞬間,同時有大量的請求,這些請求會直接通路資料庫,造成資料庫瞬間壓力過大
  • 解決辦法: 熱點資料永不過期或加鎖

緩存雪崩和緩存擊穿:緩存擊穿并發查詢同一條資料,緩存雪崩是不同的緩存都過期了,緩存中查詢不到而都從查資料庫

緩存預熱

緩存預熱: 系統上線後,将相關的緩存資料直接加載到緩存系統

解決辦法: 定期更新緩存

繼續閱讀