Linux自學筆記——redis
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;
轉載於:https://blog.51cto.com/claude666/2094240