本文是學習Redis時做的知識點整理,原視頻鏈接:
https://www.bilibili.com/video/BV1oW411u75R
目錄
Redis核心
1 Redis是什么?
1.1 Redis是分布式資料庫
1.1.1 資料庫事務的ACID
1.1.2 CAP定理
1.1.3 BASE理論
1.2 Redis是記憶體資料庫
1.2.1 RDB
1.2.2 AOF
1.2.3 RDB和AOF
1.3 Redis是NoSQL資料庫
Redis的資料格式
2 Redis能做什么?
2.1 資料操作
2.1.1 基本操作命令
2.1.2 string的相關操作
2.1.3 hash的相關操作
2.1.4 list的相關操作
2.1.5 set的相關操作
2.1.6 zset的相關操作
2.2 支持事務
2.2.1 Redis事務命令
2.2.2 Redis事務的特性
2.3 訊息的訂閱和發布
2.4 主從復制
2.4.1 多節點搭建
2.4.2 主從復制命令
2.4.3 主從復制原理
2.4.4 主從復制策略
2.4.5 哨兵模式
3.Redis的安裝、使用和調優
3.1 Redis的安裝
3.2 Redis的使用
3.3 Redis調優
Redis核心
學習Redis,核心在于兩個問題:
- Redis是什么?
- Redis能做什么?
知道了Redis是什么,就很好理解Redis為什么要提供它提供的那些功能;
知道了Redis能做什么,以后遇到想用Redis的場合,你總能通過各種方式做到,
1 Redis是什么?
Redis:Remote Dictionary Server,遠程字典服務器,
是完全開源免費的,用C語言撰寫的,遵守BSD協議,是一個高性能的(key/value)分布式記憶體資料庫,基于記憶體運行并支持持久化的NoSQL資料庫,是當前最熱門的NoSQL資料庫之一,也被人們稱為資料結構服務器,
關鍵資訊:
- Redis是分布式資料庫
- Redis是記憶體資料庫
- Redis是NoSQL資料庫
1.1 Redis是分布式資料庫
分布式資料庫:位于不同地點的許多計算機通過網路互相連接,共同組成的一個邏輯上集中、物理上分布的大型資料庫,
分布式資料庫有兩個要點:
- CAP定理
- BASE理論
1.1.1 資料庫事務的ACID
A:Atomicity,原子性:
整個事務中的所有操作,要么全部完成,要么全部不完成,不可能停滯在中間某個環節,事務在執行程序中發生錯誤,會被回滾到事務開始前的狀態,就像這個事務從來沒有執行過一樣,
C:Consistency,一致性:
事務必須始終保持系統處于一致的狀態,不管在任何給定的時間并發事務有多少,
I:Isolation,隔離性:
隔離狀態執行事務,使它們好像是系統在給定時間內執行的唯一操作,如果有兩個事務,運行在相同的時間內,執行相同的功能,事務的隔離性將確保每一事務在系統中認為只有該事務在使用系統,
D:Durability,持久性:
在事務完成以后,該事務對資料庫所作的更改便持久的保存在資料庫之中,并不會被回滾,
1.1.2 CAP定理
CAP定理:一個分布式系統不可能同時滿足一致性[Consistency],可用性[Availability],和磁區容錯性[Partition tolerance]這三個基本要求,最多只能同時滿足其中的兩項,
C:Consistency,一致性:
資料在多個副本之間是否能夠保持一致的特性,
系統的一個資料更新成功之后,如果所有用戶都能夠讀取到最新的值,該系統就被認為具有強一致性,
A:Availability,可用性:
系統提供的服務必須一直處于可用的狀態,對于用戶的每一個操作請求總是能夠在有限的時間內回傳結果,
P:Partition tolerance,磁區容錯性:
分布式系統在遇到任何網路磁區故障的時候,仍然對外提供滿足一致性和可用性的服務,

