處理器 攔截器的註冊
redis
1.Redis簡介:
Remote Dictionary Server(遠端字典伺服器),是一個用C語言編寫的、開源的、基於記憶體執行並支援持久化的、高效能的NoSQL資料庫.也是當前熱門的NoSQL資料庫之一。
2.Redis的特點
1、支援資料持久化
Redis支援資料的持久化,可以將記憶體中的資料保持在磁碟中,重啟的時候可以再次載入進行使用。
2、支援多種資料結構
Redis不僅僅支援簡單的key-value型別的資料,同時還提供list,set,zset,hash等資料結構的儲存。
3、支援資料備份
Redis支援資料的備份,即master-slave模式的資料備份。
3.Linux上安裝Redis
第一步:下載redis
第二步:使用Xftp工具上傳redis-5.0.2.tar.gz到linux 系統。
第三步:解壓redis-5.0.2.tar.gz到/opt目錄
第四步:編譯redis,進入解壓目錄,並且執行make命令:
如果報錯:gcc命令未找到 那麼提前安裝gcc 執行gcc –v檢視Linux核心版本
第六步:再次回到redis解壓目錄執行make命令進行編譯 make (如果報錯了gcc命令未找到 需要執行第七步)
第七步(可選):進行清理工作 make distclean
第八步:再次執行make指令進行編譯:
第九步:執行make install安裝redis:
注意:
在make執行之後再執行 make install,該操作則將 src下的許多可執行檔案複製到/usr/local/bin 目錄下,這樣做可以在任意目錄執行redis的軟體的命令(例如啟動,停止,客戶端連線伺服器等), make install 可以不用執行,
檢視make編譯結果,cd src目錄
第十步:啟動Redis
啟動方式:
① 前臺啟動 redis-server
②後臺啟動 redis-server &
③根據配置檔案啟動 啟動命令 配置檔案 &
注意:如果修改了redis的配置檔案redis.conf,必須在啟動時指定配置檔案,否則修改無效!
第十一步:關閉Redis服務
關閉方式:
①使用redis客戶端關閉,向伺服器發出關閉命令
任意目錄下執行 指令redis-cli shutdown
推薦使用這種方式, redis先完成資料操作,然後再關閉。
例如:
②kill pid 或者 kill -9 pid
這種不會考慮當前應用是否有資料正在執行操作,直接就關閉應用。
先使用 ps -ef | grep redis 查出程序號,在使用 kill pid
4.Redis客戶端
Redis客戶端是一個程式,通過網路連線到Redis伺服器,從而實現跟 Redis伺服器的互動。
Redis客戶端傳送命令,同時顯示Redis伺服器的處理結果。
redis-cli(Redis Command Line Interface)是Redis自帶的基於命令列的Redis客戶端,用於與服務端互動,我們可以使用該客戶端來執行redis的各種命令。
- 啟動Redis客戶端:
1)直接連線redis (預設ip127.0.0.1,埠6379):redis-cli
在任意目錄執行 redis-cli
此命令是連線本機127.0.0.1 ,埠6379的redis
2)指定IP和埠連線redis:redis-cli –h 127.0.0.1 -p 6379
-h redis主機IP(可以指定任意的redis伺服器)
-p埠號(不同的埠表示不同的redis應用)
在任意目錄下執行 redis-cli -h 127.0.0.1 -p 6379
- 退出Redis客戶端:exit或者quit指令。
5.Redus基本知識
1)測試Redis效能 redis-benchmark
2) Redis溝通命令,檢視狀態
redis >ping 返回PONG
解釋:輸入ping,redis給我們返回PONG,表示redis服務執行正常
3) 檢視redis伺服器的統計資訊:info
語法:info [section]
作用:以一種易於解釋且易於閱讀的格式,返回關於 Redis 伺服器的各種資訊和統計數值。section 用來返回指定部分的統計資訊。 section的值:server , clients ,memory等等。不加section 返回全部統計資訊
返回值:指定section的統計資訊或全部資訊
例1:統計server的資訊 info server
例2:統計全部資訊 info
4) redis預設使用16個庫
Redis預設使用16個庫,從0到15。 對資料庫個數的修改,在redis.conf檔案中databases 16,理論上可以配置無限多個。
Redis的庫和關係型資料庫中的資料庫例項類似,但又有一些不同,比如redis中各個庫不能自定義命名,只能用序號表示,redis中各個庫不是完全獨立的,使用時最好一個應用使用一個redis例項,不建議一個redis例項中儲存多個應用的資料。Redis例項本身所佔儲存空間其實是非常小的,因此不會造成儲存空間的浪費。
5) 切換庫命令:select db
預設使用第0個,如果要使用其他資料庫,命令是 select index
6) 檢視當前資料庫中key的數目:dbsize
語法:dbsize
作用:返回當前資料庫的 key 的數量。
返回值:數字,key的數量
7) 檢視當前資料庫中有哪些key:keys *
8) 清空當前庫:flushdb
9) 清空所有資料庫:flushall
這也體現出redis中的庫並不是完全無關的。
10) config get * 獲得redis的所有配置值
語法:config get parameter
作用:獲取執行中Redis伺服器的配置引數, 獲取全部配置可以使用*。引數資訊來自redis.conf 檔案的內容。
例1:獲取資料庫個數 config get databases
例2:獲取埠號config get port
手冊地址:
redis英文版命令大全:https://redis.io/commands
redis中文版命令大全:http://redisdoc.com/
6.Redis的5種資料結構
6.1字串型別 string
字串型別是Redis中最基本的資料結構,它能儲存任何型別的資料,包括二進位制數
據,序列化後的資料,JSON化的物件甚至是一張圖片。最大512M。
6.2列表型別 list
Redis列表是簡單的字串列表,按照插入順序排序,元素可以重複。你可以新增一個元素到列表的頭部(左邊)或者尾部(右邊),底層是個連結串列結構。
6.3集合型別 set
Redis的Set是string型別的無序無重複集合。
6.4雜湊型別 hash
Redis hash 是一個string型別的field和value的對映表,hash特別適合用於儲存物件。
6.5有序集合型別 zset (sorted set)
Redis 有序集合zset和集合set一樣也是string型別元素的集合,且不允許重複的成員。
不同的是zset的每個元素都會關聯一個分數(分數可以重複),redis通過分數來為集合中的成員進行從小到大的排序。
7.Redis的常用操作命令
7.1 Redis的Key的操作命令
7.1.1 keys
語法:keys pattern
作用:查詢所有符合模式pattern的key. pattern可以使用萬用字元。
萬用字元:
l *:表示0或多個字元,例如:keys * 查詢所有的key。
l ?:表示單個字元,例如:wo?d , 匹配 word , wood
l [] :表示選擇[]內的一個字元,例如wo[or]d, 匹配word, wood, 不匹配wold、woord
7.1.2 exists
語法:exists key [key…]
作用:判斷key是否存在
返回值:整數,存在key返回1,其他返回0。使用多個key,返回存在的key的數量。
7.1.3 move
語法:move key db
作用:移動key到指定的資料庫,移動的key在原庫被刪除。
返回值:移動成功返回1,失敗返回0.
7.1.4 ttl
語法:ttl key
作用:檢視key的剩餘生存時間(ttl: time to live),以秒為單位。
返回值:
-1 :沒有設定key的生存時間, key永不過期。
-2:key不存在
7.1.5 expire
語法:expire key seconds
作用:設定key的生存時間,超過時間,key自動刪除。單位是秒。
返回值:設定成功返回數字 1,其他情況是 0 。
7.1.6 type
語法:type key
作用:檢視key所儲存值的資料型別
返回值:字串表示的資料型別
none (key不存在) string (字串)
list (列表) set (集合)
zset (有序集) hash (雜湊表)
7.1.7 rename
語法:rename key newkey
作用:將key改為名newkey。當 key 和 newkey 相同,或者 key 不存在時,返回一個錯誤。
當 newkey 已經存在時, RENAME 命令將覆蓋舊值。
7.1.8 del
語法:del key [key…]
作用:刪除存在的key,不存在的key忽略。
返回值:數字,刪除的key的數量。
7.2 字串型別(string)
字串型別是Redis中最基本的資料型別,它能儲存任何形式的字串,包括二進位制數
據,序列化後的資料,JSON化的物件甚至是一張圖片。
字串型別的資料操作總的思想是通過key操作value,key是資料標識,value是我們感
興趣的業務資料。
7.2.1 set
語法:set key value
功能:將字串值 value 設定到 key 中,如果key已存在,後放的值會把前放的值覆蓋掉。
返回值:OK表示成功
7.2.2 get
語法:get key
功能:獲取 key 中設定的字串值
返回值:key存在,返回key對應的value;
key不存在,返回nil
7.2.3 append
語法:append key value
功能:如果 key 存在,則將 value 追加到 key 原來舊值的末尾
如果 key 不存在,則將key 設定值為 value
返回值:追加字串之後的總長度(字元個數)
7.2.4 strlen
語法:strlen key
功能:返回 key 所儲存的字串值的長度
返回值:如果key存在,返回字串值的長度;
key不存在,返回0
7.2.5 incr
語法:incr key
功能:將 key 中儲存的數字值加1,如果 key 不存在,則 key 的值先被初始化為 0 再執行incr操作。
返回值:返回加1後的key值
7.2.6 decr
語法:decr key
功能:將 key 中儲存的數字值減1,如果 key 不存在,則麼 key 的值先被初始化為 0 再執行 decr 操作。
返回值:返回減1後的key值
7.2.7 incrby
語法:incrby key offset
功能:將 key 所儲存的值加上增量值,如果 key 不存在,則 key 的值先被初始化為 0 再執行 INCRBY 命令。
返回值:返回增量之後的key值。
7.2.8 decrby
語法:decrby key offset
功能:將 key 所儲存的值減去減量值,如果 key 不存在,則 key 的值先被初始化為 0 再執行 DECRBY 命令。
返回值:返回減量之後的key值。
7.2.9 getrange
語法:getrange key startIndex endIndex
功能:獲取 key 中字串值從 startIndex 開始到 endIndex 結束的子字串,包括startIndex和endIndex, 負數表示從字串的末尾開始,-1 表示最後一個字元。
7.2.10 setrange
語法:setrange key offsetIndex value
功能:用value覆蓋key的儲存的值從offset開始。
返回值:修改後的字串的長度。
7.2.11 setex
語法:setex key seconds value
功能:設定key的值,並將 key 的生存時間設為 seconds (以秒為單位) ,如果key已經存在,將覆蓋舊值。
返回值:設定成功,返回OK。
7.2.12 setnx
語法:setnx key value
功能:setnx 是 set if not exists 的簡寫,如果key不存在,則 set 值,存在則不設定值。
返回值:設定成功,返回1
設定失敗,返回0
7.2.13 mset
語法:mset key value [key value…]
功能:同時設定一個或多個 key-value 對
返回值:設定成功,返回OK。
7.2.14 mget
語法:mget key [key …]
功能:獲取所有(一個或多個)給定 key 的值
返回值:包含所有key的列表,如果key不存在,則返回nil。
7.2.15 msetnx
語法:msetnx key value[key value…]
功能:同時設定一個或多個 key-value 對,如果有一個key是存在的,則設定不成功。
返回值:設定成功,返回1
設定失敗,返回0
7.3 列表(List)
Redis列表是簡單的字串列表,按照插入順序排序,左邊(頭部)、右邊(尾部)或者中間都可以新增元素。連結串列的操作無論是頭或者尾效率都極高,但是如果對中間元素進行操作,那效率會大大降低了。
列表型別的資料操作總的思想是通過key和下標操作value,key是資料標識,下標是資料在列表中的位置,value是我們感興趣的業務資料。
7.3.1 lpush
語法:lpush key value [value…]
功能:將一個或多個值 value 插入到列表 key 的最左邊(表頭),各個value值依次插入到表頭位置。
返回值:插入之後的列表的長度。
7.3.2 rpush
語法:rpush key value [value…]
功能:將一個或多個值 value 插入到列表 key 的最右邊(表尾),各個 value 值按依次插入到表尾。
返回值:插入之後的列表的長度。
7.3.3 lrange
語法:lrange key startIndex endIndex
功能:獲取列表 key 中指定下標區間內的元素,下標從0開始,到列表長度-1;下標也可以是負數,表示列表從後往前取,-1表示倒數第一個元素,-2表示倒數第二個元素,以此類推;startIndex和endIndex超出範圍不會報錯。
返回值:獲取到的元素列表。
7.3.4 lpop
語法:lpop key
功能:移除並返回列表key頭部第一個元素,即列表左側的第一個元素。
返回值:列表左側第一個元素的值;列表key不存在,返回nil。
7.3.5 rpop
語法:rpop key
功能:移除並返回列表key尾部第一個元素,即列表右側的第一個元素。
返回值:列表右側第一個元素的值;列表key不存在,返回nil。
7.3.6 lindex
語法:lindex key index
功能:獲取列表 key 中下標為指定 index 的元素,列表元素不刪除,只是查詢。0 表示列表的第一個元素,1 表示列表的第二個元素;index也可以負數的下標, -1 表示列表的最後一個元素, -2 表示列表的倒數第二個元素,以此類推。
返回值:key存在時,返回指定元素的值;
Key不存在時,返回nil。
7.3.7 llen
語法:llen key
功能:獲取列表 key 的長度
返回值:數值,列表的長度;key不存在返回0
7.3.8 lrem
語法:lrem key count value
功能:根據引數 count 的值,移除列表中與引數 value 相等的元素,
count >0 ,從列表的左側向右開始移除;
count < 0 從列表的尾部開始移除;
count = 0移除表中所有與 value 相等的值。
返回值:數值,移除的元素個數
7.3.9 ltrim
語法:ltrim key startIndex endIndex
功能:擷取key的指定下標區間的元素,並且賦值給key。下標從0開始,一直到列表長度-1;下標也可以是負數,表示列表從後往前取,-1表示倒數第一個元素,-2表示倒數第二個元素,以此類推;startIndex和endIndex超出範圍不會報錯。
返回值:執行成功返回ok
7.3.10 lset
語法:lset key index value
功能:將列表 key 下標為 index 的元素的值設定為 value。
功能:設定成功返回ok ; key不存在或者index超出範圍返回錯誤資訊。
7.3.11 linsert
語法:linsert key before/after pivot value
功能:將值 value 插入到列表 key 當中位於值 pivot 之前或之後的位置。key不存在或者pivot不在列表中,不執行任何操作。
返回值:命令執行成功,返回新列表的長度。沒有找到pivot返回 -1, key不存在返回0。
7.4 集合型別(set)
Redis的Set是string型別的無序不重複集合。
集合型別的資料操作總的思想是通過key確定集合,key是集合標識,元素沒有下標,只有直接操作業務資料和資料的個數。
7.4.1 sadd
語法:sadd key member [member…]
功能:將一個或多個 member 元素加入到集合 key 當中,已經存在於集合的 member 元素將被忽略,不會再加入。
返回值:加入到集合的新元素的個數(不包括被忽略的元素)。
7.4.2 smembers
語法:smembers key
功能:獲取集合 key 中的所有成員元素,不存在的key視為空集合。
返回值:返回指定集合的所有元素集合,不存在的key,返回空集合。
7.4.3 sismember
語法:sismember key member
功能:判斷 member 元素是否是集合 key 的元素
返回值:member是集合成員返回1,其他返回 0 。
7.4.4 scard
語法:scard key
功能:獲取集合裡面的元素個數
返回值:數字,key的元素個數。其他情況返回 0 。
7.4.5 srem
語法:srem key member [member…]
功能:移除集合中一個或多個元素,不存在的元素被忽略。
返回值:數字,成功移除的元素個數,不包括被忽略的元素。
7.4.6 srandmember
語法:srandmember key[count]
功能:只提供key,隨機返回集合中一個元素,元素不刪除,依然在集合中;
提供了count時,count 正數, 返回包含count個數元素的集合,集合元素各不重複。count是負數,返回一個count絕對值的長度的集合,集合中元素可能會重複多次。
返回值:一個元素或者多個元素的集合
7.4.7 spop
語法:spop key[count]
功能:隨機從集合中刪除一個或count個元素。
返回值:被刪除的元素,key不存在或空集合返回nil。
7.4.8 smove
語法:smove src dest member
功能:將 member 元素從src集合移動到dest集合,member不存在,smove不執行操作,返回0,如果dest存在member,則僅從src中刪除member。
返回值:成功返回 1 ,其他返回 0 。
7.4.9 sdiff
語法:sdiff key key [key…]
功能:返回指定集合的差集,以第一個集合為準進行比較,即第一個集合中有但在其它任何集合中都沒有的元素組成的集合。
返回值:返回第一個集合中有而後邊集合中都沒有的元素組成的集合,如果第一個集合中的元素在後邊集合中都有則返回空集合。
7.4.10 sinter
語法:sinter key key [key…]
功能:返回指定集合的交集,即指定的所有集合中都有的元素組成的集合。
返回值:交集元素組成的集合,如果沒有則返回空集合。
7.4.11 sunion
語法:sunion key key [key…]
功能:返回指定集合的並集,即指定的所有集合元素組成的大集合,如果元素有重複,則保留一個。
返回值:返回所有集合元素組成的大集合,如果所有key都不存在,返回空集合。
7.5 雜湊型別(hash)
Redis的hash 是一個string型別的key和value的對映表,這裡的value是一系列的鍵值對,hash特別適合用於儲存物件。
雜湊型別的資料操作總的思想是通過key和field操作value,key是資料標識,field是域,value是我們感興趣的業務資料。
7.5.1 hset
語法:hset key field value [field value …]
功能:將鍵值對field-value設定到雜湊列表key中,如果key不存在,則新建雜湊列表,然後執行賦值,如果key下的field已經存在,則value值覆蓋。
返回值:返回設定成功的鍵值對個數。
7.5.2 hget
語法:hget key field
功能:獲取雜湊表 key 中給定域 field 的值。
返回值:field域的值,如果key不存在或者field不存在返回nil。
7.5.3 hmset
語法:hmset key field value [field value…]
功能:同時將多個 field-value (域-值)設定到雜湊表 key 中,此命令會覆蓋已經存在的field,hash表key不存在,建立空的hash表,再執行hmset.
返回值:設定成功返回ok,如果失敗返回一個錯誤。
7.5.4 hmget
語法:hmget key field [field…]
功能:獲取雜湊表 key 中一個或多個給定域的值
返回值:返回和field順序對應的值,如果field不存在,返回nil。
7.5.5 hgetall
語法:hgetall key
功能:獲取雜湊表 key 中所有的域和值
返回值:以列表形式返回hash中域和域的值,key不存在,返回空hash.
7.5.6 hdel
語法:hdel key field [field…]
功能:刪除雜湊表 key 中的一個或多個指定域field,不存在field直接忽略。
返回值:成功刪除的field的數量。
7.5.7 hlen
語法:hlen key
功能:獲取雜湊表 key 中域field的個數
返回值:數值,field的個數。key不存在返回0.
7.5.8 hexists
語法:hexists key field
功能:檢視雜湊表 key 中,給定域 field 是否存在
返回值:如果field存在,返回1,其他返回0。
7.5.9 hkeys
語法:hkeys key
功能:檢視雜湊表 key 中的所有field域列表
返回值:包含所有field的列表,key不存在返回空列表
7.5.10 hvals
語法:hvals key
功能:返回雜湊表 中所有域的值列表
返回值:包含雜湊表所有域值的列表,key不存在返回空列表。
7.5.11 hincrby
語法:hincrby key field int
功能:給雜湊表key中的field域增加int
返回值:返回增加之後的field域的值
7.5.12 hincrbyfloat
語法:hincrbyfloat key field float
功能:給雜湊表key中的field域增加float
返回值:返回增加之後的field域的值
7.5.13 hsetnx
語法:hsetnx key field value
功能:將雜湊表 key 中的域 field 的值設定為 value ,當且僅當域 field 不存在的時候才設定,否則不設定。
返回值:設值成功返回1,其他返回0.
7.6 有序集合型別(Zset)
Redis 有序集合zset和集合set一樣也是string型別元素的集合,且不允許重複的成員。
不同的是zset的每個元素都會關聯一個分數(分數可以重複),redis通過分數來為集合中的成員進行從小到大的排序。
7.6.1 zadd
語法:zadd key score member [score member…]
功能:將一個或多個 member 元素及其 score 值加入到有序集合 key 中,如果member存在集合中,則覆蓋原來的值;score可以是整數或浮點數.
返回值:數字,新新增的元素個數.
7.6.2 zrange
語法:zrange key startIndex endIndex [WITHSCORES]
功能:查詢有序集合,指定區間的內的元素。集合成員按score值從小到大來排序;startIndex和endIndex都是從0開始表示第一個元素,1表示第二個元素,以此類推; startIndex和endIndex都可以取負數,表示從後往前取,-1表示倒數第一個元素;WITHSCORES選項讓score和value一同返回。
返回值:指定區間的成員組成的集合。
7.6.3 zrangebyscore
語法:zrangebyscore key min max [WITHSCORES ] [LIMIT offset count]
功能:獲取有序集 key 中,所有 score 值介於 min 和 max 之間(包括min和max)的成員,有序成員是按遞增(從小到大)排序;
使用符號”(“ 表示包括min但不包括max;
withscores 顯示score和 value;
limit用來限制返回結果的數量和區間,在結果集中從第offset個開始,取count個。
返回值:指定區間的集合資料
7.6.4 zrem
語法:zrem key member [member…]
功能:刪除有序集合 key 中的一個或多個成員,不存在的成員被忽略。
返回值:被成功刪除的成員數量,不包括被忽略的成員。
7.6.5 zcard
語法:zcard key
作用:獲取有序集 key 的元素成員的個數。
返回值:key存在,返回集合元素的個數; key不存在,返回0。
7.6.6 zcount
語法:zcount key min max
功能:返回有序集 key 中, score 值在 min 和 max 之間(包括 score 值等於 min 或 max )的成員的數量。
返回值:指定有序集合中分數在指定區間內的元素數量。
7.6.7 zrank
語法:zrank key member
功能:獲取有序集 key 中成員 member 的排名,有序整合員按 score 值從小到大順序排列,從0開始排名,score最小的是0 。
返回值:指定元素在有序集合中的排名;如果指定元素不存在,返回nil。
7.6.8 zscore
語法:zscore key member
功能:獲取有序集合key中元素member的分數。
返回值:返回指定有序集合元素的分數。
7.6.9 zrevrank
語法:zrevrank key member
功能:獲取有序集 key 中成員 member 的排名,有序整合員按 score 值從大到小順序排列,從0開始排名,score最大的是0 。
返回值:指定元素在有序集合中的排名;如果指定元素不存在,返回nil。
7.6.10 zrevrange
語法:zrevrange key startIndex endIndex [WITHSCORES]
功能:查詢有序集合,指定區間的內的元素。集合成員按score值從大到小來排序;startIndex和endIndex都是從0開始表示第一個元素,1表示第二個元素,以此類推; startIndex和endIndex都可以取負數,表示從後往前取,-1表示倒數第一個元素;WITHSCORES選項讓score和value一同返回。
返回值:指定區間的成員組成的集合。
7.6.12 zrevrangebyscore
語法:zrevrangebyscore key max min [WITHSCORES ] [LIMIT offset count]
功能:獲取有序集 key 中,所有 score 值介於 max 和 min 之間(包括max和min)的成員,有序成員是按遞減(從大到小)排序;
使用符號”(“ 表示不包括min和max;
withscores 顯示score和 value;
limit用來限制返回結果的數量和區間,在結果集中從第offset個開始,取count個。
返回值:指定區間的集合資料
8. Redis的配置檔案
8.1 redis.conf存放位置:
Redis的安裝根目錄下(/opt/redis-5.0.2),Redis在啟動時會載入這個配置檔案,在執行時按照配置進行工作。 這個檔案有時候我們會拿出來,單獨存放在某一個位置,啟動的時候必須明確指定使用哪個配置檔案,此檔案才會生效。
8.2 Redis 的網路相關配置
1、 bind:繫結IP地址,其它機器可以通過此IP訪問Redis,預設繫結127.0.0.1,也可以修改為本機的IP地址。
2、port:配置Redis佔用的埠,預設是6379。
3、tcp-keepalive:TCP連線保活策略,可以通過tcp-keepalive配置項來進行設定,單位為秒,假如設定為60秒,則server端會每60秒向連線空閒的客戶端發起一次ACK請求,以檢查客戶端是否已經掛掉,對於無響應的客戶端則會關閉其連線。如果設定為0,則不會進行保活檢測。
8.3 Redis的常規配置
1、loglevel:日誌級別,開發階段可以設定成debug,生產階段通常設定為notice或者warning.
2、logfile:指定日誌檔名,如果不指定,Redis只進行標準輸出。要保證日誌檔案所在的目錄必須存在,檔案可以不存在。還要在redis啟動時指定所使用的配置檔案,否則配置不起作用。
3、databases:配置Redis資料庫的個數,預設是16個。
8.4 Redis的安全配置
1、requirepass:配置Redis的訪問密碼。預設不配置密碼,即訪問不需要密碼驗證。此配置項需要在protected-mode=yes時起作用。使用密碼登入客戶端:redis-cli -h ip -p 6379 -a pwd
8.5 Redis的RDB配置
1、save
1分鐘內改變了1萬次 或者5分鐘內改變了10次 或者15分鐘內改變了1次
如果要禁用Redis的持久化功能,則把所有的save配置都註釋掉。
2、stop-writes-on-bgsave-error:當bgsave快照操作出錯時停止寫資料到磁碟,這樣能保證記憶體資料和磁碟資料的一致性,但如果不在乎這種一致性,要在bgsave快照操作出錯時繼續寫操作,這裡需要配置為no。
3、rdbcompression:設定對於儲存到磁碟中的快照是否進行壓縮,設定為yes時,Redis會採用LZF演算法進行壓縮;如果不想消耗CPU進行壓縮的話,可以設定為no,關閉此功能。
4、rdbchecksum:在儲存快照以後,還可以讓Redis使用CRC64演算法來進行資料校驗,但這樣會消耗一定的效能,如果系統比較在意效能的提升,可以設定為no,關閉此功能。
5、dbfilename:Redis持久化資料生成的檔名,預設是dump.rdb,也可以自己配置。
6、dir:Redis持久化資料生成檔案儲存的目錄,預設是./即redis的啟動目錄,也可以自己配置。
8.6 Redis AOF配置
1、appendonly:配置是否開啟AOF,yes表示開啟,no表示關閉。預設是no。
2、appendfilename:AOF儲存檔名
3、appendfsync:AOF非同步持久化策略
always:同步持久化,每次發生資料變化會立刻寫入到磁碟中。效能較差但資料完整性比較好(慢,安全)
everysec:出廠預設推薦,每秒非同步記錄一次(預設值)no:不即時同步,由作業系統決定何時同步。
4、no-appendfsync-on-rewrite:重寫時是否可以運用appendsync,預設no,可以保證資料的安全性。
5、auto-aof-rewrite-percentage:設定重寫的基準百分比
6、auto-aof-rewrite-min-size:設定重寫的基準值
9. Redis的持久化
redis是記憶體資料庫,它把資料儲存在記憶體中,這樣在加快讀取速度的同時也對資料安全性產生了新的問題,即當redis所在伺服器發生宕機後,redis資料庫裡的所有資料將會全部丟失。為了解決這個問題,redis提供了持久化功能——RDB和AOF(Append Only File)。
9.1 RDB
RDB(Redis DataBase)是 Redis 預設的持久化方案。在指定的時間間隔內,執行指定次數的寫操作,則會將記憶體中的資料寫入到磁碟中。即在指定目錄下生成一個dump.rdb檔案。Redis重啟會通過載入dump.rdb檔案來恢復資料。
9.1.2 RDB原理:
Redis會複製一個與當前程序一樣的程序。新程序的所有資料(變數、環境變數、程式計數器等)數值都和原程序一致,但是是一個全新的程序,並作為原程序的子程序,來進行持久化。
整個過程中,主程序是不進行任何IO操作的,這就確保了極高的效能。
如果需要進行大規模資料的恢復,且對於資料恢復的完整性不是非常敏感,那RDB方式要比AOF方式更加的高效。RDB的缺點是最後一次持久化後的資料可能丟失。
9.1.3 RDB儲存的檔案:
RDB儲存的檔案是dump.rdb檔案 ,位置儲存在Redis的啟動目錄。Redis每次同步資料到磁碟都會生成一個dump.rdb檔案,新的dump.rdb會覆蓋舊的dump.rdb檔案。
9.1.4 配置RDB 持久化策略
在redis.conf的快照配置中,配置RDB儲存的策略。
在客戶端執行FLUSHDB或者FLUSHALL或者SHUTDOWN時,也會把快照中的資料儲存到dump.rdb,只不過這種操作已經把資料清空了,儲存的也是空檔案,沒有意義。
9.1.5 手動儲存RDB快照
save命令執行一個同步儲存操作,將當前 Redis 例項的所有資料快照(snapshot)以 RDB 檔案的形式儲存到硬碟。
由於save指令會阻塞所有客戶端,所以儲存資料庫的任務通常由 BGSAVE 命令非同步地執行,而save作為儲存資料的最後手段來使用,當負責儲存資料的後臺子程序不幸出現問題時使用。
9.1.6 RDB資料恢復
通過指令碼將Redis產生的dump.rdb檔案備份(cp dump.rdb dump_bak.rdb),每次啟動Redis前,把備份的dump.rdb檔案替換到Redis相應的目錄(在redis.conf中配的的dir目錄)下,Redis啟動時會載入dump.rdb檔案,並且把資料讀到記憶體中。
9.1.7 RDB小結
Redis預設開啟RDB持久化方式,適合大規模的資料恢復但它的資料一致性和完整性較差。
9.2 AOF
AOF(Append Only File),Redis 預設不開啟。它的出現是為了彌補RDB的不足(資料的不一致性),所以它採用日誌的形式來記錄每個寫操作,並追加到檔案中。Redis 重啟會根據日誌檔案的內容將寫指令從前到後執行一次以完成資料的恢復工作。
9.2.1 AOF原理
Redis以日誌的形式來記錄每個寫操作,將Redis執行過的所有寫指令記錄下來(讀操作不記錄),
只許追加檔案但不可以改寫檔案,redis啟動之初會讀取該檔案重新構建資料,換言之,redis重啟的話就根據日誌檔案的內容將寫指令從前到後執行一次以完成資料的恢復工作。
9.2.2 AOF儲存的檔案
AOF儲存的檔案是appendonly.aof檔案 ,位置儲存在Redis的啟動目錄。如果開啟了AOF,Redis每次記錄寫操作都會往appendonly.aof檔案追加新的日誌內容。
9.2.3 配置AOF持久化策略
在redis.conf的“APPEND ONLY MODE”配置模組中,配置AOF儲存策略。
9.2.4 AOF資料恢復
通過指令碼將Redis產生的appendonly.aof檔案備份(cp appendonly.aof appendonly_bak.aof),每次啟動Redis前,把備份的appendonly.aof檔案替換到Redis相應的目錄(在redis.conf中配的的dir目錄)下,只要開啟AOF的功能,Redis每次啟動,會根據日誌檔案的內容將寫指令從前到後執行一次以完成資料的恢復工作。
但在實際開發中,可能因為某些原因導致appendonly.aof 檔案格式異常,從而導致資料還原失敗,可以通過命令redis-check-aof --fix appendonly.aof 進行修復 。會把出現異常的部分往後所有寫操作日誌去掉。
9.2.5 AOF的重寫
AOF採用檔案追加方式,檔案會越來越大為避免出現此種情況,新增了重寫機制,當AOF檔案的大小超過所設定的閾值時,Redis就會啟動AOF檔案的內容壓縮,只保留可以恢復資料的最小指令集。
AOF檔案持續增長而過大時,會fork出一條新程序來將檔案重寫(也是先寫臨時檔案最後再rename),遍歷新程序的記憶體中資料,每條記錄有一條的Set語句。重寫aof檔案的操作,並沒有讀取舊的aof檔案,而是將整個記憶體中的資料庫內容用命令的方式重寫了一個新的aof檔案,這點和快照有點類似。
Redis會記錄上次重寫時的AOF大小,預設配置是當AOF檔案大小是上次rewrite後大小的一倍且檔案大於64M時觸發。當然,也可以在配置檔案中進行配置。
9.2.6 AOF小結:
Redis 需要手動開啟AOF持久化方式,AOF 的資料完整性比RDB高,但記錄內容多了,會影響資料恢復的效率。
關於Redis持久化的使用:若只打算用Redis做快取,可以關閉持久化。若打算使用Redis的持久化,建議RDB和AOF都開啟。其實RDB更適合做資料的備份,留一後手。AOF出問題了,還有RDB。
AOF與RDB模式可以同時啟用,這並不衝突。如果AOF是可用的,那Redis啟動時將自動載入AOF,這個檔案能夠提供更好的永續性保障。
10. Redis的事務
10.1 Redis的事務
Redis的事務允許在一次單獨的步驟中執行一組命令,並且能夠保證將一個事務中的所有命令序列化,然後按順序執行;在一個Redis事務中,Redis要麼執行其中的所有命令,要麼什麼都不執行。即Redis的事務要能夠保證序列化和原子性。
10.1.1 Redis事務的常用命令:
10.1.1.1multi
語法:multi
功能:用於標記事務塊的開始。Redis會將後續的命令逐個放入佇列中,然後才能使用EXEC命令原子化地執行這個命令序列。
返回值:開啟成功返回OK
10.1.1.2 exec
語法:exec
功能:在一個事務中執行所有先前放入佇列的命令,然後恢復正常的連線狀態。
如果在把命令壓入佇列的過程中報錯,則整個佇列中的命令都不會執行,執行結果報錯;
如果在壓佇列的過程中正常,在執行佇列中某一個命令報錯,則只會影響本條命令的執行結果,其它命令正常執行;
當使用WATCH命令時,只有當受監控的鍵沒有被修改時,EXEC命令才會執行事務中的命令;而一旦執行了exec命令,之前加的所有watch監控全部取消。
返回值:這個命令的返回值是一個數組,其中的每個元素分別是原子化事務中的每個命令的返回值。 當使用WATCH命令時,如果事務執行中止,那麼EXEC命令就會返回一個Null值。
10.1.1.3 discard
語法:discard
功能:清除所有先前在一個事務中放入佇列的命令,並且結束事務。
如果使用了WATCH命令,那麼DISCARD命令就會將當前連線監控的所有鍵取消監控。
返回值:清除成功,返回OK。
10.1.1.4 watch
語法:watch key [key …]
功能:當某個事務需要按條件執行時,就要使用這個命令將給定的鍵設定為受監控的。如果被監控的key值在本事務外有修改時,則本事務所有指令都不會被執行。Watch命令相當於關係型資料庫中的樂觀鎖。
返回值:監控成功,返回OK。
10.1.1.5 unwatch
語法:unwatch
功能:清除所有先前為一個事務監控的鍵。
如果在watch命令之後你呼叫了EXEC或DISCARD命令,那麼就不需要手動呼叫UNWATCH命令。
返回值:清除成功,返回OK。
10.1.1.6 Redis事務小結:
1、單獨的隔離操作:事務中的所有命令都會序列化、順序地執行。事務在執行過程中,不會被其它客戶端發來的命令請求所打斷,除非使用watch命令監控某些鍵。
2、不保證事務的原子性:redis同一個事務中如果一條命令執行失敗,其後的命令仍然可能會被執行,redis的事務沒有回滾。Redis已經在系統內部進行功能簡化,這樣可以確保更快的執行速度,因為Redis不需要事務回滾的能力。
11. Redis訊息的釋出與訂閱(瞭解)
11.1 Redis釋出訂閱
Redis 釋出訂閱(pub/sub)是一種訊息通訊模式:傳送者(pub)傳送訊息,訂閱者(sub)接收訊息。Redis 客戶端可以訂閱任意數量的頻道。
11.2 Redis釋出訂閱示意圖
圖一:訊息訂閱者(client2 、 client5 和 client1)訂閱頻道 channel1:
圖二:訊息釋出者釋出訊息到頻道channel1,會被髮送到三個訂閱者:
11.3 Redis釋出訂閱的常用命令
11.3.1 subscribe
語法:subscribe channel [channel…]
功能:訂閱一個或多個頻道的資訊
返回值:訂閱的訊息
11.3.2 publish
語法:publish chanel message
功能:將資訊傳送到指定的頻道。
返回值:數字。接收到訊息訂閱者的數量。
11.3.3 psubscribe
語法:psubscribe pattern [pattern]
功能:訂閱一個或多個符合給定模式的頻道。模式以 * 作為萬用字元,例如:news.* 匹配所有以 news. 開頭的頻道。
返回值:訂閱的資訊。
12. Redis的主從複製
12.1 主從複製
主機資料更新後根據配置和策略,自動同步到從機的master/slave機制,Master以寫為主,Slave以讀為主。
12.2 一主二從
12.2.1 一主二從原理
1、配從(庫)不配主(庫)
2、配從(庫): slaveof 主庫IP 主庫埠
3、主寫從讀、讀寫分離
4、從連前後同
5、主斷從待命、從斷重新連
12.2.2 一主二從搭建
1、一臺伺服器模擬三臺主機:
第一步:將redis.conf 拷貝三份,名字分別是,redis6379.conf,redis6380.conf redis6381.conf
第二步:修改三個檔案的port埠,pid檔名,日誌檔名,rdb檔名
如:port 6379 pidfile /var/run/redis_6379.pid logfile "6379.log" dbfilename dump6379.rdb
第三步:分別開啟三個視窗模擬三臺伺服器,開啟redis服務。
2、查詢主從資訊:info replication
3、寫操作6379:
4、設定主從關係:
在6380和6381主機上分別執行命令:slaveof 127.0.0.1 6379
另一種方式,就是修改6380和6381的配置檔案,在最後加上:
注意:如果主redis設定了密碼,從庫的redis.conf中還需要設定masterauth為主redis的密碼。
5、全量複製:在6380和6381分別執行命令get k1
6、增量複製:6379執行命令:set k2 v2。然後6380埠和6381埠,分別執行命令:get k2
7、主寫從讀、讀寫分離:在6380和6381上執行寫操作set k3 v3
8、主機宕機:6379執行指令shutdown,並檢視6380和6381的redis資訊
從機原地待命。
9、主機宕機後恢復:重啟6379,並且執行寫命令set k4 v4;6380和6381上分別執行get k4
主機重啟後,一切正常。
10、從機宕機:6380執行指令shutdown,並檢視6379和6381的redis資訊
11、從機宕機後恢復:重啟6380,並檢視6380、6379和6381的redis資訊
注意:從機跟master斷開聯絡,必須重新連線,除非寫進配置檔案。
12、從機恢復連主機前,主機寫操作:6379執行寫命令set k5 v5,6380和6381分別執行命令get k5
13、從機恢復連線主機,6380執行命令:slaveof 127.0.0.1 6379,並且執行命令:get k5
14、從機上位:
第一步:主機宕機,6379執行命令:shutdown
第二步:6380斷開主從關係,執行命令:SLAVEOF no one
第三步:重新搭建主從,6381執行命令:info replication,SLAVEOF 127.0.0.1 6380
第四步:之前主機恢復,重啟6379的Redis服務,並執行命令:info replication
在6379主機宕機後,6380從機斷開主從關係,6381開始還在原地待命;後來6380從機上位,6381投靠6380,6379主機即使回來但它已是孤寡老人,空頭司令。
15、天堂變地獄:6379執行命令saveof 127.0.0.1 6381,並在6379和6381執行info replication
一臺主機配多臺從機,一臺從機再配多臺從機,從而實現了龐大的叢集架構。同時也減輕了一臺主機的壓力,缺點是增加了伺服器間的延遲。
13. 複製原理
13.1 全量複製
slave啟動成功連線到master後會傳送一個sync命令;Master接到命令啟動後臺的存檔程序,同時收集所有接收到的用於修改資料集命令,在後臺程序執行完畢之後,master將傳送整個資料檔案到slave,以完成一次完全同步;slave服務在接收到資料庫檔案資料後,將其存檔並載入到記憶體中。
只要是重新連線master,一次完全同步(全量複製)將被自動執行。
13.2 增量複製
Master將新的所有收集到的修改命令依次傳給slave,完成同步。
14. 哨兵模式
14.1 哨兵模式原理
從機上位的自動版。Redis提供了哨兵的命令,哨兵命令是一個獨立的程序,哨兵通過傳送命令,來監控主從伺服器的執行狀態,如果檢測到master故障了根據投票數自動將某一個slave轉換master,然後通過訊息訂閱模式通知其它slave,讓它們切換主機。然而,一個哨兵程序對Redis伺服器進行監控,可能會出現問題,為此,我們可以使用多哨兵進行監控。
14.2 哨兵模式搭建
1—7步跟1.17.2.2一主二從搭建一樣:一臺伺服器模擬三臺主機、查詢主從資訊、寫操作6379、設定主從關係、全量複製、增量複製、主寫從讀、讀寫分離。
8、建立redis_sentinel.conf檔案,並編輯裡邊的內容:sentinel monitor dc-redis 127.0.0.1 6379 1,表示:指定監控主機的ip地址,port埠,得到哨兵的投票數(當哨兵投票數大於或者等於此數時切換主從關係)。
9、新開視窗,啟動哨兵:redis-sentinel /opt/redis-5.0.2/redis_sentinel.conf
10、主機宕機:
11、等待從機投票,在sentinel視窗中檢視列印資訊。
12、檢視6380和6381的redis資訊:
13、原主機恢復,啟動6379:
14.3 哨兵模式搭建(配置檔案模式)
1—7步跟1.17.2.2一主二從搭建一樣:一臺伺服器模擬三臺主機、查詢主從資訊、寫操作6379、設定主從關係、全量複製、增量複製、主寫從讀、讀寫分離。
8、複製三份redis_ sentinel.conf檔案為redis_sentinel26379.conf、redis_sentinel26380.conf、redis_sentinel 26381.conf,並修改內容:
埠分別修改為26379、26380、26381
哨兵監控策略都修改為:
sentinel monitor mymaster 192.168.235.128 6379 2,表示:指定監控主機的ip地址,port埠,得票數多於2時表示需要切換主從關係。
如果設定密碼了,都還需要設定密碼:
sentinel auth-pass mymaster 123456
9、新開三個視窗,啟動哨兵:./redis-sentinel ../myconfs/sentinel26379.conf
10、主機宕機:
11、等待從機投票,在sentinel視窗中檢視列印資訊。
12、檢視6380和6381的redis資訊:
13、原主機恢復,:
14.4 小結
14.4.1 操作:
1 檢視主從複製關係命令:info replication
2 設定主從關係命令:slaveof 主機ip 主機port
3 開啟哨兵模式命令:./redis-sentinel sentinel.conf
4 主從複製原則:開始是全量複製,之後是增量複製
5 哨兵模式三大任務:監控,提醒,自動故障遷移
14.4.2 缺點
Redis的主從複製最大的缺點就是延遲,主機負責寫,從機負責備份,這個過程有一定的延遲,當系統很繁忙的時候,延遲問題會更加嚴重,從機器數量的增加也會使這個問題更加嚴重。
15. Jedis操作Redis
15.1 Jedis簡介:
使用Redis官方推薦的Jedis,在java應用中操作Redis。Jedis幾乎涵蓋了Redis的所有命令。操作Redis的命令在Jedis中以方法的形式出現。
15.2 Jedis操作Redis
15.3 Jedis操作key
15.4 Jedis操作字串(string)型別資料
15.5 Jedis操作列表(list)型別資料
15.6 Jedis操作雜湊(hash)型別資料
15.7 Jedis操作集合(set)型別資料
15.8 Jedis操作有序集合(zset)型別資料
15.9 Jedis操作事務
本文來自部落格園,作者:g0rez,轉載請註明原文連結:https://www.cnblogs.com/g0rez/p/15470999.html