1. 程式人生 > >redis簡介(無圖)

redis簡介(無圖)

第1章 NoSQL

什麼是 NoSQL

NoSQL = Not Only SQL(不僅僅是 SQL) ,也解釋為 non-relational(非關係型資料庫)。在
NoSQL 資料庫中資料之間是無聯絡的,無關係的。資料的結構是鬆散的,可變的。

為什麼使用 NoSQL

關係型資料庫的瓶頸:

1)無法應對每秒上萬次的讀寫請求,無法處理大量集中的高併發操作。關係型資料的是 IO
密集的應用。硬碟 IO 也變為效能瓶頸

2)表中儲存記錄數量有限,橫向可擴充套件能力有限,一張表最大二百多列。縱向資料可承受能力也是有限的,一張表的資料到達百萬級,讀寫的速度就會逐漸的下降。面對海量資料, 必須使用主從複製,分庫分表。這樣的系統架構是難以維護的。
大資料查詢 SQL 效率極低,資料量到達一定程度時,查詢時間會呈指數級別增長

3)無法簡單地通過增加硬體、服務節點來提高系統性能。資料整個儲存在一個數據庫中的。多個伺服器沒有很好的解決辦法,來複制這些資料。

4)關係型資料庫大多是收費的,對硬體的要求較高。軟體和硬體的成本花費比重較大。

NoSQL 的優勢

(1) 大資料量,高效能

NoSQL 資料庫都具有非常高的讀寫效能,尤其在大資料量下,同樣表現優秀。這得益於它的無關係性,資料庫的結構簡單。關係型資料庫(例如 MySQL)使用查詢快取。這種查詢快取在更新資料後,快取就是失效了。在頻繁的資料讀寫互動應用中。 快取的效能不高。NoSQL 的快取效能要高的多。

(2) 靈活的資料模型

NoSQL 無需事先為要儲存的資料建立欄位,隨時可以儲存自定義的資料格式。而在關係資料庫裡,增刪欄位是一件非常麻煩的事情。如果是非常大資料量的表,增加欄位簡直就是一個噩夢。尤其在快速變化的市場環境中,使用者的需求總是在不斷變化的。

(3) 高可用

NoSQL 在不太影響效能的情況,就可以方便的實現高可用的架構。

NoSQL 能很好的解決關係型資料庫擴充套件性差的問題。彌補了關係資料(比如 MySQL) 在某些方面的不足,在某些方面能極大的節省開發成本和維護成本。

MySQL 和 NoSQL 都有各自的特點和使用的應用場景,兩者結合使用。讓關係資料庫關注在關係上,NoSQL 關注在儲存上。

(4) 低成本

這是大多數分散式資料庫共有的特點,因為主要都是開源軟體,沒有昂貴的 License 成

NoSQL 的劣勢

(1) 無關係,資料之間是無聯絡的。

(2) 不支援標準的 SQL,沒有公認的 NoSQL 標準

(3) 沒有關係型資料庫的約束,大多數也沒有索引的概念

(4) 沒有事務,不能依靠事務實現 ACID.

(5) 沒有豐富的資料型別(數值,日期,字元,二進位制,大文字等)

第2章 Redis 安裝和使用

Redis 是當今非常流行的基於 KV 結構的作為 Cache 使用的 NoSQL 資料庫
Redis 介紹

Remote Dictionary Server(Redis) 是一個開源的使用 ANSI C 語言編寫、支援網路、可基於記憶體亦可持久化的 Key-Value 資料庫. Key 字元型別,其值(value)可以是 字串(String), 雜湊(Map), 列表(list), 集合(sets) 和 有序集合(sorted sets)等型別,每種資料型別有自己的專屬命令。所以它通常也被稱為資料結構伺服器。

Redis 的作者是 Salvatore Sanfilippo,來自義大利的西西里島,現在居住在卡塔尼亞。目前供職於 Pivotal 公司(Pivotal 是 Spring 框架的開發團隊),Salvatore Sanfilippo 被稱為 Redis之父。

Redis 之父(Salvatore Sanfilippo)
官網:https://redis.io/
中文:http://www.redis.cn/

Redis的歷史:
2008年,義大利的一家創業公司Merzia推出了一款基於MySQL的網站實時統計系統
LLOOGG,然而沒過多久該公司的創始人Salvatore Sanfilippo便開始對MySQL的效能感到失望,

於是他決定親自為LLOOGG量身定做一個數據庫,並於2009年開發完成,這個資料庫就是
Redis。

