redis
Remote Dictionary Server(遠端字典伺服器),是一個用C語言編寫的、開源的、基于記憶體運作并支援持久化的、高性能的NoSQL資料庫.也是目前熱門的NoSQL資料庫之一。
1、支援資料持久化
Redis支援資料的持久化,可以将記憶體中的資料保持在磁盤中,重新開機的時候可以再次加載進行使用。
2、支援多種資料結構
Redis不僅僅支援簡單的key-value類型的資料,同時還提供list,set,zset,hash等資料結構的存儲。
3、支援資料備份
Redis支援資料的備份,即master-slave模式的資料備份。
如果報錯:gcc指令未找到 那麼提前安裝gcc 執行gcc –v檢視Linux核心版本
在make執行之後再執行 make install,該操作則将 src下的許多可執行檔案複制到/usr/local/bin 目錄下,這樣做可以在任意目錄執行redis的軟體的指令(例如啟動,停止,用戶端連接配接伺服器等), make install 可以不用執行,
檢視make編譯結果,cd src目錄

啟動方式:
① 前台啟動 redis-server
②背景啟動 redis-server &
③根據配置檔案啟動 啟動指令 配置檔案 &
注意:如果修改了redis的配置檔案redis.conf,必須在啟動時指定配置檔案,否則修改無效!
關閉方式:
①使用redis用戶端關閉,向伺服器發出關閉指令
任意目錄下執行 指令redis-cli shutdown
推薦使用這種方式, redis先完成資料操作,然後再關閉。
例如:
②kill pid 或者 kill -9 pid
這種不會考慮目前應用是否有資料正在執行操作,直接就關閉應用。
先使用 ps -ef | grep redis 查出程序号,在使用 kill pid
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指令。
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中最基本的資料結構,它能存儲任何類型的資料,包括二進制數
據,序列化後的資料,JSON化的對象甚至是一張圖檔。最大512M。
Redis清單是簡單的字元串清單,按照插入順序排序,元素可以重複。你可以添加一個元素到清單的頭部(左邊)或者尾部(右邊),底層是個連結清單結構。
Redis的Set是string類型的無序無重複集合。
Redis hash 是一個string類型的field和value的映射表,hash特别适合用于存儲對象。
Redis 有序集合zset和集合set一樣也是string類型元素的集合,且不允許重複的成員。
不同的是zset的每個元素都會關聯一個分數(分數可以重複),redis通過分數來為集合中的成員進行從小到大的排序。
文法:keys pattern
作用:查找所有符合模式pattern的key. pattern可以使用通配符。
通配符:
l *:表示0或多個字元,例如:keys * 查詢所有的key。
l ?:表示單個字元,例如:wo?d , 比對 word , wood
l [] :表示選擇[]内的一個字元,例如wo[or]d, 比對word, wood, 不比對wold、woord
文法:exists key [key…]
作用:判斷key是否存在
傳回值:整數,存在key傳回1,其他傳回0。使用多個key,傳回存在的key的數量。
文法:move key db
作用:移動key到指定的資料庫,移動的key在原庫被删除。
傳回值:移動成功傳回1,失敗傳回0.
文法:ttl key
作用:檢視key的剩餘生存時間(ttl: time to live),以秒為機關。
傳回值:
-1 :沒有設定key的生存時間, key永不過期。
-2:key不存在
文法:expire key seconds
作用:設定key的生存時間,超過時間,key自動删除。機關是秒。
傳回值:設定成功傳回數字 1,其他情況是 0 。
文法:type key
作用:檢視key所存儲值的資料類型
傳回值:字元串表示的資料類型
none (key不存在) string (字元串)
list (清單) set (集合)
zset (有序集) hash (哈希表)
文法:rename key newkey
作用:将key改為名newkey。當 key 和 newkey 相同,或者 key 不存在時,傳回一個錯誤。
當 newkey 已經存在時, RENAME 指令将覆寫舊值。
文法:del key [key…]
作用:删除存在的key,不存在的key忽略。
傳回值:數字,删除的key的數量。
字元串類型是Redis中最基本的資料類型,它能存儲任何形式的字元串,包括二進制數
據,序列化後的資料,JSON化的對象甚至是一張圖檔。
字元串類型的資料操作總的思想是通過key操作value,key是資料辨別,value是我們感
興趣的業務資料。
文法:set key value
功能:将字元串值 value 設定到 key 中,如果key已存在,後放的值會把前放的值覆寫掉。
傳回值:OK表示成功
文法:get key
功能:擷取 key 中設定的字元串值
傳回值:key存在,傳回key對應的value;
key不存在,傳回nil
文法:append key value
功能:如果 key 存在,則将 value 追加到 key 原來舊值的末尾
如果 key 不存在,則将key 設定值為 value
傳回值:追加字元串之後的總長度(字元個數)
文法:strlen key
功能:傳回 key 所儲存的字元串值的長度
傳回值:如果key存在,傳回字元串值的長度;
key不存在,傳回0
文法:incr key
功能:将 key 中儲存的數字值加1,如果 key 不存在,則 key 的值先被初始化為 0 再執行incr操作。
傳回值:傳回加1後的key值
文法:decr key
功能:将 key 中儲存的數字值減1,如果 key 不存在,則麼 key 的值先被初始化為 0 再執行 decr 操作。
傳回值:傳回減1後的key值
文法:incrby key offset
功能:将 key 所儲存的值加上增量值,如果 key 不存在,則 key 的值先被初始化為 0 再執行 INCRBY 指令。
傳回值:傳回增量之後的key值。
文法:decrby key offset
功能:将 key 所儲存的值減去減量值,如果 key 不存在,則 key 的值先被初始化為 0 再執行 DECRBY 指令。
傳回值:傳回減量之後的key值。
文法:getrange key startIndex endIndex
功能:擷取 key 中字元串值從 startIndex 開始到 endIndex 結束的子字元串,包括startIndex和endIndex, 負數表示從字元串的末尾開始,-1 表示最後一個字元。
文法:setrange key offsetIndex value
功能:用value覆寫key的存儲的值從offset開始。
傳回值:修改後的字元串的長度。
文法:setex key seconds value
功能:設定key的值,并将 key 的生存時間設為 seconds (以秒為機關) ,如果key已經存在,将覆寫舊值。
傳回值:設定成功,傳回OK。
文法:setnx key value
功能:setnx 是 set if not exists 的簡寫,如果key不存在,則 set 值,存在則不設定值。
傳回值:設定成功,傳回1
設定失敗,傳回0
文法:mset key value [key value…]
功能:同時設定一個或多個 key-value 對
文法:mget key [key …]
功能:擷取所有(一個或多個)給定 key 的值
傳回值:包含所有key的清單,如果key不存在,則傳回nil。
文法:msetnx key value[key value…]
功能:同時設定一個或多個 key-value 對,如果有一個key是存在的,則設定不成功。
Redis清單是簡單的字元串清單,按照插入順序排序,左邊(頭部)、右邊(尾部)或者中間都可以添加元素。連結清單的操作無論是頭或者尾效率都極高,但是如果對中間元素進行操作,那效率會大大降低了。
清單類型的資料操作總的思想是通過key和下标操作value,key是資料辨別,下标是資料在清單中的位置,value是我們感興趣的業務資料。
文法:lpush key value [value…]
功能:将一個或多個值 value 插入到清單 key 的最左邊(表頭),各個value值依次插入到表頭位置。
傳回值:插入之後的清單的長度。
文法:rpush key value [value…]
功能:将一個或多個值 value 插入到清單 key 的最右邊(表尾),各個 value 值按依次插入到表尾。
文法:lrange key startIndex endIndex
功能:擷取清單 key 中指定下标區間内的元素,下标從0開始,到清單長度-1;下标也可以是負數,表示清單從後往前取,-1表示倒數第一個元素,-2表示倒數第二個元素,以此類推;startIndex和endIndex超出範圍不會報錯。
傳回值:擷取到的元素清單。
文法:lpop key
功能:移除并傳回清單key頭部第一個元素,即清單左側的第一個元素。
傳回值:清單左側第一個元素的值;清單key不存在,傳回nil。
文法:rpop key
功能:移除并傳回清單key尾部第一個元素,即清單右側的第一個元素。
傳回值:清單右側第一個元素的值;清單key不存在,傳回nil。
文法:lindex key index
功能:擷取清單 key 中下标為指定 index 的元素,清單元素不删除,隻是查詢。0 表示清單的第一個元素,1 表示清單的第二個元素;index也可以負數的下标, -1 表示清單的最後一個元素, -2 表示清單的倒數第二個元素,以此類推。
傳回值:key存在時,傳回指定元素的值;
Key不存在時,傳回nil。
文法:llen key
功能:擷取清單 key 的長度
傳回值:數值,清單的長度;key不存在傳回0
文法:lrem key count value
功能:根據參數 count 的值,移除清單中與參數 value 相等的元素,
count >0 ,從清單的左側向右開始移除;
count < 0 從清單的尾部開始移除;
count = 0移除表中所有與 value 相等的值。
傳回值:數值,移除的元素個數
文法:ltrim key startIndex endIndex
功能:截取key的指定下标區間的元素,并且指派給key。下标從0開始,一直到清單長度-1;下标也可以是負數,表示清單從後往前取,-1表示倒數第一個元素,-2表示倒數第二個元素,以此類推;startIndex和endIndex超出範圍不會報錯。
傳回值:執行成功傳回ok
文法:lset key index value
功能:将清單 key 下标為 index 的元素的值設定為 value。
功能:設定成功傳回ok ; key不存在或者index超出範圍傳回錯誤資訊。
文法:linsert key before/after pivot value
功能:将值 value 插入到清單 key 當中位于值 pivot 之前或之後的位置。key不存在或者pivot不在清單中,不執行任何操作。
傳回值:指令執行成功,傳回新清單的長度。沒有找到pivot傳回 -1, key不存在傳回0。
Redis的Set是string類型的無序不重複集合。
集合類型的資料操作總的思想是通過key确定集合,key是集合辨別,元素沒有下标,隻有直接操作業務資料和資料的個數。
文法:sadd key member [member…]
功能:将一個或多個 member 元素加入到集合 key 當中,已經存在于集合的 member 元素将被忽略,不會再加入。
傳回值:加入到集合的新元素的個數(不包括被忽略的元素)。
文法:smembers key
功能:擷取集合 key 中的所有成員元素,不存在的key視為空集合。
傳回值:傳回指定集合的所有元素集合,不存在的key,傳回空集合。
文法:sismember key member
功能:判斷 member 元素是否是集合 key 的元素
傳回值:member是集合成員傳回1,其他傳回 0 。
文法:scard key
功能:擷取集合裡面的元素個數
傳回值:數字,key的元素個數。其他情況傳回 0 。
文法:srem key member [member…]
功能:移除集合中一個或多個元素,不存在的元素被忽略。
傳回值:數字,成功移除的元素個數,不包括被忽略的元素。
文法:srandmember key[count]
功能:隻提供key,随機傳回集合中一個元素,元素不删除,依然在集合中;
提供了count時,count 正數, 傳回包含count個數元素的集合,集合元素各不重複。count是負數,傳回一個count絕對值的長度的集合,集合中元素可能會重複多次。
傳回值:一個元素或者多個元素的集合
文法:spop key[count]
功能:随機從集合中删除一個或count個元素。
傳回值:被删除的元素,key不存在或空集合傳回nil。
文法:smove src dest member
功能:将 member 元素從src集合移動到dest集合,member不存在,smove不執行操作,傳回0,如果dest存在member,則僅從src中删除member。
傳回值:成功傳回 1 ,其他傳回 0 。
文法:sdiff key key [key…]
功能:傳回指定集合的差集,以第一個集合為準進行比較,即第一個集合中有但在其它任何集合中都沒有的元素組成的集合。
傳回值:傳回第一個集合中有而後邊集合中都沒有的元素組成的集合,如果第一個集合中的元素在後邊集合中都有則傳回空集合。
文法:sinter key key [key…]
功能:傳回指定集合的交集,即指定的所有集合中都有的元素組成的集合。
傳回值:交集元素組成的集合,如果沒有則傳回空集合。
文法:sunion key key [key…]
功能:傳回指定集合的并集,即指定的所有集合元素組成的大集合,如果元素有重複,則保留一個。
傳回值:傳回所有集合元素組成的大集合,如果所有key都不存在,傳回空集合。
Redis的hash 是一個string類型的key和value的映射表,這裡的value是一系列的鍵值對,hash特别适合用于存儲對象。
哈希類型的資料操作總的思想是通過key和field操作value,key是資料辨別,field是域,value是我們感興趣的業務資料。
文法:hset key field value [field value …]
功能:将鍵值對field-value設定到哈希清單key中,如果key不存在,則建立哈希清單,然後執行指派,如果key下的field已經存在,則value值覆寫。
傳回值:傳回設定成功的鍵值對個數。
文法:hget key field
功能:擷取哈希表 key 中給定域 field 的值。
傳回值:field域的值,如果key不存在或者field不存在傳回nil。
文法:hmset key field value [field value…]
功能:同時将多個 field-value (域-值)設定到哈希表 key 中,此指令會覆寫已經存在的field,hash表key不存在,建立空的hash表,再執行hmset.
傳回值:設定成功傳回ok,如果失敗傳回一個錯誤。
文法:hmget key field [field…]
功能:擷取哈希表 key 中一個或多個給定域的值
傳回值:傳回和field順序對應的值,如果field不存在,傳回nil。
文法:hgetall key
功能:擷取哈希表 key 中所有的域和值
傳回值:以清單形式傳回hash中域和域的值,key不存在,傳回空hash.
文法:hdel key field [field…]
功能:删除哈希表 key 中的一個或多個指定域field,不存在field直接忽略。
傳回值:成功删除的field的數量。
文法:hlen key
功能:擷取哈希表 key 中域field的個數
傳回值:數值,field的個數。key不存在傳回0.
文法:hexists key field
功能:檢視哈希表 key 中,給定域 field 是否存在
傳回值:如果field存在,傳回1,其他傳回0。
文法:hkeys key
功能:檢視哈希表 key 中的所有field域清單
傳回值:包含所有field的清單,key不存在傳回空清單
文法:hvals key
功能:傳回哈希表 中所有域的值清單
傳回值:包含哈希表所有域值的清單,key不存在傳回空清單。
文法:hincrby key field int
功能:給哈希表key中的field域增加int
傳回值:傳回增加之後的field域的值
文法:hincrbyfloat key field float
功能:給哈希表key中的field域增加float
文法:hsetnx key field value
功能:将哈希表 key 中的域 field 的值設定為 value ,當且僅當域 field 不存在的時候才設定,否則不設定。
傳回值:設值成功傳回1,其他傳回0.
文法:zadd key score member [score member…]
功能:将一個或多個 member 元素及其 score 值加入到有序集合 key 中,如果member存在集合中,則覆寫原來的值;score可以是整數或浮點數.
傳回值:數字,新添加的元素個數.
文法:zrange key startIndex endIndex [WITHSCORES]
功能:查詢有序集合,指定區間的内的元素。集合成員按score值從小到大來排序;startIndex和endIndex都是從0開始表示第一個元素,1表示第二個元素,以此類推; startIndex和endIndex都可以取負數,表示從後往前取,-1表示倒數第一個元素;WITHSCORES選項讓score和value一同傳回。
傳回值:指定區間的成員組成的集合。
文法:zrangebyscore key min max [WITHSCORES ] [LIMIT offset count]
功能:擷取有序集 key 中,所有 score 值介于 min 和 max 之間(包括min和max)的成員,有序成員是按遞增(從小到大)排序;
使用符号”(“ 表示包括min但不包括max;
withscores 顯示score和 value;
limit用來限制傳回結果的數量和區間,在結果集中從第offset個開始,取count個。
傳回值:指定區間的集合資料
文法:zrem key member [member…]
功能:删除有序集合 key 中的一個或多個成員,不存在的成員被忽略。
傳回值:被成功删除的成員數量,不包括被忽略的成員。
文法:zcard key
作用:擷取有序集 key 的元素成員的個數。
傳回值:key存在,傳回集合元素的個數; key不存在,傳回0。
文法:zcount key min max
功能:傳回有序集 key 中, score 值在 min 和 max 之間(包括 score 值等于 min 或 max )的成員的數量。
傳回值:指定有序集合中分數在指定區間内的元素數量。
文法:zrank key member
功能:擷取有序集 key 中成員 member 的排名,有序內建員按 score 值從小到大順序排列,從0開始排名,score最小的是0 。
傳回值:指定元素在有序集合中的排名;如果指定元素不存在,傳回nil。
文法:zscore key member
功能:擷取有序集合key中元素member的分數。
傳回值:傳回指定有序集合元素的分數。
文法:zrevrank key member
功能:擷取有序集 key 中成員 member 的排名,有序內建員按 score 值從大到小順序排列,從0開始排名,score最大的是0 。
文法:zrevrange key startIndex endIndex [WITHSCORES]
功能:查詢有序集合,指定區間的内的元素。集合成員按score值從大到小來排序;startIndex和endIndex都是從0開始表示第一個元素,1表示第二個元素,以此類推; startIndex和endIndex都可以取負數,表示從後往前取,-1表示倒數第一個元素;WITHSCORES選項讓score和value一同傳回。
文法:zrevrangebyscore key max min [WITHSCORES ] [LIMIT offset count]
功能:擷取有序集 key 中,所有 score 值介于 max 和 min 之間(包括max和min)的成員,有序成員是按遞減(從大到小)排序;
使用符号”(“ 表示不包括min和max;
Redis的安裝根目錄下(/opt/redis-5.0.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,則不會進行保活檢測。
1、loglevel:日志級别,開發階段可以設定成debug,生産階段通常設定為notice或者warning.
2、logfile:指定日志檔案名,如果不指定,Redis隻進行标準輸出。要保證日志檔案所在的目錄必須存在,檔案可以不存在。還要在redis啟動時指定所使用的配置檔案,否則配置不起作用。
3、databases:配置Redis資料庫的個數,預設是16個。
1、requirepass:配置Redis的通路密碼。預設不配置密碼,即通路不需要密碼驗證。此配置項需要在protected-mode=yes時起作用。使用密碼登入用戶端:redis-cli -h ip -p 6379 -a pwd
1、save :配置複合的快照觸發條件,即Redis 在seconds秒内key改變changes次,Redis把快照内的資料儲存到磁盤中一次。預設的政策是:
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的啟動目錄,也可以自己配置。
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:設定重寫的基準值
redis是記憶體資料庫,它把資料存儲在記憶體中,這樣在加快讀取速度的同時也對資料安全性産生了新的問題,即當redis所在伺服器發生當機後,redis資料庫裡的所有資料将會全部丢失。為了解決這個問題,redis提供了持久化功能——RDB和AOF(Append Only File)。
RDB(Redis DataBase)是 Redis 預設的持久化方案。在指定的時間間隔内,執行指定次數的寫操作,則會将記憶體中的資料寫入到磁盤中。即在指定目錄下生成一個dump.rdb檔案。Redis重新開機會通過加載dump.rdb檔案來恢複資料。
Redis會複制一個與目前程序一樣的程序。新程序的所有資料(變量、環境變量、程式計數器等)數值都和原程序一緻,但是是一個全新的程序,并作為原程序的子程序,來進行持久化。
整個過程中,主程序是不進行任何IO操作的,這就確定了極高的性能。
如果需要進行大規模資料的恢複,且對于資料恢複的完整性不是非常敏感,那RDB方式要比AOF方式更加的高效。RDB的缺點是最後一次持久化後的資料可能丢失。
RDB儲存的檔案是dump.rdb檔案 ,位置儲存在Redis的啟動目錄。Redis每次同步資料到磁盤都會生成一個dump.rdb檔案,新的dump.rdb會覆寫舊的dump.rdb檔案。
在redis.conf的快照配置中,配置RDB儲存的政策。
在用戶端執行FLUSHDB或者FLUSHALL或者SHUTDOWN時,也會把快照中的資料儲存到dump.rdb,隻不過這種操作已經把資料清空了,儲存的也是空檔案,沒有意義。
save指令執行一個同步儲存操作,将目前 Redis 執行個體的所有資料快照(snapshot)以 RDB 檔案的形式儲存到硬碟。
由于save指令會阻塞所有用戶端,是以儲存資料庫的任務通常由 BGSAVE 指令異步地執行,而save作為儲存資料的最後手段來使用,當負責儲存資料的背景子程序不幸出現問題時使用。
通過腳本将Redis産生的dump.rdb檔案備份(cp dump.rdb dump_bak.rdb),每次啟動Redis前,把備份的dump.rdb檔案替換到Redis相應的目錄(在redis.conf中配的的dir目錄)下,Redis啟動時會加載dump.rdb檔案,并且把資料讀到記憶體中。
Redis預設開啟RDB持久化方式,适合大規模的資料恢複但它的資料一緻性和完整性較差。
AOF(Append Only File),Redis 預設不開啟。它的出現是為了彌補RDB的不足(資料的不一緻性),是以它采用日志的形式來記錄每個寫操作,并追加到檔案中。Redis 重新開機會根據日志檔案的内容将寫指令從前到後執行一次以完成資料的恢複工作。
Redis以日志的形式來記錄每個寫操作,将Redis執行過的所有寫指令記錄下來(讀操作不記錄),
隻許追加檔案但不可以改寫檔案,redis啟動之初會讀取該檔案重新建構資料,換言之,redis重新開機的話就根據日志檔案的内容将寫指令從前到後執行一次以完成資料的恢複工作。
AOF儲存的檔案是appendonly.aof檔案 ,位置儲存在Redis的啟動目錄。如果開啟了AOF,Redis每次記錄寫操作都會往appendonly.aof檔案追加新的日志内容。
在redis.conf的“APPEND ONLY MODE”配置子產品中,配置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 進行修複 。會把出現異常的部分往後所有寫記錄檔去掉。
AOF采用檔案追加方式,檔案會越來越大為避免出現此種情況,新增了重寫機制,當AOF檔案的大小超過所設定的門檻值時,Redis就會啟動AOF檔案的内容壓縮,隻保留可以恢複資料的最小指令集。
AOF檔案持續增長而過大時,會fork出一條新程序來将檔案重寫(也是先寫臨時檔案最後再rename),周遊新程序的記憶體中資料,每條記錄有一條的Set語句。重寫aof檔案的操作,并沒有讀取舊的aof檔案,而是将整個記憶體中的資料庫内容用指令的方式重寫了一個新的aof檔案,這點和快照有點類似。
Redis會記錄上次重寫時的AOF大小,預設配置是當AOF檔案大小是上次rewrite後大小的一倍且檔案大于64M時觸發。當然,也可以在配置檔案中進行配置。
Redis 需要手動開啟AOF持久化方式,AOF 的資料完整性比RDB高,但記錄内容多了,會影響資料恢複的效率。
關于Redis持久化的使用:若隻打算用Redis做緩存,可以關閉持久化。若打算使用Redis的持久化,建議RDB和AOF都開啟。其實RDB更适合做資料的備份,留一後手。AOF出問題了,還有RDB。
AOF與RDB模式可以同時啟用,這并不沖突。如果AOF是可用的,那Redis啟動時将自動加載AOF,這個檔案能夠提供更好的持久性保障。
Redis的事務允許在一次單獨的步驟中執行一組指令,并且能夠保證将一個事務中的所有指令序列化,然後按順序執行;在一個Redis事務中,Redis要麼執行其中的所有指令,要麼什麼都不執行。即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指令。
1、單獨的隔離操作:事務中的所有指令都會序列化、順序地執行。事務在執行過程中,不會被其它用戶端發來的指令請求所打斷,除非使用watch指令監控某些鍵。
2、不保證事務的原子性:redis同一個事務中如果一條指令執行失敗,其後的指令仍然可能會被執行,redis的事務沒有復原。Redis已經在系統内部進行功能簡化,這樣可以確定更快的運作速度,因為Redis不需要事務復原的能力。
Redis 釋出訂閱(pub/sub)是一種消息通信模式:發送者(pub)發送消息,訂閱者(sub)接收消息。Redis 用戶端可以訂閱任意數量的頻道。
圖一:消息訂閱者(client2 、 client5 和 client1)訂閱頻道 channel1:
圖二:消息釋出者釋出消息到頻道channel1,會被發送到三個訂閱者:
文法:subscribe channel [channel…]
功能:訂閱一個或多個頻道的資訊
傳回值:訂閱的消息
文法:publish chanel message
功能:将資訊發送到指定的頻道。
傳回值:數字。接收到消息訂閱者的數量。
文法:psubscribe pattern [pattern]
功能:訂閱一個或多個符合給定模式的頻道。模式以 * 作為通配符,例如:news.* 比對所有以 news. 開頭的頻道。
傳回值:訂閱的資訊。
主機資料更新後根據配置和政策,自動同步到從機的master/slave機制,Master以寫為主,Slave以讀為主。
1、配從(庫)不配主(庫)
2、配從(庫): slaveof 主庫IP 主庫端口
3、主寫從讀、讀寫分離
4、從連前後同
5、主斷從待命、從斷重新連
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
一台主機配多台從機,一台從機再配多台從機,進而實作了龐大的叢集架構。同時也減輕了一台主機的壓力,缺點是增加了伺服器間的延遲。
slave啟動成功連接配接到master後會發送一個sync指令;Master接到指令啟動背景的存盤程序,同時收集所有接收到的用于修改資料集指令,在背景程序執行完畢之後,master将傳送整個資料檔案到slave,以完成一次完全同步;slave服務在接收到資料庫檔案資料後,将其存盤并加載到記憶體中。
隻要是重新連接配接master,一次完全同步(全量複制)将被自動執行。
Master将新的所有收集到的修改指令依次傳給slave,完成同步。
從機上位的自動版。Redis提供了哨兵的指令,哨兵指令是一個獨立的程序,哨兵通過發送指令,來監控主從伺服器的運作狀态,如果檢測到master故障了根據投票數自動将某一個slave轉換master,然後通過消息訂閱模式通知其它slave,讓它們切換主機。然而,一個哨兵程序對Redis伺服器進行監控,可能會出現問題,為此,我們可以使用多哨兵進行監控。
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:
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
13、原主機恢複,:
1 檢視主從複制關系指令:info replication
2 設定主從關系指令:slaveof 主機ip 主機port
3 開啟哨兵模式指令:./redis-sentinel sentinel.conf
4 主從複制原則:開始是全量複制,之後是增量複制
5 哨兵模式三大任務:監控,提醒,自動故障遷移
Redis的主從複制最大的缺點就是延遲,主機負責寫,從機負責備份,這個過程有一定的延遲,當系統很繁忙的時候,延遲問題會更加嚴重,從機器數量的增加也會使這個問題更加嚴重。
使用Redis官方推薦的Jedis,在java應用中操作Redis。Jedis幾乎涵蓋了Redis的所有指令。操作Redis的指令在Jedis中以方法的形式出現。
作者:g0rez