在分布式系統中,磁區容錯性是必須實作的,所以我們只能在一致性和可用性之間進行權衡,
對一致性的讓步:
很多web實時系統對讀一致性的要求很低,有些場合對寫一致性的要求也不高,允許實作最終一致性,
對可用性的讓步:
對很多web應用來說,并不需要特別高的實時性,比如發布者發布一條訊息后,過幾秒甚至十幾秒,訂閱者才看到這條動態,也是完全可以接受的,
BASE理論是對CAP中一致性和可用性的權衡的結果,
1.1.3 BASE理論
BASE 核心思想是:即使無法做到強一致性,但每個應用都可以根據自身業務特點,采用適當的方式來使系統達到最終一致性,
BASE是基本可用[Basically Available]、軟狀態[Soft state]、最終一致[Eventually consistent]三個術語的縮寫,
1.2 Redis是記憶體資料庫
記憶體資料庫:顧名思義,就是將資料保存在記憶體中的資料庫,因為記憶體讀寫資料的速度要遠大于磁盤,所以記憶體資料庫的性能遠高于傳統的磁盤資料庫,
記憶體有一個特性就是,一旦斷電,所有的資料都會被清空,所以資料持久化對記憶體資料庫而言非常重要,
Redis支持資料的持久化,可以將記憶體中的資料保留在磁盤中,系統重啟時再次加載使用,
Redis提供了兩種持久化策略:RDB和AOF,
1.2.1 RDB
RDB,Redis DataBase:在指定的時間間隔下,將記憶體中的資料集快照(Snapshot快照)寫入磁盤,恢復資料時,將快照檔案直接讀到記憶體中,
Redis復制一個與當前行程完全一樣的行程,作為當前行程的子行程,這個程序稱為fork,
Redis會fork一個子行程來進行資料持久化,這個子行程會先將資料寫入一個臨時檔案,待持久化程序結束后,再用這個臨時檔案替換上一次的持久化檔案,
持久化檔案的默認名稱為:dump.rdb,
整個程序中,主行程不進行任何IO操作,這就確保了極高的性能,
RDB持久化的觸發機制:
- 條件觸發
- 指令觸發
條件觸發:
在以下三件事 任一件發生時,RDB持久化觸發:
- 900秒以內,至少有1個key被改動;
- 300秒以內,至少有10個key被改動;
- 60秒以內,至少有10000個key被改動,
以上引數均可以在組態檔中進行修改,
指令觸發:
save:阻塞其它行程,進行RDB持久化,
bgsave:在后臺異步進行RDB持久化,
RDB策略的優勢在于:適合大規模的資料恢復,對資料完整性和一致性的要求不高,
劣勢在于:如果Redis意外宕機,會丟失最后一次快照后的所有修改,
1.2.2 AOF
AOF,Append Only File:以日志的形式,將Redis執行過的所有寫指令記錄下來,只允許追加新檔案但不可以對已保存的檔案進行修改,恢復資料時,Redis會讀取日志檔案重新構建資料,
AOF持久化檔案的默認名稱為:appendonly.aof,
AOF策略在Redis中是默認不啟用的,需要通過修改組態檔開啟,
AOF持久化的觸發機制:
默認每秒執行一次,如果在一秒內宕機,資料丟失,
通過修改組態檔,可以設定三種不同的AOF策略:
- always:同步持久化,即每次發生資料變更 都會被立即記錄到磁盤,
- everysec:出廠默認設定,異步操作,每秒記錄一次,
- no:從不,
如果AOF持久化進行時發生系統錯誤,導致aof檔案被寫入了例外資料,進一步導致恢復資料時報IO例外,可以通過修復指令對損壞的aof檔案進行修復,
修復命令:
redis-check-aof --fix 檔案名
AOF采用檔案追加的方式,產生的檔案會越來越大,為了避免產生的aof檔案占用太多存盤空間,Redis增加了Rewrite機制,
Rewrite:重寫,當aof檔案的大小超過了設定的閾值時,Redis會對aof檔案的內容進行壓縮,只保留可以恢復資料的最小指令集,
重寫程序中Redis并沒有讀取舊的aof檔案,而是fork出一條子行程,將記憶體中當前資料集用命令的方式重寫,類似于快照,
Rewrite的觸發機制:
- 條件觸發
- 指令觸發
條件觸發:
當aof檔案的大小超過了設定的閾值時,Rewrite發生,
Rewrite的閾值默認為以下兩個條件同時滿足:
- [aof檔案的大小]超出[上一次rewrite后的檔案大小]的大小,達到[上一次rewrite后的檔案大小]的100%
- aof檔案大于64M
以上引數均可以在組態檔中進行修改,
指令觸發:
bgrewriteaof:在后臺異步進行重寫,
1.2.3 RDB和AOF
RDB和AOF兩種策略可以同時存在,
在同時開啟了RDB和AOF的情況下,當Redis重啟時會優先載入aof檔案來恢復資料,因為通常aof檔案保存的資料集要比rdb檔案更完整,
性能建議:
因為rdb檔案只用作后備用途,建議只在slave上持久化rdb檔案,而且只保留“15分鐘備份一次”的規則就夠了,
如果啟用了AOF,好處是在最惡劣的情況下丟失的資料也不會超過兩秒,恢復資料時只需要載入aof檔案即可,代價是帶來了持續的IO,AOF rewrite程序中產生的新資料寫入新檔案造成的阻塞幾乎是不可避免的,所以只要硬碟許可,應盡量減少AOF rewrite的頻率,另外AOF rewrite的默認閾值64M太小了,可以設到5G以上,
如果不啟用AOF,僅靠Master-Slave Replication實作高可用性也可以,能省掉一大筆IO開銷,同時也減少了AOF rewrite帶來的系統波動,但如果Master和Slave同時倒掉,會丟失十幾分鐘的資料,在這種情況下啟動腳本時,要比較Master和Slave中的rdb檔案,載入較新的那個,
1.3 Redis是NoSQL資料庫
NoSQL資料庫:Not Only SQL,泛指非關系型資料庫,區別于關系型資料庫,它們不保證關系資料的ACID特性,
NoSQL有如下優點:
- 易擴展,NoSQL資料庫的種類繁多,但它們都有一個共同點:去掉了關系型資料庫的關系型特性,因為資料之間無關系,所以非常容易擴展,因此NoSQL資料庫在架構的層面上可擴展性很強,
- 高性能,NoSQL資料庫都具有非常高的讀寫性能,在大資料量下同樣表現優秀,這得益于它的無關系性,資料庫結構簡單,
Redis是NoSQL資料庫,它的資料格式符合NoSQL資料庫資料格式的特征:
NoSQL資料庫無需事先為要存盤的資料建立欄位,隨時可以存盤自定義的資料格式,
Redis的資料格式
Redis的基本資料格式是鍵值對:key-value,
Redis的五大資料型別:string、hash、list、set、zset,
- string:字串,Redis中所有的key都是string型別的資料,string型別是二進制安全的,意思是Redis的string可以包含任何資料,比如jpg圖片或者序列化的物件,
- hash:哈希,hash是一個鍵值對集合,適合用于存盤物件,
- list:串列,list的底層實際上是鏈表,
- set:set集合,set是string型別的無序集合,不允許重復的成員,通過HashTable實作,
- zset:sorted set,有序集合,zset和set一樣也是string型別元素的集合,且不允許重復的成員,不同的是每個元素都會關聯一個double型別的分數,Redis通過分數來為集合中的成員進行從小到大的排序,zset的成員是唯一的,但分數可以重復,
https://www.php.cn/faq/420209.html
2 Redis能做什么?
Redis的所有操作都是通過指令完成的,由此我們很容易想到:Redis提供了什么命令,就能夠實作什么功能,
根據命令集,Redis能夠完成的比較重要的功能有:
- 資料操作
- 支持事務
- 訊息的訂閱和發布
- 主從復制
2.1 資料操作
2.1.1 基本操作命令
keys * 查看當前所有key
![]()
set 設值
get 取值(當value不為string型別時報錯)

