【尚硅谷】Redis 6 入門到精通 超詳細(xì) 教程

數(shù)據(jù)庫(kù)事務(wù)必備特性(ACID)
原子性(Atomicity):指事務(wù)的不可分割性,一個(gè)事務(wù)的所有操作要么不間斷地全部被執(zhí)行,要么全都不執(zhí)行。
一致性(Consistency):事務(wù)前后數(shù)據(jù)的完整性必須保持一致。
隔離性(Isolation):事務(wù)的隔離性是多個(gè)用戶并發(fā)訪問數(shù)據(jù)庫(kù)時(shí),數(shù)據(jù)庫(kù)為每一個(gè)用戶開啟的事務(wù),不能被其他事務(wù)的操作數(shù)據(jù)所干擾,多個(gè)并發(fā)事務(wù)之間要相互隔離。
持久性(Durability):持久性是指一個(gè)事務(wù)一旦被提交,它對(duì)數(shù)據(jù)庫(kù)中數(shù)據(jù)的改變就是永久性的,接下來即使數(shù)據(jù)庫(kù)發(fā)生故障也不應(yīng)該對(duì)其有任何影響。
注意:
redis支持一致性和隔離性,但無法保證持久性,支持部分的原子性(如果事務(wù)中使用的命令和操作的數(shù)據(jù)類型不匹配的時(shí)候不保證原子性)
redis是單線程加IO多路復(fù)用模式,IO多路復(fù)用大大的提高了CPU的利用率,極大提升了并發(fā)性能。
redis安裝在linux中
首先選擇opt文件解壓redis,編譯后再安裝redis,會(huì)默認(rèn)安裝在usr/local/bin目錄中。有如下默認(rèn)安裝目錄:

啟動(dòng)redis,先執(zhí)行(后臺(tái)啟動(dòng),加了后續(xù)/etc/redis.conf,前臺(tái)啟動(dòng)就不需要加)
redis-server /etc/redis.conf
命令啟動(dòng)redis,再執(zhí)行
redis-cli
命令進(jìn)入客戶端。輸入
ping
命令用來測(cè)試是否聯(lián)通redis
在默認(rèn)安裝的bin目錄中啟動(dòng)redis,推薦使用后臺(tái)啟動(dòng),好處就是即使把終端窗口關(guān)閉還是可以繼續(xù)使用。注意:使用后臺(tái)啟動(dòng)要先將redis.conf文件復(fù)制一份到其他目錄(我復(fù)制在etc目錄下)。
關(guān)閉redis用
shutdown
命令可以,也可以用
kill -9 端口號(hào)
關(guān)閉。
事務(wù):redis事務(wù)是一個(gè)單獨(dú)的隔離操作,無隔離級(jí)別,事務(wù)中的命令都會(huì)序列化、按順序執(zhí)行,其主要作用是串聯(lián)多個(gè)命令防止別的命令插隊(duì)。

- mutil開啟事務(wù),exec執(zhí)行,執(zhí)行之后表示事務(wù)結(jié)束。也可以不執(zhí)行,discard直接結(jié)束.

