討伐Redis

本文是學習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,核心在於兩個問題:

  1. Redis是什麼?
  2. Redis能做什麼?

知道了Redis是什麼,就很好理解Redis爲什麼要提供它提供的那些功能;

知道了Redis能做什麼,以後遇到想用Redis的場合,你總能通過各種方式做到。

 

1 Redis是什麼?

Redis:Remote Dictionary Server,遠程字典服務器。

是完全開源免費的,用C語言編寫的,遵守BSD協議,是一個高性能的(key/value)分佈式內存數據庫,基於內存運行並支持持久化的NoSQL數據庫,是當前最熱門的NoSQL數據庫之一,也被人們稱爲數據結構服務器。

關鍵信息:

  1. Redis是分佈式數據庫
  2. Redis是內存數據庫
  3. 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調優

 

加油!(ง •_•)ง

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章