mset 批量設值
mget 批量取值

setnx 不覆寫設值

exists 判斷key是否存在

del 洗掉key

type 查看資料型別(因為key的資料型別一定是string,所以回傳的是value的資料型別)

ttl 查看key的剩余存活時間(-1永久存活,-2不存在的key)

expire 設定key的存活時間(單位:秒)

setex 設值時設定key的存活時間

select 切換到其它庫(默認0)

move 移動key到其它庫

flushall 清空所有庫(慎用)

2.1.2 string的相關操作
strlen 獲取字串長度

append 增補字串

getrange 截取字串

setrange 從某個坐標開始部分替換字串

incr 自增

incrby 等差遞增
decrby 等差遞減

2.1.3 hash的相關操作
hset 設值
hget 取值
hmset 批量設值
hmget 批量取值
hgetall 獲取全部資訊

hkeys 獲取所有key
hvals 獲取所有value
hexists 判斷是否存在key
hdel 洗掉

hincrby 自增

2.1.4 list的相關操作
lpush 左側入堆疊
rpush 右側入堆疊
lrange 從某個坐標開始查看list(-1表示全部)
lindex 查看某個坐標的值
lset 設定某個坐標的值




lpop 左側出堆疊

rpop 右側出堆疊

llen 查看list長度

linsert 插入