不過Salvatore Sanfilippo並不滿足只將Redis用於LLOOGG這一款產品,而是希望讓更多的人使用它,於是在同一年Salvatore Sanfilippo將Redis開源釋出,並開始和Redis的另一名主要的程式碼貢獻者Pieter Noordhuis一起繼續著Redis的開發,直到今天。

Salvatore Sanfilippo自己也沒有想到,短短的幾年時間,Redis就擁有了龐大的使用者群體。
2012年資料庫的使用情況調查,結果顯示有近12%的公司在使用Redis。國內如新浪微博、知 乎,國外如GitHub、Stack Overflow、Flickr、暴雪和Instagram,都是Redis的使用者。

VMware公司從2010年開始贊助Redis的開發,Salvatore Sanfilippo和Pieter Noordhuis也分別於同年的3月和5月加入VMware,全職開發Redis。

Redis的程式碼託管在GitHub上https://github.com/antirez/redis,開發十分活躍,程式碼量只有3萬多行。

Window 上安裝 Redis

Windows 版本的 Redis 是 Microsoft 的開源部門提供的 Redis. 這個版本的 Redis 適合開發人員學習使用,生產環境中使用 Linux 系統上的 Redis

(1) 下載

官網:https://redis.io/

windows 版本:https://github.com/MSOpenTech/redis/releases

(2) 安裝

下載的 Redis-x64-3.2.100.zip 解壓後,放到某個目錄(例如 d:\tools\),即可使用。目錄結構:

(3) 啟動

A、Windows7 系統雙擊 redis-server.exe 啟動 Redis

(4) 關閉
按 ctrl+c 退出 Redis 服務程式。

Linux 上安裝 Redis

(1) 下載

C、 檢視解壓後的檔案

D、編譯 Redis 檔案, Redis 是使用 c 語言編寫的。 會使用 gcc 編譯器。
在解壓後的 Redis 目錄下執行 (cd /usr/local/redis-3.2.9) make 命令。注意事項:
1)make 命令執行過程中可能報錯,根據控制檯輸出的錯誤資訊進行解決
2)錯誤一:gcc 命令找不到,是由於沒有安裝 gcc 導致解決方式:安裝 gcc 編譯器後在執行 make 命令
什麼是 gcc ?
gcc 是 GNU compiler collection 的縮寫,它是 Linux 下一個編譯器集合( 相當於 javac ), 是 c 或 c++程式的編譯器。

怎麼安裝gcc ?
使用yum進行安裝gcc 。執行命令:yum -y install gcc 3)錯誤二: error: jemalloc/jemalloc.h: No such file or directory
解決方式執行 make MALLOC=libc

開始執行 make

出現錯誤:

在執行 make
執行 make 成功的標誌

注意:在make執行之後再執行 make install,該操作則將 src下的許多可執行檔案複製到
/usr/local/bin 目錄下,這樣做可以在任意目錄執行redis的軟體的命令(例如啟動,停止,客戶端連線伺服器等), make install 可以不用執行,看個人習慣。
檢視make編譯結果,cd src目錄

① 前臺啟動 ./redis-server
② 後臺啟動 ./redis-server &
第①種 前臺啟動
啟動 Redis 的伺服器端:切換到 src 目錄下執行 redis-server 程式

redis 應用以前臺的方式啟動,不能退出當前視窗, 退出視窗,應用終止。
在其他視窗檢視 redis 啟動的程序

第②種 後臺啟動
src目錄下執行 ./redis-server & 此時關閉視窗,檢視redis程序,依然存在。

檢視redis程序

(4) 關閉 Redis
關閉方式:

Redis 客戶端

Redis 客戶端是一個程式,通過網路連線到 Redis 伺服器, 在客戶端軟體中使用 Redis 可以識別的命令,向 Redis 伺服器傳送命令, 告訴 Redis 想要做什麼。Redis 把處理結果顯示在客戶端介面上。 通過 Redis 客戶端和 Redis 伺服器互動。
Redis 客戶端傳送命令,同時顯示 Redis 伺服器的處理結果在。

redis 命令列客戶端:

redis-cli (Redis Command Line Interface)是 Redis 自帶的基於命令列的 Redis 客戶端, 用於與服務端互動,我們可以使用該客戶端來執行 redis 的各種命令。
兩種常用的連線方式:

A、直接連線 redis (預設 ip127.0.0.1,埠 6379):./redis-cli
在 redis 安裝目錄\src, 執行 ./redis-cli
此命令是連線本機 127.0.0.1 ,埠 6379 的 redis

