Redis
知識體系結構:
資料類型、基本操作
持久化AOF/RDB
事務的控制
複制
NoSQL: not only sql 泛指非關系性資料庫,克服了關系性資料庫在【海量資料】和【高并發】情況下的缺點
- 非關系性資料的特點:
- 資料主要存儲在記憶體中,因而讀寫效率高,但斷電易丢失資料。
- 有些非關系性資料支援持久化資料到硬碟,如redis
- 非關系型資料庫的分類:
- 鍵值(key-value)型資料庫:代表Redis、MemcacheDB
- 列存儲資料庫:代表Hbase
- 文檔型資料庫:代表MongoDB
- 圖形資料庫
-
什麼是Redis?
Redis:Remote Dictionary Server 遠端字典伺服器
Redis是開源的、C語言寫的非關系性資料庫,鍵值(key-value)型資料庫
- Redis的特點
- 資料存儲在記憶體中,為保證資料安全,能不定期持久化資料到硬碟
-
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底層是哈希包
- 存取速度快,支援高并發、叢集、分布式、主從同步
- 支援多種語言的用戶端
- 支援存儲過期----存儲過期:存儲資料設定一個有效期,時間到了就沒了,如vip、微信紅包、短信驗證碼
- 支援訂閱和釋出
- Redis的應用場景
- 中央緩存:最主要的應用
- 計數器和定時器:利用Redis的自增和自減方法
- 防止暴力攻擊:登入失敗次數達到指定次數後鎖死,通路量大的時候,采用redis叢集,支援存儲過期(達到一定時長後解鎖)
-
Redis和MemcacheDB的異同:
MemcacheDB逐漸被Redis取代
相同點:都是key-value類型的nosql,資料存儲在記憶體中,存取速度快,支援并發和叢集,都支援存儲過期
不同點:(1)Redis支援的value資料類型比memcached多
(2)Redis支援持久化資料到硬碟,資料更安全,MemcacheDB隻能存記憶體
Redis的安裝
-
下載下傳:Redis官網隻支援linux版本,windows版本由微軟進行維護,需要導GitHub上下載下傳:
https://github.com/MicrosoftArchive/redis/releases
Redis的安裝:編譯後的版本免安裝,解壓到指定位置即可
- 啟動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 最近最少使用的算法
- volatile-lru :在設定了過期時間的Key空間中,移除最近最少使用的key。
- allkeys-lru: 在所有Key中,優先移除最近最少使用的key
- volatile-random : 在設定了過期時間的key中,随機移除一個鍵
- allkeys-random : 在所有Key中,随機移除某個key。
- volatile-ttl: 在設定了過期時間的Key中,優先移除最先過期的key
- noeviction:不做任何處理,記憶體達到閥值時,傳回錯誤指令
Redis的配置檔案redis.conf
Redis的配置檔案redis.conf中:
- daemonize 守護程序,設為yes,背景運作的意思,linux下它不會彈視窗,windows下不起作用
- 端口号設定
- bind ip位址—綁定位址,Redis伺服器隻能有綁定的IP位址來通路
- 資料庫個數,預設16個
- 密碼設定requirepass
- 配置淘汰政策
- 持久化政策
- 配置日志等級
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方式比較适合線上的維護操作
AOF日志
- AOF政策:Append Only File 以日志的形式來記錄每個寫操作,将Redis執行過的所有寫操作指令記錄下來(讀操作不記錄),每條記錄都追加到AOF日志檔案的末尾。重新開機時,就日志中儲存的寫操作指令從前往後執行一次,來恢複資料
- AOF日志儲存的預設檔案名為:appendonly.aof
- AOF政策預設關閉,在redis.windows.conf配置檔案中進行配置
- AOF日志檔案遵循resp協定編寫。
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的重寫機制
- 主動觸發:使用bgrewriteaof指令,前提是必須開啟AOF日志功能。
-
被動觸發:
重寫原理: 随着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,就會執行一次全量複制
- slave連接配接master,發送SYNC指令
- master接收到SYNC命名後,開始執行BGSAVE指令生成快照,并記錄生成快照期間的寫指令
- master器執行完bgsave指令後,向所有slave發送快照檔案,并記錄發送快照期間的寫指令
- 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的哨兵系統主要有以下三個功能:監控、提醒、自動故障轉移
- 監控(Monitoring):哨兵(sentinel) 會不斷地檢查你的Master和Slave是否運作正常。
- 提醒(Notification):當被監控的某個 Redis出現問題時, 哨兵(sentinel) 可以通過 API 向管理者或者其他應用程式發送通知。
- 自動故障遷移(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。
哨兵模式的配置
- 複制三份redis的安裝目錄,分别命名為redis1、redis2、redis3,将redis.windows.conf配置檔案中端口号分别修改為9000,9001,9002
-
啟動三個redis伺服器,通過redis2、redis3的用戶端,分别執行指令:slaveof 127.0.0.1 9000【slaveof 主伺服器IP 端口号】,将redis1做為主伺服器,redis2、redis3作為從伺服器
如果配置檔案中配置:slaveof 主伺服器IP 端口号,則不需要執行指令
- 配置哨兵:在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
-
啟動哨兵:從redis-server.exe 所在的目錄進入dos指令視窗,執行:
redis-server.exe sentinel.conf --sentinel
- 啟動哨兵後發現:每個哨兵會監視主伺服器、從伺服器和其他哨兵的運作情況
- 關掉主伺服器redis1,從伺服器會變為主伺服器,這個過程中會删除配置檔案中的原配置:salveof 新master的IP位址 端口号,另一個從伺服器也會更新配置檔案中綁定主機IP位址
- 一段時間後再啟動原主伺服器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的集中過期,造成資料庫瞬時壓力大,甚至引起當機
原因:設定了相同的緩存過期時間,重新開機後過期時間完全相同
- 解決辦法:
- 設定不同的緩存過期時間,比如設定10分鐘+1到5的随機分鐘數
- 給每條緩存設定相應的緩存标記,緩存标記的過期時間比緩存資料的過期時間短,緩存标記失效就更新緩存
緩存穿透
- 緩存穿透: 使用者查詢的資料,資料庫中沒有,自然緩存中也沒有。這樣使用者每次查詢的時候,相當于進行了兩次無效查詢:在緩存中找不到,每次都要去資料庫查詢一次,然後傳回空。
- 解決辦法:
- 采用布隆過濾器,使用一個足夠大的bitmap,用于存儲可能通路的key,不存在的key直接被過濾
- 通路key未在資料庫查詢到,也将空值寫進緩存,但設定較短過期時間,這樣下次同樣的請求就有值
緩存擊穿
- 緩存擊穿: 一個存在的key,在緩存過期的瞬間,同時有大量的請求,這些請求會直接通路資料庫,造成資料庫瞬間壓力過大
- 解決辦法: 熱點資料永不過期或加鎖
緩存雪崩和緩存擊穿:緩存擊穿并發查詢同一條資料,緩存雪崩是不同的緩存都過期了,緩存中查詢不到而都從查資料庫
緩存預熱
緩存預熱: 系統上線後,将相關的緩存資料直接加載到緩存系統
解決辦法: 定期更新緩存