lrem 洗掉(1個3,2個3,3個1)

ltrim 截取

2.1.5 set的相關操作
sadd 添加元素(自動去重)
smembers 展示set中所有成員
sismember 判斷是否為set成員
scard 查看set集合成員個數

spop 隨機彈出成員
srem 洗掉成員

srandmember 隨機取出n個值

兩set集合關系:
sunion 并集
sinter 交集
sdiff 差集

smove 移動成員

2.1.6 zset的相關操作
zadd 添加成員
zrange 查看zset中的成員

zrangebyscore 按分數篩選(加括號表示不包括)

zscore 獲取分數

zrem 洗掉成員(不演示)
zrevrange 按分數排名
zrevrank 獲取某個成員的分數排名


2.2 支持事務
事務本質是一組命令的集合,把一組命令放入一個佇列中,一次性、順序性、排他性地執行,
2.2.1 Redis事務命令
multi 事務開始
exec 執行事務

discard 事務取消

事務在編譯時遇到錯誤:(整個事務失敗)

事務在運行時遇到錯誤:(事務成功)

watch 監視key(如果在事務執行之前監視的key被其它命令改動,事務取消)
執行exec會將之前加的監控鎖全部取消,

unwatch 取消對所有key的監視
![]()
2.2.2 Redis事務的特性
1.單獨的隔離操作
事務中的所有命令都會序列化、按順序地執行,事務在執行的程序中,不會被其他客戶端發送來的請求打斷,
2.沒有隔離級別的概念(因為是NoSQL)
因為事務提交前任何指令都不會被實際執行,也就不存在“事務內的查詢要看到事務里的更新,事務外的查詢不能看到事務里的更新”的問題,
3.不保證原子性
Redis同一個事務中如果有一條命令執行失敗,其后的命令仍然會被執行,沒有回滾,
2.3 訊息的訂閱和發布
訊息的訂閱和發布:行程間的一種通信模式,發送者(pub)發送訊息,訂閱者(sub)接收訊息,
假如三個客戶端client1、client2、client3 訂閱了頻道channel1,
當有新訊息發送給頻道channel1時,這條訊息會被分別發送給訂閱它的三個客戶端client1、client2、client3,
subscribe 訂閱頻道
unsubscribe 退訂頻道
publish 將訊息發送到指定的頻道

psubscribe 訂閱符合條件的多個頻道(通配符*)
punsubscribe 退訂符合條件的所有頻道

2.4 主從復制
主從復制:即master/slaver機制,主機資料更新后根據配置和策略,自動同步到備機,master以寫為主,slave以讀為主,
主從復制可以用來實作讀寫分離、容災恢復等,
2.4.1 多節點搭建
在一臺虛擬機上搭建3個節點:
1.拷貝多個redis.conf檔案
每個節點需要一個組態檔,為搭建3個節點,這里我把redis.conf檔案復制了3份:

2.依次修改每個組態檔

組態檔修改細節:
指定埠(3個組態檔依次設為6379、6380、6381)
開啟daemonize yes
pidfile名稱(與埠號對應)
log檔案名字(與埠號對應)
dump.rdb名字(與埠號對應)
3.依次啟動3個節點