B、 指定 IP 和埠連線 redis:./redis-cli -h 127.0.0.1 -p 6379
-h redis 主機 IP(可以指定任意的 redis 伺服器)
-p 埠號(不同的埠表示不同的 redis 應用)
在 redis 安裝目錄\src, 執行 ./redis-cli -h 127.0.0.1 -p 6379
例 1:

redis 遠端客戶端

Redis Desktop Manager:C++ 編寫,響應迅速,效能好。官網地址: https://redisdesktop.com/
github: https://github.com/uglide/RedisDesktopManager
使用文件:http://docs.redisdesktop.com/en/latest/

點選“DOWNLOAD”

A、安裝客戶端軟體

在 Windows 系統使用此工具,連線 Linux 上或 Windows 上的 Redis , 雙擊此 exe 檔案執行安裝

安裝後啟動介面:

B、 使用客戶端連線 Linux 的 Redis

連線Linux的Reids之前需要修改Redis伺服器的配置資訊。 Redis伺服器有安全保護措施, 預設只有本機(安裝Redis的那臺機器)能夠訪問。配置資訊存放在Redis安裝目錄下的redis.conf檔案。修改此檔案的兩個設定。
遠端連線redis需要修改redis主目錄下的redis.conf配置檔案:
①、bind ip 繫結ip此行註釋
②、protected-mode yes 保護模式改為 no
使用 vim 命令修改 redis.conf 檔案, 修改檔案前備份此檔案,執行 cp 命令

修改配置檔案後,需要使用配置檔案重新啟動 Reids,預設不載入配置檔案。先關閉已經啟動的 Redis ,使用以下命令啟動 Redis 在 Redis 安裝目錄執行:
./redis-server …/redis.conf &

D、配置 Redis Desktop Manamager(RDM),連線 Redis

連線成功後:

Go 等 40 多種語言都有連線 redis 的程式設計客戶端

Redis 基本操作命令

redis 預設為 16 個庫 (在 redis.conf 檔案可配置,該檔案很重要,後續很多操作都是這個配置檔案) redis 預設自動使用 0 號庫

(1) 溝通命令,檢視狀態
redis >ping 返回 PONG
解釋:輸入 ping,redis 給我們返回 PONG,表示 redis 服務執行正常

(4) 切換庫命令:select db
使用其他資料庫,命令是 select index

例 1: select 5

(5) 刪除當前庫的資料:flushdb

例 2:使用 * 表示 0 或多個字元

例 3:使用 ? 表示單個字元

例 2:檢查多個 key

 數字:key 的剩餘時間,秒為單位
例 1:設定 redlight 的過期時間是 10, 檢視剩餘時間

例 2:檢視不存在的 key

F、 del
語法:del key [key…]
作用:刪除存在的 key ,不存在的 key 忽略。返回值:數字,刪除的 key 的數量。

例 1:刪除指定的 key

2.7Redis 的 5 種資料型別
A、字串型別 string

字串型別是 Redis 中最基本的資料型別,它能儲存任何形式的字串,包括二進位制資料,序列化後的資料,JSON 化的物件甚至是一張圖片。最大 512M。

B、 雜湊型別 hash
Redis hash 是一個 string 型別的 field 和 value 的對映表,hash 特別適合用於儲存物件。

C、 列表型別 list

Redis 列表是簡單的字串列表,按照插入順序排序。你可以新增一個元素到列表的頭部(左邊)或者尾部(右邊)

D、集合型別 set

Redis 的 Set 是 string 型別的無序集合,集合成員是唯一的,即集合中不能出現重複的數
據.

E、 有序集合型別 zset (sorted set)

Redis 有序集合 zset 和集合 set 一樣也是 string 型別元素的集合,且不允許重複的成員。不同的是 zset 的每個元素都會關聯一個分數(分數可以重複),redis 通過分數來為集合中的成員進行從小到大的排序。

第3章 Redis 資料型別操作命令

3.1 字串型別(string)

字串型別是 Redis 中最基本的資料型別,它能儲存任何形式的字串,包括二進位制資料,序列化後的資料,JSON 化的物件甚至是一張圖片。

向已經存在的 key 設定新的 value,會覆蓋原來的值

B、 get

獲取 key 中設定的字串值語法: get key
例如:獲取 username 這個 key 對應的 value

D、 decr

將 key 中儲存的數字值減1,如果 key 不存在,則麼 key 的值先被初始化為 0 再執行 decr 操作(只能對數字型別的資料操作)

語法:decr key
例1:不存在的key,初值為0,再減 1 。

例2:對存在的數字值的 key ,減 1 。先執行 incr index ,增加到 3

