Redis,Remote Dictionary Server,是一個開源的使用ANSI C語言編寫、遵守BSD協定、支援網絡、可以基于記憶體亦可持久化的日志型、kv資料庫,并提供多種語言的API。
特點:
Redis支援資料的持久化,可以将記憶體中的資料儲存到磁盤上,重新開機的時候可以再次加載進行使用。
Redis不僅僅支援簡單的key-value類型的資料,同時還提供list,set,zset,hash等資料結構的存儲。
Redis支援資料的備份,即master-salve模式的資料備份。
功能:
資料結構伺服器:值可以是string,map,lsit,sets,sorted sets等類型。
單程序:CPU并非瓶頸;
持久化機制:snapshoting,AOF
Replication:主從,主(rw)從(read-only)
優勢:
性能極高;
豐富的資料類型;
原子;
豐富的特性;
指令行用戶端指令:
Redis-cli:
redis-cli [OPTIONS] [cmd [arg [arg ...]]]
常用選項:
-h <hostname>
-p <port>
-a <password>
示範1:
1. 配置yum源安裝redis
#yum install redis –y
2. 檢視安裝redis生成的檔案;

3. 修改配置檔案;
4. 啟動服務,并檢視端口;
5. 用用戶端指令連接配接;
Redis:k/v
1. String(字元串):
作用:用于管理redis字元串值;
指令用法:
示範:
2. List(清單)
作用:redis清單是簡單的字元串清單,按照插入順序,你可以添加一個元素導到清單的頭部(左邊)或者尾部(右邊);
一個清單最多可以包含2^32 – 1個元素。
相關指令:
LPUSH:将一個或多個值插入到清單頭部
RPUSH:在清單中添加一個或多個值;
LPOP:移出并擷取清單的第一個元素;
RPOP:移除并擷取清單最後一個元素;
LINDEX:通過索引擷取清單中的元素;
LSET:通過索引設定清單元素的值;
3. Set(集合)
作用:redis的set是string類型的無序集合。集合成員是唯一的,這就意味着集合中不能出現重複的資料。
Redis中集合是通過哈希表實作的,是以添加,删除,查找的複雜度都是O(1);
基本指令:
SADD:向集合添加一個或多個成員;
SINTER:傳回給定所有集合的交集;
SUNION:傳回所有給定集合的并集
SPOP:移除并傳回集合中的一個随機元素;
SISMEMBER:判斷member元素是否是結合key的成員;
SMEMBERS:列出集合中的元素;
示範:
4. Hash(哈希)
作用:redis hash是一個string類型的field和value的映射表,hash特别适合用于存儲對象。
基本指令:
HSET:将hash表key中的字段field的值設為value
HSETNX:隻有在字段field不存在時,設定哈希表字段的值;
HGET:擷取存儲在哈希表中指定字段的值。
HKEYS:擷取所有哈希表中的字段;
HVALS:擷取哈希表中的所有值;
HDEL:删除一個或多個哈希表字段;
5. Sorted set(有序集合)
作用:redis有序集合和集合一樣也是string類型元素的集合,且不允許重複的成員。不同的是每個元素都會關聯一個double類型的分數。Redis正是通過分數來為集合中的成員進行從小到大的排序。有序集合的成員是唯一的,但分數(score)确可以重複。
集合是通過哈希表實作的,是以添加,删除,查找的複雜度都是O(1)。集合中最大的成員數為2^32 – 1.
ZADD:向有序集合中添加一個或多個成員,或者更新已存在成員的分數
ZRANGE:通過索引區間傳回有序集合成指定區間内的成員;
ZCARD:擷取有序集合的成員數;
ZRANK:傳回有序集合中指定成員的索引。
配置和使用redis:
1. 配置和使用redis;
配置段:
基本配置項;
網絡配置項;
持久化相關的配置;
複制相關的配置;
安全相關的配置;
Limit相關的配置;
Slowlog相關的配置;
Includes
Advanced配置;
通用配置項:
Deamonize,supervised,loglevel,logfile,pidfile
Databases:
設定設局庫數量,預設為16個,每個資料庫的名字均為整數,從0開始編号,預設操作的資料庫為0;
切換資料庫的方法:SELECT <dbid>
網絡配置項:
Bind IP
Port PORT
Tcp-backlog:後援隊列長度;
Unixsocket:監聽的套接字檔案;
Timeout:連接配接的逾時時長;
安全相關的配置:
Repuirepass <PASSWORD>
在redis-cli接口中使用AUTH指令完成認證;或者在連接配接時使用-a指明密碼;
Rename-command <COMMAND> <NEW_CMND_NAME>
在AOF和Replication壞境中,不建議使用
認證實作方法:
1) Redis.conf
Requirepass PASSWORD
2) Redis-cli
AUTH PASSWORD
清空資料庫:
FLUSHDB:清空目前庫
FLUSHALL:清空所有庫
1) 編輯配置檔案,啟用認證功能;
2) 重新開機redis服務,并測試檢視;
2. 事務功能;
通過MULTI,EXEC,WATCH等指令實作事務功能;将一個或多個指令歸并為一個操作提醒伺服器按順序執行的機制;不支援復原操作;
MULTI:啟動一個事務;
EXEC:執行事務;
一次性将事務中的所有操作執行完成後傳回給用戶端;
WATCH:樂觀鎖;在EXEC指令執行之前,用于監視指定數量鍵;如果監視中的某任意資料被修改,則伺服器拒絕執行事務;
DISCARD:取消事務,放棄執行事務塊内的指令;
UNWATCH:取消WATCH指令對所有key的監控;
1) 開始一個事務,最後由EXEC觸發事務;
2) 用WATCH指令監視一個或多個key,然後啟動一個事務,在未執行EXEC之前,在另一個終端修改這個被監視的key;
在上面的EXEC執行之前,在另一個終端上執行如下指令;
3. Connection(連接配接)及Server相關的指令;
Connection指令:
AUTH:認證相關的指令;
ECHO:
PING:
QUIT:
SELECT:切換資料庫;
Server指令:
Redis伺服器指令主要是用于管理redis服務。
1) BGREWRITEOF:異步執行一個AOF(AppendOnlyFile)檔案重寫操作;
2) BGSAVE:在背景異步儲存目前資料庫的資料到磁盤;
3) CLIENT KILL [ip:port] [ID client-id]:關閉用戶端連接配接;
4) CLIENT LIST:擷取連接配接到伺服器的用戶端連接配接清單;
5) CLIENT GETNAME:擷取連接配接的名稱;
6) CLIENT PAUSE timeout:在指定的時間内終止運作來自用戶端的指令;
7) CLIENT SETNAME connection-name:設定目前連接配接的名稱;
8) CLUSTER SLOTS:擷取叢集節點的映射數組;
9) COMMAND:擷取redis指令詳情數組;
10) COMMAND COUNT:擷取redis指令總數;
11) COMMAND GETKEYS:擷取給指定指令的所有鍵;
12) TIME:傳回目前伺服器的時間;
13) COMMAND INFO command-name [command-name]:擷取指定redis指令描述的數組;
14) CONFIG GET parameter:擷取指定配置參數的值;
15) CONFIG REWRITE:對啟動redis伺服器時所指定的redis.conf配置檔案進行改寫;
16) CONFIG SET parameter value:修改redis配置參數,無須重新開機;
17) CONFIG RESETSTAT:重置INFO指令中某些統計資料;
18) DBSIZE:傳回目前資料庫的key的數量;
19) DEBUG OBJECT key:擷取key的調試資訊;
20) DEBUG SEGFAULT:讓redis服務崩潰;
21) FLUSHALL:删除所有資料庫的所有key;
22) FLUSHDB:删除目前資料庫的所有key;
23) INFO [section]:擷取redis伺服器的各種資訊和統計數值;
24) LASTSAVE:傳回最近一次redis成功将資料儲存到磁盤上的時間,以UNIX時間戳格式表示;
25) MONITOR:實時列印出redis伺服器接收到的指令,調試用;
26) ROLE:傳回主從示例所屬的角色;
27) SAVE:異步儲存資料到硬碟;
28) SHUTDOWN [NOSAVE][SAVE]:異步儲存資料到硬碟,并關閉伺服器;
29) SLAVEOF host port:将目前伺服器轉變為指定伺服器的從屬伺服器;
30) SLOWLOG subcommand [argument]:管理redis的慢查詢日志;
31) SYNC:用于複制功能(replication)的内部指令;
4. 釋出與訂閱(publish/subscribe)
頻道:消息隊列;
SUBSCRIBE:訂閱一個或多個隊列;
PUBLISH:向頻道釋出消息;
UNSUBSCRIBE:退訂此前訂閱的頻道;
PSUBSCRIBE:模式訂閱;
1) 在用戶端1訂閱頻道;
2) 在另外一個用戶端向頻道釋出消息;
3) 在用戶端1上會顯示如下的消息;
5. Redis的持久化;
RDB和AOF
RDB:snapshot,二進制格式;按事先定制的政策,周期性的将資料儲存至磁盤;資料檔案預設為dump.rdb;
用戶端也可顯式使用SAVE或BGSAVE指令啟動快照儲存機制;
SAVE:同步,在主線程中儲存快照;此時會阻塞所有用戶端請求;
BGSAVE:異步,
在配置檔案中定義周期性的工作機制:
1) 指定在多長時間内,有多少次更新操作,就将資料同步到資料檔案,可以多個條件配合;
2) 指定存儲至本地資料庫時是否壓縮資料,預設為yes,redis采用LZF壓縮,如果為了節省CPU時間,可以關閉該選項,但會導緻資料庫檔案變的巨大;
rdbcompression yes
3) 指定本地資料庫檔案名,預設值為dump.rdb
dbfilename dump.rdb
4) 指定本地資料庫存放目錄;
AOF:Append Only File
記錄每一次寫操作至指定的檔案尾部都實作持久化;當redis重新開機時,可通過重新執行檔案中的指令在記憶體重建資料庫;
BGREWRITEAOF:AOF檔案重寫;不會讀取正在使用的AOF檔案,而通過将記憶體中的資料以指令方式儲存到臨時檔案中,完成之後替換原來的AOF檔案;
AOF重寫過程:
1) Redis主程序通過fork建立子程序;
2) 子程序根據redis記憶體中的資料建立資料庫重建指令序列于臨時檔案中;
3) 父程序繼承client的請求,并會把這些請求中的寫操作繼續追加至原來的AOF檔案;額外地,這些新的寫請求還會被放置于一個緩沖隊列中;
4) 子程序重寫完成,會通知父程序;父程序把緩沖中的指令寫到臨時檔案中
5) 父程序用臨時檔案替換老的aof檔案;
相關參數:
1) appendonly no:指定是否在每次更新操作後進行日志記錄,redis在預設情況下是異步的把資料寫入磁盤,如果不開啟,可能會在斷點時導緻一段時間内的資料丢失。因為redis本身同步資料檔案是按上面save條件來同步的,是以有的資料會在一段時間内隻存在于記憶體中。預設為no;
2) appendfilename appendonly.aof:指定更新日志檔案名,預設為appendonly.aof;
3) appendfsync everysec:指定更新日志條件,共有3個可選值;
no:表示等作業系統進行資料緩存同步到磁盤(快)
always:表示每次更新操作後手動調用fsync()将資料寫到磁盤(慢,安全)
everysync:表示每秒同步一次(折中,預設值)
4) no-appendfsync-on-rewrite no
5) auto-aof-rewrite-percentage 100:表示現有的aof檔案是上次檔案大小的2倍,即改變已達到100%,就再次重寫;
6) auto-aof-rewrite-min-size 64mb:表示重寫的大小至少達到64M之後才開始重寫;
note:持久本身不能取代備份;還應該指定備份政策,對redis資料庫定期進行備份;
BDF與AOF同時啟用:
1) BGSAVE和BGREWRITEAOF不會同時執行;
2) 在redis伺服器啟動用于資料恢複時,會優先選用AOF;
6. Redis的主從複制;
1) 特點
一個master可以有多個slave;支援鍊式複制;master以非阻塞方式同步資料至slave;
2) Slave節點操作;
> SLAVAOF MASTER_IP MASTER_PORT
Note:如果master使用requirepass開啟了認證功能,從伺服器要使用masterauth <PASSWORD>來連入服務請求使用此密碼認證;
如果目前伺服器已經是個主伺服器的從屬伺服器,那麼執行SLAVEOF host port将使目前伺服器停止對舊主伺服器的同步,丢棄舊資料集,轉而開始對新主伺服器進行同步;
另外,對一個從屬伺服器執行指令SLAVEOF NO ONE将使得這個從屬伺服器關閉複制功能,并從從屬伺服器轉變回主伺服器,原來同步所得的資料集不會丢棄;
利用SLAVEOF NO ONE不會丢棄同步所得到的資料集,這個特性,可以在主伺服器失敗的時候,将從屬伺服器用作新的主伺服器,進而實作無間斷運作;
1) 準備一個新的節點node2(192.168.19.145),安裝redis,将其配置為node1(192.168.19.140)的從庫;
Note:由于一開始兩台主機上的iptables和selinux沒有關閉,導緻資料不能同步過來;
從節點node2上檢視INFO資訊及日志如下:
主節點檢視INFO資訊及日志如下:
7. Redis的sentinel機制
用于管理多個redis服務實作HA;
監控、通知、自動故障轉移;
流言協定,投票協定;
程式:
Redis-sentinel /path/to/file.conf
Redis-server /path/to/file.conf --sentinel
1) 伺服器自身初始化,運作redis-server中專用于sentinel功能的代碼;
2) 初始化sentinel狀态,根據給定的配置檔案,初始化監控的master伺服器清單;
3) 建立連向master的連接配接;
專用配置檔案:/etc/redis-sentinel.conf
1) # sentinel monitor <master-name> <ip> <redis-port> <quorum>
連接配接的主節點,可以有多行,quorum表示法定票數,建議sentinel節點為奇數個;
隻需要指明主節點即可,從節點會通過主節點自動擷取;
sentinel monitor mymaster 127.0.0.1 6379 2
2) sentinel down-after-milliseconds <master-name> <milliseconds>
判斷某主節點不線上的逾時時長;
sentinel down-after-milliseconds mymaster 30000
3) sentinel parallel-syncs <master-name> <numslaves>
執行故障轉移時,允許最多有多少個從伺服器可以向主伺服器發起連接配接請求;
entinel parallel-syncs mymaster 1
4) sentinel failover-timeout <master-name> <milliseconds>
故障轉移的逾時時間,即當主伺服器出現故障時,提升新的伺服器為主伺服器的逾時時間;
sentinel failover-timeout mymaster 180000
5) sentinel auth-pass <master-name> <password>
連接配接主節點的認證密碼
主管下線,客觀下線:
主管下線:一個sentinel示例判斷出某節點下線;
客觀下線:多個sentinel節點協商後判斷出某節點下線;
專用指令:
SENTINEL masters
SENTINEL slaves <master name>
SENTINEL get-master-addr-by-name <master name>
SENTINEL reset
SENTINEL failover <master name>
實驗環境:
Node1節點為master節點,也為sentinel節點,位址:192.168.19.141;node2:192.168.19.145和node3:192.168.19.134為從節點;
1) 準備操作環境;
主節點node1:
從節點node2:
從節點node3:
2) 在主節點node1上配置啟用sentinel機制,編輯配置檔案/etc/redis-sentinel.conf檔案并啟動;
Note:要啟用daemonize yes選項,讓sentinel以守護程序的方式啟動;否則,會出現啟動問題;而将Protected-mode設為no,因為在後面的啟動連接配接操作中,不講保護模式取消,不能執行操作;
開啟服務,檢視26379端口;
3) 連接配接sentinel執行指令;
檢視從節點伺服器資訊;
4) 測試,讓主節點下線,再次檢視sentinel資訊;
讓node1下線:
檢視主節點變成了node2;