2.4.2 主從復制命令
主從復制原則:配從不配主,
slaveof 成為某節點的從節點
slaveof no one 不再是任何節點的從節點

info replication 查看節點資訊

讀寫分離的體現:主寫從讀,
成為其它節點的從節點后,該節點不能再寫入:
shutdown 節點關閉
主節點關閉后,從節點原地待命,主節點重啟后與其它節點的主從關系不變,
從節點關閉并重啟后,不再是其它節點的從節點,

2.4.3 主從復制原理
slave每次連接master時都全量復制master的資料,之后master對資料進行修改時,slave對改動進行增量復制,
slave變更master時(除非自己成為master),之前的資料會被清空,然后全量復制新master的資料,
主從復制的缺點在于復制延時,由于所有的寫操作都是先在master上操作,然后同步更新到slave,所以從master同步到slave會有一定的延遲,當系統繁忙時,延遲問題會更加嚴重,
2.4.4 主從復制策略
常見的主從復制策略有:
- 一主二仆
- 薪火相傳
- 反客為主
一主二仆:一個master對應兩個slave,
薪火相傳:一個master的slave同樣可以接收其它節點的連接和同步請求,成為其它節點的master,這么做可以減輕第一個master的寫壓力,
反客為主:即slaveof no one,使當前節點不再是其它節點的slave,自己成為master,
2.4.5 哨兵模式
哨兵模式:后臺監控master,當master發生故障時,所有slave會進行投票選舉,從slave中選出新的master,
1.配置哨兵
在redis.conf所在目錄下新建sentinel.conf檔案(檔案名稱不能出錯),

sentinel.conf檔案內容:
sentinel monitor 自定義的被監控資料庫名稱 127.0.0.1 6379 1
最后的數字1表示master掛掉后slave選舉時得到1票的slave成為主機,
示例:
一組sentinel能同時監控多個master,
2.啟動哨兵
![]()

3.關閉master,選舉出新的master
(127.0.0.1:6381成為新的master)

4.重啟之前的master,之前的master自動成為新master的slave

3.Redis的安裝、使用和調優
3.1 Redis的安裝
Redis官網:https://redis.io/
Redis基本上都是在Linux作業系統中安裝和應用,
Linux安裝:
1.從官網下載Redis,把壓縮包(我下載到的版本是redis-6.0.10.tar.gz)放到Linux系統的/opt/目錄下,
如果你是在電腦上安裝了Linux系統的虛擬機,并且把壓縮包下載到了Windows系統的主機上,可以參考下面鏈接文章將壓縮包上傳到虛擬機,
https://blog.csdn.net/fengbingchun/article/details/81035861
如果無法連接本地主機網路和虛擬機網路,可以參考下面鏈接文章,
https://www.cnblogs.com/shireenlee4testing/p/9469650.html
2.進入/opt/目錄,解壓Redis壓縮包redis-6.0.10.tar.gz,解壓完成后/opt/目錄下出現目錄redis-6.0.10
tar -zxvf redis-6.0.10.tar.gz
3.進入redis-6.0.10目錄,執行make命令(輸入make,回車),安裝Redis
如果此時報錯:structredisServer沒有名為XXXX的成員,可以參考下面鏈接文章,
https://blog.csdn.net/qq_43527936/article/details/109447519
4.make完成后執行make install命令(輸入make install,回車)
5.查看默認安裝目錄/usr/local/bin/

3.2 Redis的使用
1.在Redis的安裝路徑下,可以找到Redis組態檔redis.conf(建議備份這個檔案):

2.修改redis.conf:
vi redis.conf
找到如圖所示的內容,將daemonize(守護行程)改為yes,
按i鍵進入編輯模式,修改完成后按Esc鍵退出編輯模式,輸入:wq保存退出,
3.啟用redis服務
redis-server
4.啟用redis客戶端
redis-cli
5.ping

3.3 Redis調優







加油!(? ?_?)?
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/255867.html
標籤:其他
上一篇:多租戶技術