例 2:追加到不存在的 key,同 set key value

3.1.2 常用命令

A 、 strlen

語法:strlen key
說明:返回 key 所儲存的字串值的長度返回值:
①:如果key存在,返回字串值的長度

使用的字串 key: school, value: bjpowernode
例 1: 擷取從 2 到 5 的字元

例 2:從字串尾部擷取,start ,end 是負數,最後一位是 -1

例 3:超出字串範圍的擷取 ,獲取合理的子串

例 2:設定不存在的 key

D、mset
語法:mset key value [key value…]
說明:同時設定一個或多個 key-value 對返回值: OK

例 1:一次設定多個 key, value

3.2 雜湊型別 hash
redis hash 是一個 string 型別的 field 和 value 的對映表,hash 特別適合用於儲存物件。

3.2.1 基本命令

A、hset

例 1:獲取存在 key 值的某個域的值

例 2:獲取不存在的 field

C、 hmset
語法:hmset key field value [field value…]
說明:同時將多個 field-value (域-值)設定到雜湊表 key 中,此命令會覆蓋已經存在的 field, hash 表 key 不存在,建立空的 hash 表,執行 hmset.
返回值:設定成功返回 ok, 如果失敗返回一個錯誤

D、hmget
語法:hmget key field [field…]
作用:獲取雜湊表 key 中一個或多個給定域的值
返回值:返回和 field 順序對應的值,如果 field 不存在,返回 nil
例 1:獲取多個 field 的值

E、 hgetall

B、 hvals
語法:hvals key
作用:返回雜湊表 中所有域的值
返回值:包含雜湊表所有域值的列表,key 不存在返回空列表
例 1:顯示 website 雜湊表所有域的值

C、 hexists
語法:hexists key field
作用:檢視雜湊表 key 中,給定域 field 是否存在返回值:如果 field 存在,返回 1, 其他返回 0

例 1:檢視存在 key 中 field 域是否存在

列表 list

Redis 列表是簡單的字串列表,按照插入順序排序。你可以新增一個元素導列表的頭部(左邊)或者尾部(右邊)

基本命令

A、lpush
語法:lpush key value [value…]
作用:將一個或多個值 value 插入到列表 key 的表頭(最左邊),從左邊開始加入值,從左到右的順序依次插入到表頭
返回值:數字,新列表的長度

例 1:將 a,b,c 插入到 mylist 列表型別
在 redis-desktop-manager 顯 示

插入圖示:

B、 rpush
語法:rpush key value [value…]
作用:將一個或多個值 value 插入到列表 key 的表尾(最右邊),各個 value 值按從左到右的順序依次插入到表尾
返回值:數字,新列表的長度

例 1:插入多個值到列表

在 redis-desktop-manager 顯示:
例 2:顯示列表中第 2 個元素,下標從 0 開始

D、lindex
語法:lindex key index
作用:獲取列表 key 中下標為指定 index 的元素,列表元素不刪除,只是查詢。0 表示列表的第一個元素,以 1 表示列表的第二個元素;start , stop 是列表的下標值,也可以負數的下標, -1 表示列表的最後一個元素, -2 表示列表的倒數第二個元素,以此類推。
返回值:指定下標的元素;index 不在列表範圍,返回 nil
例 1:返回下標是 1 的元素

例 2:不存在的下標

E、 llen
語法:llen key
作用:獲取列表 key 的長度
返回值:數值,列表的長度; key 不存在返回 0
例 1:顯示存在 key 的列表元素的個數

常用命令

A、lrem
語法:lrem key count value
作用:根據引數 count 的值,移除列表中與引數 value 相等的元素, count >0 ,從列表的左側向右開始移除; count < 0 從列表的尾部開始移除;count = 0 移除表中所有與 value 相等的值。
返回值:數值,移除的元素個數

B、 lset
語法:lset key index value
作用:將列表 key 下標為 index 的元素的值設定為 value。

返回值:設定成功返回 ok ; key 不存在或者 index 超出範圍返回錯誤資訊
例 1:設定下標 2 的 value 為“c”。

返回值:加入到集合的新元素的個數。不包括被忽略的元素。
例 1:新增單個元素

例 2:新增多個元素

C、 sismember
語法:sismember key member

作用:判斷 member 元素是否是集合 key 的成員返回值:member 是集合成員返回 1,其他返回 0 。

例 1:檢查元素是否存在集合中

作用:刪除集合 key 中的一個或多個 member 元素,不存在的元素被忽略。返回值:數字,成功刪除的元素個數,不包括被忽略的元素。