queue:排隊(duì)(v)、隊(duì)列(n)
- 事務(wù)出錯(cuò)
1,組隊(duì)時(shí)出錯(cuò),最終都不會(huì)執(zhí)行
2,組隊(duì)時(shí)成功,執(zhí)行時(shí)誰(shuí)有錯(cuò)誤誰(shuí)就不執(zhí)行,沒錯(cuò)誤的才能執(zhí)行。
Redis持久化:
Redis持久化,由于redis是內(nèi)存數(shù)據(jù)庫(kù),如果不將內(nèi)存中的數(shù)據(jù)保存至硬盤的話,那么服務(wù)器一旦退出,服務(wù)器中的數(shù)據(jù)就會(huì)消失。所以Redis有RDB和AOF兩個(gè)持久化的方式
RDB(Redis DataBase),是redis的默認(rèn)存儲(chǔ)方式,是通過快照(snapshot)完成的。
觸發(fā)快照的方式
1. 符合自定義配置的快照規(guī)則;
2. 執(zhí)行save或者bgsave命令;
3. 執(zhí)行flushall命令;
4. 執(zhí)行主從復(fù)制操作 (第一次)。
執(zhí)行機(jī)制:redis父進(jìn)程首先判斷是否在執(zhí)行保存操作,如果在執(zhí)行則父進(jìn)程只是fork操作創(chuàng)建子進(jìn)程,然后子進(jìn)程創(chuàng)建RDB文件,生成臨時(shí)快照文件,然后對(duì)原有RDB文件進(jìn)行原子性替換(持久化操作),完成后替換原來的快照文件,然后發(fā)送給父進(jìn)程,子進(jìn)程退出。整個(gè)過程主進(jìn)程不進(jìn)行任何io操作,確保了極高的性能
優(yōu)點(diǎn):1,適合大規(guī)模的數(shù)據(jù)恢復(fù),rdb文件是唯一的且是數(shù)據(jù)的快照,不用重新讀取再西俄如內(nèi)存
2,主進(jìn)程fork子進(jìn)程,可以最大化Redis性能
3,體積小,因?yàn)閞db為二進(jìn)制壓縮文件
缺點(diǎn):1,不能保證數(shù)據(jù)完整性
2,需要一定時(shí)間間隔操作,如果redis發(fā)生宕機(jī),則最后一次修改的數(shù)據(jù)就沒有了
3,如果數(shù)據(jù)集較大,父進(jìn)程fork子進(jìn)程時(shí)可能會(huì)造成阻塞
AOF(Append Only File),與快照持久化相比,AOF持久化的實(shí)時(shí)性更好,因此已成為主流的持久化方案。其是把用戶執(zhí)行的每個(gè)“寫”指令(添加/修改/刪除)都備份到文件中,還原數(shù)據(jù)的時(shí)候就是執(zhí)行具體寫指令而已。開啟AOF持久化會(huì)會(huì)清空redis內(nèi)部的數(shù)據(jù),故最好在redis使用之前就開啟它。默認(rèn)情況下Redis沒有開啟AOF方式的持久化,可以通過appendonly參數(shù)開啟。開啟后重啟redis就會(huì)有一個(gè)appendonly.aof文件。
執(zhí)行機(jī)制:開啟AOF后,父進(jìn)程fork一個(gè)子進(jìn)程,然后子進(jìn)程會(huì)將所有執(zhí)行過的命令寫入aof文件中(讀操作不記錄,只記錄寫的記錄,因?yàn)橹挥袑懙牟僮鞑艜?huì)對(duì)數(shù)據(jù)庫(kù)產(chǎn)生影響),如果該文件有錯(cuò)誤,redis就啟動(dòng)不了,可通過redis-check-aof工具(redis-check-aof --fix)去修復(fù)。當(dāng)子進(jìn)程完成AOF重寫后會(huì)像父進(jìn)程發(fā)送完成信號(hào),然后覆蓋舊的AOF文件。
優(yōu)點(diǎn):1,每一次修改都同步,文件的完整性會(huì)更好
2,如果不開啟同步時(shí)間,效率最高。(默認(rèn)每秒同步一次)
缺點(diǎn):1,aof文件遠(yuǎn)遠(yuǎn)大于rdb文件,故修復(fù)速度慢
2,aof運(yùn)行效率比rdb慢,所以redis默認(rèn)的配置是rdb持久化
Redis主從復(fù)制:從機(jī)連主機(jī)
1,在計(jì)算機(jī)中創(chuàng)建一個(gè)myredis文件夾
2,復(fù)制redis.conf文件到myredis
3,分別命名redis6380.conf等等多個(gè)從機(jī)
4,開啟三個(gè)redis的服務(wù)

5,分別在不同的xshell窗口連接redis窗口

