目錄
- 第一章、Redis數據庫的下載和安裝
- 1.1)nosql數據庫和 Redis 介紹
- 1.2)Windows中下載安裝Redis數據庫
- 1.3)Linux中安裝Redis數據庫
- 1.4)Linux中啟動redis
- 1.5)Linux中關閉redis
- 第二章、三種Redis客戶端連接Redis數據庫
- 2.1)redis 命令行客戶端
- 2.2)redis 遠程客戶端
- 2.3)redis 編程客戶端Jedis
- 2.3.1)下載 Jedis 和 Commons-Pool
- 2.3.2)Java 應用使用 Jedis 準備
- 2.3.3)使用jedis連接池操作數據
- 第三章、Redis 命令大全
- 3.1)通用命令
- 語法:redis >ping
- 語法:dbsize
- 語法:select db
- 語法:flushdb
- 語法:exit 或 quit
- 語法:redis-cli
- 3.2)Redis 的 Key 的操作命令
- 語法:keys pattern
- 語法:exists key [key…]
- 語法:expire key seconds
- 語法:ttl key
- 語法:type key
- 語法:del key [key…]
- 3.3) 字符串類型的value操作命令
- 語法:set key value
- 語法: get key
- 語法:incr key
- 語法:decr key
- 語法:append key value
- 語法:strlen key
- 語法:getrange key start end
- 語法:setrange key offset value
- 語法:mset key value [key value…]
- 語法:mget key [key …]
- 3.4)哈希類型的value操作命令
- 語法:hset hash 表的 key field value
- 語法:hget key field
- 語法:hmset key field value [field value…]
- 語法:hmget key field [field…]
- 語法:hgetall key
- 語法:hdel key field [field…]
- 語法:hkeys key
- 語法:hvals key
- 語法:hexists key field
- 3.5)列表list類型的value操作命令
- 語法:lpush key value [value…]
- 語法:rpush key value [value…]
- 語法:lrange key start stop
- 語法:lindex key index
- 語法:llen key
- 語法:lrem key count value
- 語法:lset key index value
- 語法:linsert key BEFORE|ALFTER pivot value
- 3.6)集合類型的value操作命令
- 語法:sadd key member [member…]
- 語法:smembers key
- 語法:sismember key member
- 語法:scard key
- 語法:srem key member [member…]
- 語法:srandmember key [count]
- 語法:spop key [count]
- 3.7)有序集合類型的value操作命令
- 語法:zadd key score member [score member…]
- 語法:zrange key start stop [WITHSCORES]
- 語法:zrevrange key start stop [WITHSCORES]
- 語法:zrem key member [member…]
- 語法:zcard key
- 語法:zrangebyscore key min max [WITHSCORES ] [LIMIT offset count]
- 語法:zrevrangebyscore key max min [WITHSCORES ] [LIMIT offset count]
- 語法:zcount key min max
- 第四章、redis事務和watch機制
- 4.1)redis事務,事務的三大命令
- 語法:開啟事務 multi
- 語法:執行事務 exec
- 語法:取消事務 discard
- 4.2)redis事務的錯誤和回滾的情況
- 4.3)watch機制
- 語法:watch key [key ...]
- 語法:unwatch
- 第五章、redis的持久化
- 5.1)持久化概述
- 5.2)RDB方式持久化
- 5.2.1)配置過程
- 5.3)AOF方式持久化
- 5.3.1)配置過程
- 第六章、redis的容災處理之哨兵
- 6.1)主從復制模式
- 6.2)Redis 主從復制實現、
- 6.3)容災處理之哨兵
- 6.4)Sentinel 配置
友情提醒:
先看文章目錄,大致了解文章知識點結構,點擊文章目錄可直接跳轉到文章指定位置。 |
第一章、Redis數據庫的下載和安裝
1.1)nosql數據庫和 Redis 介紹
nosql數據庫介紹:
解釋為 non-relational(非關系型數據庫)。在NoSQL 數據庫中數據之間是無聯系的數據的結構是松散的,可變的。
優勢:
大數據量,高性能,靈活的數據模型,高可用,低成本
劣勢:
(1)無關系,數據之間是無聯系的。
(2)不支持標準的 SQL,沒有公認的 NoSQL 標準
(3)沒有關系型數據庫的約束,大多數也沒有索引的概念
(4)沒有事務,不能依靠事務實現 ACID.
沒有豐富的數據類型(數值,日期,字符,二進制,大文本等)
Redis 介紹:
Remote Dictionary Server(Redis) 是一個開源的使用 ANSI C 語言編寫、支持網絡、可基于內存亦可持久化的 Key-Value 數據庫. 每種數據類型有自己的專屬命令。Key 是字符類型
其值(value)可以是 :
①字符串(String),它能存儲任何形式的字符串,包括二進制數據,序列化后的數據,JSON 化的對象甚至是一張圖片
②哈希(Map),是一個 string 類型的 field 和 value 的映射表,hash 特別適合用于存儲對象。value分為field和value
③列表(list),列表是簡單的字符串列表,按照插入順序排序。你可以添加一個元素到列表的頭部(左邊)或者尾部(右邊)
④集合(sets) ,是 string 類型的無序集合,集合成員是唯一的,即集合中不能出現重復的數
據.
⑤有序集合(sorted sets), string 類型元素的集合,不允許重復的成員。不同的是 zset 的每個元素都會關聯一個分數(分數可以重復),redis 通過分數來為集合中的成員進行從小到大的排序。
1.2)Windows中下載安裝Redis數據庫
①Redis官網沒有Windows版本:https://redis.io/
②windows 版本下載:https://github.com/MSOpenTech/redis/releases
③下載的 Redis-x64-3.2.100.zip 解壓后即可使用。目錄結構:
④雙擊 redis-server.exe 啟動 Redis
⑤按 ctrl+c 退出 Redis 服務程序
⑥找不到配置文件,可在命令行(cmd)啟動:
F:\redis_windows>redis-server.exe redis.windows.conf
1.3)Linux中安裝Redis數據庫
①官網下載Linux版本Redis:https://redis.io/
②使用 Xftp 工具傳輸 redis-3.2.9.tar 到 linux 系統
Xftp工具下載和使用教程鏈接
③解壓 redis-3.2.9.tar 到 usr/local 目錄
tar -zxvf redis-3.2.9.tar.gz -C /usr/local
④在/usr/local/redis-3.2.9目錄下使用make命令編譯 Redis 文件
cd /usr/local/redis-3.2.9
make
⑤出現錯誤gcc找不到報錯如圖:
解決方式:安裝gcc
yum -y install gcc
⑥安裝gcc后執行 make distclean
命令,出現報錯
解決方式:執行如下命令
make MALLOC=libc
⑦再次執行make,出現如下頁面代表成功
⑧再執行 make install
make install
⑨查看make編譯結果
#先進入src目錄
cd src
#再ls
ls
1.4)Linux中啟動redis
①前臺方式啟動Redis 的服務器不能退出當前窗口, 退出窗口,應用終止: src 目錄下執行
./redis-server
②后臺方式啟動Redis 的服務器,src 目錄下執行
./redis-server &
③查看redis進程
ps -ef | grep redis
1.5)Linux中關閉redis
①執行 redis-cli shutdown
redis-cli shutdown
②停止redis進程
#這里的4628為PID
kill -9 4628
第二章、三種Redis客戶端連接Redis數據庫
2.1)redis 命令行客戶端
①后臺方式開啟redis
redis-server &
②直接連接 redis (默認 ip127.0.0.1,端口 6379):
redis-cli
使用ping命令查看redis是否響應回復:PONG
ping
2.2)redis 遠程客戶端
①下載桌面客戶端Redis Desktop Manager不過現在改名叫RESP.app了,而且除了Linux端免費其他的都收費,官網地址:https://redisdesktop.com/
②可直接百度網盤提取免費的舊版本:redis遠程客戶端文件下載后雙擊exe文件安裝
③點擊next,選擇安裝目錄,點擊install即可
④進入/usr/local/redis-3.2.9安裝目錄,編輯redis.conf文件
cd /usr/local/redis-3.2.9
vi redis.conf
⑤如下圖:將bind注釋,將保護模式改為no,保存退出
⑥關閉redis后,使用配置文件重新啟動
#關閉redis
redis-cli shutdown
#以配置文件啟動
redis-server redis.conf &
⑦使用遠程客戶端連接客戶端
⑧界面介紹
2.3)redis 編程客戶端Jedis
jedis 是一個很小但很健全的 redis 的 java 客戶端。通過 Jedis 可以像使用 Redis 命令行一樣使用 Redis。
jedis 完全兼容 redis 2.8.x and 3.x.x
Jedis 源碼:https://github.com/xetorthio/jedis
api 文檔:http://xetorthio.github.io/jedis/
2.3.1)下載 Jedis 和 Commons-Pool
①瀏覽器打開:http://search.maven.org/ ,搜索 jedis。在 Download 處,點擊 jar下載
為了避免每次使用 Jedis 對象時都需要重新構建,Jedis 提供了 JedisPool。JedisPool 是基于Commons Pool 2 實現的一個線程安全的連接池。
瀏覽器打開:http://search.maven.org/ ,搜索 commons-pool2。在 Download 處,點擊 jar 下載
2.3.2)Java 應用使用 Jedis 準備
項目中加入兩個jar包:
jedis-2.9.0.jar
commons-pool2-2.4.2.jar
2.3.3)使用jedis連接池操作數據
①字符串
② 哈希
jedis連接實例池
使用連接池操作 hash操作數據
③列表 list
④集合 Set
⑤有序集合 Sorted Set
⑥事務
支持部分事務操作
第三章、Redis 命令大全
3.1)通用命令
①溝通命令,查看狀態, 返回 PONG
語法:redis >ping
②查看當前數據庫中 key 的數目:
語法:dbsize
③redis默認十六個庫,切換庫命令:
語法:select db
④刪除當前庫的數據:
語法:flushdb
⑤退出當前 redis 連接:
語法:exit 或 quit
⑥登錄自帶redis 命令行客戶端:
語法:redis-cli
3.2)Redis 的 Key 的操作命令
①查看key
語法:keys pattern
通配符:
* :表示 0-多個字符 ,例如:keys * 查詢所有的 key , *表示 0 或多個字符
?:表示單個字符,例如:wo?d , 匹配 word , wood
②判斷 key 是否存在
語法:exists key [key…]
exists key
exists key1 key2...
③ 設置 key 的生存時間,超過時間,key 自動刪除。單位是秒。
語法:expire key seconds
④以秒為單位,返回 key 的剩余生存時間(ttl: time to live)返回值:
-1 :沒有設置 key 的生存時間, key 永不過期。
-2 :key 不存在
語法:ttl key
⑤查看 key 所存儲值的數據類型返回值:字符串表示的數據類型
none (key 不存在)
string (字符串)
list (列表)
set (集合)
zset (有序集)
hash (哈希表)
語法:type key
⑥刪除指定存在的 key ,不存在的 key 忽略。
返回值:數字,刪除的 key 的數量。
語法:del key [key…]
3.3) 字符串類型的value操作命令
①將字符串值 value 設置到 key 中,已經存在的 key 設置新的 value,會覆蓋原來的值。
語法:set key value
②獲取 key 中設置的字符串值
語法: get key
③將 key 中儲存的數字值加 1,如果 key 不存在,則 key 的值先被初始化為 0 再執行 incr 操作(只能對數字類型的數據操作)
語法:incr key
④將 key 中儲存的數字值減1,如果 key 不存在,則么 key 的值先被初始化為 0 再執行 decr 操作(只能對數字類型的數據操作)
語法:decr key
⑤如果 key 存在, 則將 value 追加到 key 原來舊值的末尾如果 key 不存在, 則將 key 設置值為 value
返回值:追加字符串之后的總長度
語法:append key value
⑥返回 key 所儲存的字符串值的長度返回值:
如果key存在,返回字符串值的長度
key不存在,返回0
語法:strlen key
⑦獲取 key 中字符串值從 start 開始 到 end 結束 的子字符串,包括 start 和 end, 負數表示從字符串的末尾開始, -1 表示最后一個字符
返回值:截取的子字符串。
語法:getrange key start end
⑧用 value 覆蓋(替換)key 的存儲的值從 offset 開始,不存在的 key 做空白字符串。
返回值:修改后的字符串的長度
語法:setrange key offset value
⑨同時設置一個或多個 key-value 對
語法:mset key value [key value…]
⑩獲取(一個或多個)給定 key 的值
返回值:包含所有 key 的列表
語法:mget key [key …]
3.4)哈希類型的value操作命令
①哈希類型field(域 )和 value 的隱射表,value分為field和value,hset可將key中的值設置為value,如果 key 不存在,則新建 hash 表,執行賦值,如果有 field ,則覆蓋值。
返回值:
如果 field 是 hash 表中新 field,且設置值成功,返回 1
如果 field 已經存在,舊值覆蓋新值,返回 0
語法:hset hash 表的 key field value
key鍵已經存在則覆蓋
②獲取哈希表 key 中給定域 field 的值
返回值:field 域的值,如果 key 不存在或者 field 不存在返回 nil
語法:hget key field
獲取不存在的 field,返回nil
③同時將多個 field-value (域-值)設置到哈希表 key 中,此命令會覆蓋已經存在的 field, 若hash 表 key 不存在,創建空的 hash 表,執行 hmset.
返回值:設置成功返回 ok, 如果失敗返回一個錯誤
語法:hmset key field value [field value…]
key 類型不是 hash,產生錯誤
④獲取哈希表 key 中一個或多個給定域的值
返回值:返回和 field 順序對應的值,如果 field 不存在,返回 nil
語法:hmget key field [field…]
⑤獲取哈希表 key 中所有的域和值
返回值:以列表形式返回 hash 中域和域的值 ,key 不存在,返回空 hash
語法:hgetall key
不存在的 key,返回空列表
⑥刪除哈希表 key 中指定域 field,不存在 field 直接忽略
返回值:成功刪除的 field 的數量
語法:hdel key field [field…]
⑦查看哈希表 key 中的所有 field 域
返回值:包含所有 field 的列表,key 不存在返回空列表
語法:hkeys key
⑧返回哈希表中所有域的值
返回值:包含哈希表所有域值的列表,key 不存在返回空列表
語法:hvals key
⑨查看哈希表 key 中,給定域 field 是否存在
返回值:如果 field 存在,返回 1, 其他返回 0
語法:hexists key field
3.5)列表list類型的value操作命令
①將一個或多個值 value 插入到列表 key 的表頭(最左邊),從左邊開始加入值,從左到右的順序依次插入到表頭,返回值:數字,新列表的長度
語法:lpush key value [value…]
②將一個或多個值 value 插入到列表 key 的表尾(最右邊),各個 value 值按從左到右的順序依次插入到表尾
返回值:數字,新列表的長度
語法:rpush key value [value…]
③獲取列表 key 中指定區間內的元素,0 表示列表的第一個元素,start , stop 是列表的下標值, -1 表示列表的最后一個元素, start ,stop 超出列表的范圍不會出現錯誤。
返回值:指定區間的列表
語法:lrange key start stop
顯示列表中第 2 個元素,下標從 0 開始
④查詢獲取列表 key 中下標為指定 index 的元素,0 表示列表的第一個元素,start , stop 是列表的下標值, -1 表示列表的最后一個元素,
返回值:指定下標的元素;index 不在列表范圍,返回 nil
語法:lindex key index
⑤獲取列表 key 的長度
返回值:數值,列表的長度; key 不存在返回 0
語法:llen key
⑥根據參數 count 的值,移除列表中與參數 value 相等的元素, count >0 ,從列表的左側向右開始移除; count < 0 從列表的尾部開始移除;count = 0 移除表中所有與 value 相等的值。
返回值:數值,移除的元素個數
語法:lrem key count value
刪除列表中所有的指定元素,刪除所有的 java
⑦將列表 key 下標為 index 的元素的值設置為 value。
返回值:設置成功返回 ok ; key 不存在或者 index 超出范圍返回錯誤信息
語法:lset key index value
⑧將值 value 插入到列表 key 當中位于值 pivot 之前或之后的位置。key 不存在,pivot 不在列表中,不執行任何操作。
返回值:命令執行成功,返回新列表的長度。沒有找到 pivot 返回 -1, key 不存在返回 0。
語法:linsert key BEFORE|ALFTER pivot value
修改列表 arch,在值 dao 之前加入 service
操作不存在的 pivot
3.6)集合類型的value操作命令
①將一個或多個 member 元素加入到集合 key 當中,已經存在于集合的 member 元素將被忽略,不會再加入。
返回值:加入到集合的新元素的個數。不包括被忽略的元素
語法:sadd key member [member…]
②獲取集合 key 中的所有成員元素,不存在的 key 視為空集合
語法:smembers key
③判斷 member 元素是否是集合 key 的成員
返回值:member 是集合成員返回 1,其他返回 0
語法:sismember key member
④獲取集合里面的元素個數
返回值:數字,key 的元素個數。 其他情況返回 0
語法:scard key
⑤刪除集合 key 中的一個或多個 member 元素,不存在的元素被忽略。
返回值:數字,成功刪除的元素個數,不包括被忽略的元素。
語法:srem key member [member…]
⑥只提供 key,隨機返回集合中一個元素;提供了 count 時,count 正數, 返回包含 count 個數元素的集合, 集合元素各不相同。count 是負數,返回一個 count 絕對值的長度的集合, 集合中元素可能會重復多次。
返回值:一個元素;多個元素的集合
語法:srandmember key [count]
隨機顯示集合的一個元素
使用 count 參數, count 是正數
使用 count 參數,count 是負數
⑦隨機從集合中刪除一個元素, count 是刪除的元素個數。
返回值:被刪除的元素,key 不存在或空集合返回 nil
語法:spop key [count]
隨機從集合刪除一個元素
隨機刪除指定個數的元素
3.7)有序集合類型的value操作命令
①將一個或多個 member 元素及其 score 值加入到有序集合 key 中,如果 member 存在集合中,則更新值;score 可以是整數或浮點數
返回值:數字,新添加的元素個數
語法:zadd key score member [score member…]
創建保存學生成績的集合:studentscore
使用浮點數作為 score
②查詢有序集合指定區間內的元素。集合成員按 score 值從小到大來排序。 start, stop 都是從 0 開始。0 是第一個元素,1 是第二個元素。以 -1 表示最后一個成員,-2 表示倒數第二個成員。使用WITHSCORES 選項讓 score 和 value 一同返回。
返回值:自定區間的成員集合
語法:zrange key start stop [WITHSCORES]
顯示集合的全部元素,不使用 WITHSCORES 則不顯示 score
顯示集合全部元素,并使用 WITHSCORES
顯示0,1 二個成員
排序顯示浮點數的 score
③返回有序集 key 中,指定區間內的成員。其中成員的位置按 score 值遞減(從大到小) 來排列。其它同 zrange 命令。
返回值:自定區間的成員集合
語法:zrevrange key start stop [WITHSCORES]
④刪除有序集合 key 中的一個或多個成員,不存在的成員被忽略
返回值:被成功刪除的成員數量,不包括被忽略的成員。
語法:zrem key member [member…]
⑤獲取有序集 key 的元素成員的個數返回值:key 存在返回集合元素的個數, key 不存在,返回 0
語法:zcard key
⑥獲取有序集 key 中,所有 score 值介于 min 和 max 之間(包括 min 和 max)的成員,有序成員是按遞增(從小到大)排序。
min ,max 是包括在內 , 使用符號 ( 表示不包括。 min , max 可以使用 -inf ,
+inf 表示最小和最大 limit 用來限制返回結果的數量和區間。 withscores 顯示 score 和 value
返回值:指定區間的集合數據使用的準備數據
語法:zrangebyscore key min max [WITHSCORES ] [LIMIT offset count]
顯示指定具體區間的集合數據,開區間(不包括 min,max)
顯示整個集合的所有數據
使用 limit 增加新的數據
⑦返回有序集 key 中, score 值介于 max 和 min 之間(默認包括等于 max 或 min )的所有的成員。有序集成員按 score 值遞減(從大到小)的次序排列。其他同 zrangebyscore
語法:zrevrangebyscore key max min [WITHSCORES ] [LIMIT offset count]
⑧返回有序集 key 中, score 值在 min 和 max 之間(默認包括 score 值等于 min 或 max ) 的成員的數量
語法:zcount key min max
工資在 3000-5000 的員工數量
第四章、redis事務和watch機制
4.1)redis事務,事務的三大命令
什么是redis事務
Redis 中的事務(transaction)是一個單獨隔離的操作,保證兩個或兩個以上的命令集合按需排隊并順序執行,中間不會被任何其他操作打斷。
redis事務其實是指運用事務的思想實現一組集合命令的執行,沒有回滾的概念,嚴格意義上沒有事務。
①multi - setAutoCommoit(false)-事務開啟
語法:開啟事務 multi
作用:標記一個事務的開始。通過multi,后續的命令都會按照先后順序被放進一個隊列當中。當用戶鍵入exec后,這些指令都會按順序執行。
返回值:總是返回 ok
②exec -執行
語法:執行事務 exec
作用:執行所有事務塊內的命令
返回值:事務內的所有執行語句內容,事務被打斷(影響)返回 nil
③discard -取消
語法:取消事務 discard
作用:取消事務,如果開啟multi后輸入若干命令,再鍵入discard,則之前的命令令通通取消執行。
返回值:總是返回 ok
# 開啟事務
127.0.0.1:6379> MULTI
OK
# 輸入兩個或者兩個以上命令
127.0.0.1:6379(TX)> set k1 v1
QUEUED
127.0.0.1:6379(TX)> set k2 v2
QUEUED
# 執行命令
127.0.0.1:6379(TX)> EXEC
1) OK
2) OK
127.0.0.1:6379> keys *
1) "k1"
2) "k2"
4.2)redis事務的錯誤和回滾的情況
①組隊時出錯,錯誤對于redis來說是已知的,事務中的所有指令都會失效。
127.0.0.1:6379> MULTI
OK
127.0.0.1:6379(TX)> set k1 v1
QUEUED
127.0.0.1:6379(TX)> set k2 v2
QUEUED
127.0.0.1:6379(TX)> set k33
(error) ERR wrong number of arguments for 'set' command
127.0.0.1:6379(TX)> set k4 v4
QUEUED
127.0.0.1:6379(TX)> exec
(error) EXECABORT Transaction discarded because of previous errors.
127.0.0.1:6379> keys *
(empty array)
②運行時出錯:因為錯誤是未知的,所以redis必須執行時才能知道錯誤,而redis無錯誤回滾機制,會繼續執行后續指令并有效。
127.0.0.1:6379> MULTI
OK
127.0.0.1:6379(TX)> set k1 v1
QUEUED
127.0.0.1:6379(TX)> INCR k1
QUEUED
127.0.0.1:6379(TX)> set k2 v2
QUEUED
127.0.0.1:6379(TX)> EXEC
1) OK
2) (error) ERR value is not an integer or out of range
3) OK
127.0.0.1:6379> keys *
1) "k1"
2) "k2"
127.0.0.1:6379>
4.3)watch機制
①watch 監視某個或者某幾個key的值,如果有 key 的 value 值在事務 EXEC 執行之前被修改了,那么事務將被打斷。
返回值:總是返回 ok
語法:watch key [key …]
②取消 WATCH 命令對所有 key 的監視。如果在執行 WATCH 命令之后, EXEC 命令或 DISCARD 命令先被執行了的話,那么就不需要再執行 UNWATCH 了
返回值:總是返回 ok
語法:unwatch
③例子
啟動服務器redis-server , 再開啟兩個客戶端連接。 分別叫 A 客戶端 (紅色)和 B 客戶端(黃色)。
1)在 A 客戶端設置 key : str.lp 登錄人數為 10
2)在 A 客戶端監視 key : str.lp
3)在 A 客戶端開啟事務 multi
4)在 A 客戶端修改 str.lp 的值為 11
5)在 B 客戶端修改 str.lp 的值為 15
6)在 A 客戶端執行事務 exec
7)在 A 客戶端查看 str.lp 值,A 客戶端執行的事務沒有提交,因為 WATCH 的 str.lp 的值已經被修改了, 所以放棄了事務。
第五章、redis的持久化
5.1)持久化概述
①持久化可以理解為將數據存儲到一個不會丟失的地方,Redis 的數據存儲在內存中,電腦關閉數據就會丟失,所以放在內存中的數據不是持久化的,而放在磁盤就算是一種持久化。
②為解決這個問題,redis提供了兩種持久化的方式,便于發生故障后能迅速恢復數據,分別是RDB(Redis DataBase)和AOF(Append Only File)。
③兩種方式也可以同時使用,優先采用AOF方式來進行數據恢復,因為AOF方式的數據恢復完整度更高。
5.2)RDB方式持久化
①就是在指定的時間點內將內存中的數據集快照寫入磁盤,數據恢復時將快照文件直接再讀到內存。
②RDB 技術非常適合做備份,可以保存最近一個小時,一天,一個月的全部數據。保存數據是在單獨的進程中寫文件,不影響 Redis 的正常使用。RDB 恢復數據時比其他 AOF 速度快。
③RDB缺點:即使每5分鐘都持久化一次,當redis故障時,仍然會有近5分鐘的數據丟失。
5.2.1)配置過程
在配置文件 redis.conf 中搜索 SNAPSHOTTING, 查找在注釋開始和結束之間的關于 RDB 的配置說明。配置地方有三處。
①: 配置執行 RDB 生成快照文件的時間策略。 讓它在“ N 秒內數據集至少有 M 個 key 改動”
這一條件被滿足時,自動保存一次數據集。 配置格式:save <seconds> <changes>
save 900 1
save 300 10
save 60 10000 ②: dbfilename:設置 RDB 的文件名,默認文件名為 dump.rdb
③: dir:指定 RDB 文件的存儲位置,默認是 ./ 當前目錄
配置步驟:
①:查看 ps -ef | grep redis ,如果 redis 服務啟動,先停止。
②:修改 redis.conf 文件, 修改前先備份,執行 cp redis.conf bak_redis.conf
查看默認啟用的 RDB 文件
③:編輯 redis.conf 增加 save 配置, 修改文件名等。vim redis.conf
修改的內容:
把原來的默認的 dump.rdb 刪除,修改 redis.conf 后,重新啟動 redis
④:在 20 秒內,修改三個 key 的值
⑤:查看生成的 rdb 文件
5.3)AOF方式持久化
①Redis 每次接收到一條改變數據的命令時,它將把該命令寫到一個 AOF 文件中(只記錄寫操作,讀操作不記錄),當 Redis 重啟時,它通過執行 AOF 文件中所有的命令來恢復數據。
②在同樣數據規模時,AOF文件要比RDB文件的體積大。恢復速度要慢于RDB方式。
③Redis 支持在不影響服務的前提下在后臺重構 AOF 文件,讓文件得以整理變小。比如:做一百次加法計算,最后你只會在數據庫里面得到最終的數值,但是在你的 AOF 里面會存在 100 次記錄,其中有99 條記錄對最終的結果是無用的會被整理掉;
5.3.1)配置過程
AOF 方式的數據持久化,僅需在 redis.conf 文件中配置即可配置項:
①:停止運行的 redis , 備份要修改的 redis.conf
②:查看 redis 安裝目錄/src 下有無 .aof 文件。 默認是在 redis 的當前目錄
③:編輯 redis.conf, appendonly默認是 no,改成 yes 即開啟了 aof 持久化 , 查看 appendfilname 的文件名稱是appendonly.aof
④:appendfsync:配置向 aof 文件寫命令數據的策略:
no:不主動進行同步操作,而是完全交由操作系統來做(即每 30 秒一次),比較快但不是很安全。
always:每次執行寫入都會執行同步,慢一些但是比較安全。
everysec:每秒執行一次同步操作,比較平衡,介于速度和安全之間。這是默認項。
⑤:dir : 指定 RDB 和 AOF 文件存放的目錄,默認是 ./
⑥:auto-aof-rewrite-min-size:允許重寫的最小 AOF 文件大小,默認是 64M 。當 aof 文件大于 64M 時,開始整理 aof文件, 去掉無用的操作命令。縮小 aof 文件。
⑦測試:在 redis 客戶端執行 寫入命令
查看 aof 文件
第六章、redis的容災處理之哨兵
6.1)主從復制模式
①單點故障:數據存儲在一臺服務器上,服務器出現故障就會導致數據丟失。所以我們需要將數據復制多份部署在多臺不同的服務器上,在配置文件中指定這幾臺 redis 之間的主從關系。
②主從復制:多臺 redis 服務器的數據同步功能,主服務器(master)負責寫入數據,同時把寫入的數據實時同步到從(slave )機器,從服務器負責讀
③當 Master 服務出現故障,需手動將 slave 中的一個提升為 master, 剩下的 slave 掛至新的master 上(冷處理:機器掛掉了,再處理)
6.2)Redis 主從復制實現、
修改配置文件,啟動時,服務器讀取配置文件,并自動成為指定服務器的從服務器,從而構成主從復制的關系
①如果 Redis 啟動,先停止,模擬多 Reids 服務器,從原有的 redis.conf 配置文件中拷貝三份,分別命名為 redis6380.conf, redis6382.conf , redis6384.conf
②編輯作為 Master 的配置文件 redis6380.conf : 在空文件加入如下內容
#包含原來的配置文件內容。/usr/local/redis-3.2.9/redis.conf 按照自己的目錄設置。
include /usr/local/redis-3.2.9/redis.conf daemonize yes port 6380
pidfile /var/run/redis_6380.pid
logfile 6380.log
dbfilename dump6380.rdb
配置項說明:
include :包含原來的配置文件內容。/usr/local/redis-3.2.9/redis.conf 按照自己的目錄設置。
daemonize:yes 后臺啟動應用,相當于 ./redis-server & , &的作用。
port : 自定義的端口號
pidfile : 自定義的文件,表示當前程序的 pid ,進程 id。
logfile:日志文件名
dbfilename:持久化的 rdb 文件
③編輯作為 Slave服務器的配置文件redis6382.conf 和 redis6384.conf: 在空文件加入如下內容
#①:redis6382.conf中加入:
include /usr/local/redis-3.2.9/redis.conf daemonize yes port 6382
pidfile /var/run/redis_6382.pid
logfile 6382.log
dbfilename dump6382.rdb
slaveof 127.0.0.1 6380
#②:redis6384.conf中加入:
include /usr/local/redis-3.2.9/redis.conf daemonize yes port 6384
pidfile /var/run/redis_6384.pid
logfile 6384.log
bfilename dump6384.rdb
slaveof 127.0.0.1 6380
配置項說明: slaveof : 表示當前 Redis 是誰的從。當前是 127.0.0.1 端口 6380 這個 Master 的從服務器。
④使用配置文件方式啟動redis,并查看啟動進程
⑤使用指定端口連接 Redis 服務器,查看配置后的服務信息
./redis-cli -p 端口
查看6380端口的服務器信息
info replication
在新的 Xshell 窗口分別登錄到 6382 ,6384 查看信息
⑥向 Master 寫入數據,先執行 flushall 清除數據,避免干擾到測試數據。 生產環境謹慎使用。
⑦在從服務器 Slave 讀數據,可以讀主 Master 的數據,不能寫
Slave 寫數據失敗
6.3)容災處理之哨兵
Sentinel 哨兵是 redis 官方提供的高可用方案,監控多個 Redis 服務實例的運行情況。
Sentinel 系統是一個運行在特殊模式下的 Redis 服務器。Redis Sentinel 是在多個 Sentinel 進程環境下互相協作工作的。
Sentinel 系統有三個主要任務:
監控:Sentinel 不斷的檢查主服務和從服務器是否按照預期正常工作。
提醒:被監控的 Redis 出現問題時,Sentinel 會通知管理員或其他應用程序。
自動故障轉移:監控的主 Redis 不能正常工作,Sentinel 會開始進行故障遷移操作。將一個從服務器升級新的主服務器。 讓其他從服務器掛到新的主服務器。同時向客戶端提供新的主服務器地址。
6.4)Sentinel 配置
①復制三份sentinel.conf文件
Sentinel系統默認 port 是26379 。三個配置port分別設置為 26380 , 26382 , 26384 。三個文件分別命名:
sentinel26380.conf
sentinel26382.conf
sentinel26384.conf
執行復制命令 cp sentinel.conf xxx.conf
②三份 sentinel 配置文件修改
sentinel26380.conf
1、修改 port
2、修改監控的 master 地址 6382
sentinel26382.conf 文件同樣修改
port 26382
master的port :6382
sentinel26384.conf 文件同樣修改
port 26384
master的port :6382
③啟動主從(Master/Slave)Redis
啟動 Reids
查看 Master 的配置信息連接到 6382 端口
使用 info 命令查看 Master/Slave
④啟動 Sentinel模式下的Redis服務實例
在 XShell 開啟三個窗口分別執行命令,將創建三個監視主服務器的Sentinel實例:
./redis-sentinel …/sentinel26380.conf
./redis-sentinel …/sentinel26382.conf
./redis-sentinel …/sentinel26384.conf
⑤讓主 Redis 不能工作
讓 Master 的 Redis 停止服務, 先執行 info replication 確認 Master 的 Redis 后再執行 shutdown
查看當前 Redis 的進程情況
⑥Sentinel 的起作用
在 Master 執行 shutdown 后, 稍微等一會 Sentinel 要進行投票計算,從可用的 Slave
選舉新的 Master。查看 Sentinel 日志。
查看新的 Master
查看原 Slave 的變化
⑦新的 Redis 加入 Sentinel 系統,自動加入 Master
重新啟動 6382
查看 6384 的信息
測試數據:在 Master 寫入數據
在 6382 上讀取數據,不能寫入
⑧監控
1)Sentinel 會不斷檢查 Master 和 Slave 是否正常
2)如果 Sentinel 掛了,就無法監控,所以需要多個哨兵,組成 Sentinel 網絡,一個健康的
Sentinel 至少有 3 個 Sentinel 應用。 彼此在獨立的物理機器或虛擬機。
3)監控同一個 Master 的 Sentinel 會自動連接,組成一個分布式的 Sentinel 網絡,互相通信并交換彼此關于被監控服務器的信息
4)當一個 Sentinel 認為被監控的服務器已經下線時,它會向網絡中的其它 Sentinel 進行確認,判斷該服務器是否真的已經下線
5)如果下線的服務器為主服務器,那么 Sentinel 網絡將對下線主服務器進行自動故障轉移,通過將下線主服務器的某個從服務器提升為新的主服務器,并讓其從服務器轉移到新的主服務器下,以此來讓系統重新回到正常狀態
6)下線的舊主服務器重新上線,Sentinel 會讓它成為從,掛到新的主服務器下