例 1:刪除存在的一個元素,返回數字 1

例 2:刪除不存在的元素

作用:隨機從集合中刪除一個元素, count 是刪除的元素個數。返回值:被刪除的元素,key 不存在或空集合返回 nil

例如 1:隨機從集合刪除一個元素

例 2:隨機刪除指定個數的元素

語法:zadd key score member [score member…]
作用:將一個或多個 member 元素及其 score 值加入到有序集合 key 中,如果 member
存在集合中,則更新值;score 可以是整數或浮點數返回值:數字,新新增的元素個數

例 1:建立儲存學生成績的集合

例 2:使用浮點數作為 score

B、 zrange

例 4:排序顯示浮點數的 score

例 1:刪除指定一個成員 wangwu

語法:zrangebyscore key min max [WITHSCORES ] [LIMIT offset count]
作用:獲取有序集 key 中,所有 score 值介於 min 和 max 之間(包括 min 和 max)的成員,有序成員是按遞增(從小到大)排序。
min ,max 是包括在內 , 使用符號 ( 表示不包括。 min , max 可以使用 -inf ,
+inf 表示最小和最大
limit 用來限制返回結果的數量和區間。
withscores 顯 示 score 和 value
返回值:指定區間的集合資料

使用的準備資料

例 4:使用 limit
增加新的資料:

C、 zcount
語法:zcount key min max
作用:返回有序集 key 中, score 值在 min 和 max 之間(預設包括 score 值等於 min 或 max )
的成員的數量
例 1:求工資在 3000-5000 的員工數量

第4章 高階話題

Redis 事務

什麼是事務

事務是指一系列操作步驟,這一系列的操作步驟,要麼完全地執行,要麼完全地不執行。
Redis 中的事務(transaction)是一組命令的集合,至少是兩個或兩個以上的命令,redis 事務保證這些命令被執行時中間不會被任何其他操作打斷。

事務操作的命令

(1) multi
語法: multi
作用:標記一個事務的開始。事務內的多條命令會按照先後順序被放進一個隊列當中。返回值:總是返回 ok

(2) exec
語法:exec
作用:執行所有事務塊內的命令
返回值:事務內的所有執行語句內容,事務被打斷(影響)返回 nil

(3) discard
語法:discard
作用:取消事務,放棄執行事務塊內的所有命令返回值:總是返回 ok

(4) watch
語法:watch key [key …]
作用:監視一個(或多個) key ,如果在事務執行之前這個(或這些) key 被其他命令所改動, 那麼事務將被打斷。
返回值:總是返回 ok

(5) unwatch
語法:unwatch
作用:取消 WATCH 命令對所有 key 的監視。如果在執行 WATCH 命令之後, EXEC 命令或 DISCARD 命令先被執行了的話,那麼就不需要再執行 UNWATCH 了
返回值:總是返回 ok

檢視 works 集合

(2) 事務執行 exec 之前,入隊命令錯誤(語法錯誤;嚴重錯誤導致伺服器不能正常工作(例如記憶體不足)),放棄事務。
執行事務步驟:
1)MULTI 正常命令2)SET key value 正常命令3)INCR 命令語法錯誤
4)EXEC 無法執行事務,那麼第一條正確的命令也不會執行,所以 key 的值不會設定成功

結論:事務執行 exec 之前,入隊命令錯誤,事務終止,取消,不執行。

(3) 事務執行 exec 命令後,執行佇列命令,命令執行錯誤,事務提交
執行步驟:
1) MULTI 正常命令
2) SET username zhangsan 正常命令
3) lpop username 正常命令,語法沒有錯誤,執行命令時才會有錯誤。
4) EXEC 正常執行 ,發現錯誤可以在事務提交前放棄事務,執行 discard.

(5) Redis 的 watch 機制

A、Redis 的 WATCH 機制
WATCH 機制原理:
WATCH 機制:使用 WATCH 監視一個或多個 key , 跟蹤 key 的 value 修改情況, 如果有
key 的 value 值在事務 EXEC 執行之前被修改了, 整個事務被取消。EXEC 返回提示資訊,表示事務已經失敗。

WATCH 機制使的事務 EXEC 變的有條件,事務只有在被 WATCH 的 key 沒有修改的前提下才能執行。不滿足條件,事務被取消。使用 WATCH 監視了一個帶過期時間的鍵, 那麼即使這個鍵過期了, 事務仍然可以正常執行

大多數情況下, 不同的客戶端會訪問不同的鍵, 相互同時競爭同一 key 的情況一般都很少, 樂觀鎖能夠以很好的效能解決資料衝突的問題。