6,通過slaveof連接(slaveof +master服務(wù)器ip(我們一臺(tái)服務(wù)器,即是本機(jī)ip:127.0.0.1)+master服務(wù)器端口)
7,可通過info replication命令來查看是否連接從機(jī)和當(dāng)前端口的信息。
薪火相傳:從機(jī)連從機(jī),即是說假如我們現(xiàn)在有20個(gè)從機(jī),那么我們可以讓主機(jī)跟其中三個(gè)直接對(duì)接,再讓這三個(gè)每個(gè)跟另外3個(gè)對(duì)接,以此類推。好處就是減輕了主機(jī)的負(fù)擔(dān),壞處就是前面的服務(wù)器宕機(jī)了后面的就無法跟主機(jī)同步數(shù)據(jù)
反客為主:主從復(fù)制中,即使主機(jī)發(fā)生宕機(jī),從機(jī)也不會(huì)做任何操作,一旦主機(jī)上線,從機(jī)依然跟著主機(jī)。反客為主就是當(dāng)主機(jī)宕機(jī)后,從機(jī)晉升為主機(jī)。通過在從機(jī)中執(zhí)行命令slave no one即可。
哨兵模式:反客為主的自動(dòng)版,能夠后臺(tái)監(jiān)控主機(jī)是否故障,然后根據(jù)選舉(篩選?排序)將從機(jī)轉(zhuǎn)為主機(jī)。即使主機(jī)重新連線,也是作為新主機(jī)的從機(jī)。
篩選機(jī)制:篩選所有處于下線的從機(jī),篩選所有沒有在規(guī)定時(shí)間響應(yīng)哨兵的info命令的從機(jī),篩選所有數(shù)據(jù)比較舊(通過設(shè)置down-after-milliseconds的值篩選)的從機(jī)。
哨兵模型選擇選擇新主機(jī)的機(jī)制(排序機(jī)制)為:
1、優(yōu)先級(jí)靠前的(redis.conf中replica-priority 的值越小,優(yōu)先級(jí)越高)
2、同樣位置,則偏移量最大的(獲得原主機(jī)數(shù)據(jù)最全的)
3、既同樣位置又同樣的偏移量,則runid最小的(每個(gè)redis實(shí)例啟動(dòng)后都會(huì)隨機(jī)生成一個(gè)40位的runid)
實(shí)現(xiàn)哨兵模式:在我們的 myredis 目錄下新建一個(gè)文件?sentinel.conf,必須為這個(gè)名字,不能自定義。文件中填寫:
sentinel monitor mymaster 127.0.0.1 6379 1
(哨兵監(jiān)控我的主機(jī) 主機(jī)服務(wù)器ip 同意數(shù)量)
其中:mymaster是為監(jiān)控對(duì)象起的服務(wù)器的名稱,1是指至少有多少個(gè)哨兵同意就可以遷移(從機(jī)代替主機(jī))的數(shù)量。
通過 redis-sentinel sentinel.conf命令啟動(dòng)哨兵,哨兵的默認(rèn)端口是26379
缺點(diǎn):
1,復(fù)制延遲,由于所有的寫操作都是在主機(jī)寫然后同步更新到從機(jī)上,所以從主機(jī)到從機(jī)會(huì)有一定的延遲,和網(wǎng)絡(luò)和從機(jī)數(shù)量也有關(guān)系。
2,sentinel選舉新主機(jī)時(shí)是沒辦法訪問redis的,存在訪問瞬斷的情況,可能損失數(shù)據(jù)。
3,主機(jī)壓力大,因?yàn)橹挥兄鳈C(jī)可以進(jìn)行寫操作。
redis6加入了多線程,但不是普遍意義上的多線程,redis的多線程部分只是用來處理網(wǎng)絡(luò)數(shù)據(jù)的讀寫和協(xié)議,執(zhí)行命令任然是單線程的。
【尚硅谷】Redis 6 入門到精通 超詳細(xì) 教程的評(píng)論 (共 條)