B、 何時取消 key 的監視(WATCH)?

① WATCH 命令可以被呼叫多次。 對鍵的監視從 WATCH 執行之後開始生效, 直到呼叫 EXEC 為止。不管事務是否成功執行, 對所有鍵的監視都會被取消。
② 當客戶端斷開連線時, 該客戶端對鍵的監視也會被取消。
③ UNWATCH 命令可以手動取消對所有鍵的監視

C、 WATCH 的事例
執行步驟:
首先啟動 redis-server , 在開啟兩個客戶端連線。 分別叫 A 客戶端 和 B 客戶端。

啟動 Redis 伺服器

A 客戶端(紅色):WATCH 某個 key ,同時執行事務

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 的值已經被修改了, 所有放棄事務。

例 1:樂觀鎖

持久化
持久化概述

持久化可以理解為儲存,就是將資料儲存到一個不會丟失的地方,如果把資料放在記憶體中,電腦關閉或重啟資料就會丟失,所以放在記憶體中的資料不是持久化的,而放在磁碟就算是一種持久化。

Redis 的資料儲存在記憶體中,記憶體是瞬時的,如果 linux 宕機或重啟,又或者 Redis 崩潰或重啟,所有的記憶體資料都會丟失,為解決這個問題,Redis 提供兩種機制對資料進行持久化儲存,便於發生故障後能迅速恢復資料。

持久化方式

(1) RDB 方式

A、什麼是 RDB 方式?

Redis Database(RDB),就是在指定的時間間隔內將記憶體中的資料集快照寫入磁碟,資料恢復時將快照檔案直接再讀到記憶體。
RDB 儲存了在某個時間點的資料集(全部資料)。儲存在一個二進位制檔案中,只有一個檔案。預設是 dump.rdb。RDB 技術非常適合做備份,可以儲存最近一個小時,一天,一個月的全部資料。儲存資料是在單獨的程序中寫檔案,不影響 Redis 的正常使用。RDB 恢復資料時比其他 AOF 速度快。

B、 如何實現?
RDB 方式的資料持久化,僅需在 redis.conf 檔案中配置即可,預設配置是啟用的。
在配置檔案 redis.conf 中搜索 SNAPSHOTTING, 查詢在註釋開始和結束之間的關於 RDB
的配置說明。配 SNAPSHOTTING 置地方有三處。
①:配置執行 RDB 生成快照檔案的時間策略。
對 Redis 進行設定, 讓它在“ N 秒內資料集至少有 M 個 key 改動”這一條件被滿足時, 自動儲存一次資料集。

配置格式:save 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

⑤:檢視生成的 rdb 檔案

C、 總結

優點:由於儲存的是資料快照檔案,恢復資料很方便,也比較快缺點:
1)會丟失最後一次快照以後更改的資料。如果你的應用能容忍一定資料的丟失,那麼使用 rdb 是不錯的選擇;如果你不能容忍一定資料的丟失,使用 rdb 就不是一個很好的選擇。
2)由於需要經常操作磁碟,RDB 會分出一個子程序。如果你的 redis 資料庫很大的話, 子程序佔用比較多的時間,並且可能會影響 Redis 暫停服務一段時間(millisecond 級別),如果你的資料庫超級大並且你的伺服器 CPU 比較弱,有可能是會達到一秒。

(2) AOF 方式

A、什麼是 AOF 方式

Append-only File(AOF),Redis 每次接收到一條改變資料的命令時,它將把該命令寫到一個 AOF 檔案中(只記錄寫操作,讀操作不記錄),當 Redis 重啟時,它通過執行 AOF 檔案中所有的命令來恢復資料。

B、 如何實現

AOF 方式的資料持久化,僅需在 redis.conf 檔案中配置即可配置項:
①:appendonly:預設是 no,改成 yes 即開啟了 aof 持久化
②:appendfilename:指定 AOF 檔名,預設檔名為 appendonly.aof
③:dir : 指定 RDB 和 AOF 檔案存放的目錄,預設是 ./
④:appendfsync:配置向 aof 檔案寫命令資料的策略:
no:不主動進行同步操作,而是完全交由作業系統來做(即每 30 秒一次),比較快但不是很安全。
always:每次執行寫入都會執行同步,慢一些但是比較安全。
everysec:每秒執行一次同步操作,比較平衡,介於速度和安全之間。這是預設項。
⑤:auto-aof-rewrite-min-size:允許重寫的最小 AOF 檔案大小,預設是 64M 。當 aof 檔案大於 64M 時,開始整理 aop 檔案, 去掉無用的操作命令。縮小 aop 檔案。

例 1:
①:停止執行的 redis , 備份要修改的 redis.conf
②:檢視 redis 安裝目錄/src 下有無 .aof 檔案。 預設是在 redis 的當前目錄

③:編輯 redis.conf
設定 appendonly 為 yes 即可。

檢視 appendfsync 的當前策略。檢視 appendfilname 的檔名稱

(3) 總結
1) append-only 檔案是另一個可以提供完全資料保障的方案;
2) AOF 檔案會在操作過程中變得越來越大。比如,如果你做一百次加法計算,最後你只會在資料庫裡面得到最終的數值,但是在你的 AOF 裡面會存在 100 次記錄,其中 99 條記錄對最終的結果是無用的;但 Redis 支援在不影響服務的前提下在後臺重構 AOF 檔案,讓檔案得以整理變小
3)可以同時使用這兩種方式,redis 預設優先載入 aof 檔案(aof 資料最完整);

Redis 提供了複製(replication)功能來自動實現多臺 redis 伺服器的資料同步(每天
19 點 新聞聯播,基本從 cctv1-8,各大衛視都會播放)
我們可以通過部署多臺 redis,並在配置檔案中指定這幾臺 redis 之間的主從關係,主負責寫入資料, 同時把寫入的資料實時同步到從機器, 這種模式叫做主從複製, 即master/slave,並且 redis 預設 master 用於寫,slave 用於讀,向 slave 寫資料會導致錯誤

(1) Redis 主從複製實現(master/salve)

方式 1:修改配置檔案,啟動時,伺服器讀取配置檔案,並自動成為指定伺服器的從伺服器,從而構成主從複製的關係
方式 2: ./redis-server --slaveof ,在啟動 redis 時指定當前服務成為某個主 Redis 服務的從 Slave

方式 1 的實現步驟:
模擬多 Reids 伺服器, 在一臺已經安裝 Redis 的機器上,執行多個 Redis 應用模擬多

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 檔名

C、 編輯 Slave 配置檔案
編輯 Slave 的配置檔案 redis6382.conf 和 redis6384.conf: 在空檔案加入如下內容
①:redis6382.conf:
include /usr/local/redis-3.2.9/redis.conf

E、 檢視配置後的服務資訊
命令:
①: Redis 客戶端使用指定埠連線 Redis 伺服器
./redis-cli -p 埠
②:檢視伺服器資訊
info replication

6384 也登入內容同 6382.

F、 向 Master 寫入資料
在 6380 執行 flushall 清除資料,避免干擾的測試資料。 生產環境避免使用。

當 Master 服務出現故障,需手動將 slave 中的一個提升為 master, 剩下的 slave 掛至新的
master 上(冷處理:機器掛掉了,再處理)
命令:
①:slaveof no one,將一臺 slave 伺服器提升為 Master (提升某 slave 為 master)
②:slaveof 127.0.0.1 6381 (將 slave 掛至新的 master 上)
執行步驟:

A、將 Master:6380 停止(模擬掛掉)

現在的主從(Master/Slave)關係:Master 是 6382 , Slave 是 6384
檢視 6382:

D、原來的伺服器重新新增到主從結構中

E、 檢視新的 Master 資訊
在 6382 執行:

Sentinel 哨兵是 redis 官方提供的高可用方案,可以用它來監控多個 Redis 服務例項的執行情況。Redis Sentinel 是一個執行在特殊模式下的 Redis 伺服器。Redis Sentinel 是在多個
Sentinel 程序環境下互相協作工作的。
Sentinel 系統有三個主要任務:
 監控:Sentinel 不斷的檢查主服務和從伺服器是否按照預期正常工作。
 提醒:被監控的 Redis 出現問題時,Sentinel 會通知管理員或其他應用程式。
 自動故障轉移:監控的主 Redis 不能正常工作,Sentinel 會開始進行故障遷移操作。將

一個從伺服器升級新的主伺服器。 讓其他從伺服器掛到新的主伺服器。同時向客戶端提供新的主伺服器地址。

Sentinel 系統預設 port 是26379 。三個配置port 分別設定為 26380 , 26382 , 26384 。三個檔案分別命名:
 sentinel26380.conf
 sentinel26382.conf

 sentinel26384.conf
執行復制命令 cp sentinel.conf xxx.conf

(2) 三份 sentinel 配置檔案修改:

sentinel26382.conf 修改port 26382 , master的port 6382
sentinel26384.conf 修改port 26384 , master的port 6382

(3) 啟動主從(Master/Slave)Redis
啟動 Reids

./redis-sentinel sentinel 配置檔案

執行以下三條命令,將建立三個監視主伺服器的Sentinel例項:
./redis-sentinel …/sentinel26380.conf
./redis-sentinel …/sentinel26382.conf
./redis-sentinel …/sentinel26384.conf
在 XShell 開啟三個視窗分別執行:

(5) 主 Redis 不能工作
讓 Master 的 Redis 停止服務, 執行 shutdown
先執行 info replication 確認 Master 的 Redis ,再執行 shutdown

檢視原 Slave 的變化

(7) 新的 Redis 加入 Sentinel 系統,自動加入 Master

(8) 監控
1)Sentinel 會不斷檢查 Master 和 Slave 是否正常
2)如果 Sentinel 掛了,就無法監控,所以需要多個哨兵,組成 Sentinel 網路,一個健康的
Sentinel 至少有 3 個 Sentinel 應用。 彼此在獨立的物理機器或虛擬機器。
3)監控同一個 Master 的 Sentinel 會自動連線,組成一個分散式的 Sentinel 網路,互相通訊並交換彼此關於被監控伺服器的資訊
4)當一個 Sentinel 認為被監控的伺服器已經下線時,它會向網路中的其它 Sentinel 進行確認,判斷該伺服器是否真的已經下線
5)如果下線的伺服器為主伺服器,那麼 Sentinel 網路將對下線主伺服器進行自動故障轉移, 通過將下線主伺服器的某個從伺服器提升為新的主伺服器,並讓其從伺服器轉移到新的主伺服器下,以此來讓系統重新回到正常狀態
6)下線的舊主伺服器重新上線,Sentinel 會讓它成為從,掛到新的主伺服器下

(9) 總結

主從複製,解決了讀請求的分擔,從節點下線,會使得讀請求能力有所下降,Master 下線,寫請求無法執行

Sentinel 會在 Master 下線後自動執行故障轉移操作,提升一臺 Slave 為 Master,並讓其它Slave 成為新 Master 的 Slave

4.4 安全設定

(1) 設定密碼

訪問 Redis 預設是沒有密碼的,這樣不安全,任意使用者都可以訪問。可以啟用使用密碼才能訪問 Redis。 設定 Redis 的訪問密碼,修改 redis.conf 中這行 requirepass 密碼。密碼要比較複雜,不容易破解,而且需要定期修改。因為 redis 速度相當快,所以在一臺比較好的伺服器下,一個外部的使用者可以在一秒鐘進行 150K 次的密碼嘗試,需要指定非常非常強大的密碼來防止暴力破解。

A、開啟訪問密碼設定

修改 redis.conf , 使用 vim 命令。 找到 requirepass 行去掉註釋,requirepass 空格後就是密碼。
例 1:設定訪問密碼是 123456 ,這是練習使用,生產環境要設定複雜密碼修改 redis.conf,檔案 480 行左右。原始內容:

修改後:
檢視修改結果:

使用 ① 訪問

輸入命令 auth 密碼

使用 -p 引數指定埠,例如:./redis-cli -p 新設定埠

第5章 Jedis 操作 Redis

使用 Redis 官方推薦的 Jedis,在 java 應用中操作 Redis。Jedis 幾乎涵蓋了 Redis 的所有命令。操作 Redis 的命令在 Jedis 中以方法的形式出現。jedis 完全相容 redis 2.8.x and 3.x.x
 Jedis 原始碼:https://github.com/xetorthio/jedis
 api 文件:http://xetorthio.github.io/jedis/
 下載:http://search.maven.org/ ,搜尋 jedis

5.1.2 下載 Commons-Pool

Jedis 物件並不是執行緒安全的,在多執行緒下使用同一個 Jedis 物件會出現併發問題。為了避免每次使用 Jedis 物件時都需要重新構建,Jedis 提供了 JedisPool。JedisPool 是基於Commons Pool 2 實現的一個執行緒安全的連線池

瀏覽器開啟:http://search.maven.org/ ,搜尋 commons-pool2。在 Download 處,點選 jar

Java 應用使用 Jedis 準備

專案中加入 jar:
 jedis-2.9.0.jar
 commons-pool2-2.4.2.jar

加入專案後如圖:

字串(string)

雜湊(hash)

A、使用 Jedis 連線例項池。

B、 使用連線池操作 hash 資料型別

列表 list

集合 Set















有序集合 Sorted Set

事務(Transaction)