1. 程式人生 > 實用技巧 >Linux自學筆記——redis

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生成的檔案;

image.png

3. 修改配置檔案;

image.png

4. 啟動服務,並檢視埠;

image.png

5. 用客戶端命令連線;

image.png

Redis:k/v

1. String(字串):

作用:用於管理redis字串值;

命令用法:

image.png

image.png

演示:

image.png

2. List(列表)

作用:redis列表是簡單的字串列表,按照插入順序,你可以新增一個元素導到列表的頭部(左邊)或者尾部(右邊);

一個列表最多可以包含2^32 – 1個元素。

相關命令:

image.png

LPUSH:將一個或多個值插入到列表頭部

RPUSH:在列表中新增一個或多個值;

LPOP:移出並獲取列表的第一個元素;

RPOP:移除並獲取列表最後一個元素;

LINDEX:通過索引獲取列表中的元素;

LSET:通過索引設定列表元素的值;

演示:

image.png

3. Set(集合)

作用:redis的set是string型別的無序集合。集合成員是唯一的,這就意味著集合中不能出現重複的資料。

Redis中集合是通過雜湊表實現的,所以新增,刪除,查詢的複雜度都是O(1);

基本命令:

image.png

SADD:向集合新增一個或多個成員;

SINTER:返回給定所有集合的交集;

SUNION:返回所有給定集合的並集

SPOP:移除並返回集合中的一個隨機元素;

SISMEMBER:判斷member元素是否是結合key的成員;

SMEMBERS:列出集合中的元素;

演示:

image.png

4. Hash(雜湊)

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

image.png

基本命令:

HSET:將hash表key中的欄位field的值設為value

HSETNX:只有在欄位field不存在時,設定雜湊表字段的值;

HGET:獲取儲存在雜湊表中指定欄位的值。

HKEYS:獲取所有雜湊表中的欄位;

HVALS:獲取雜湊表中的所有值;

HDEL:刪除一個或多個雜湊表字段;

演示:

image.png

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) 編輯配置檔案,啟用認證功能;

image.png

2) 重啟redis服務,並測試檢視;

image.png

2. 事務功能;

通過MULTI,EXEC,WATCH等命令實現事務功能;將一個或多個命令歸併為一個操作提醒伺服器按順序執行的機制;不支援回滾操作;

MULTI:啟動一個事務;

EXEC:執行事務;

一次性將事務中的所有操作執行完成後返回給客戶端;

WATCH:樂觀鎖;在EXEC命令執行之前,用於監視指定數量鍵;如果監視中的某任意資料被修改,則伺服器拒絕執行事務;

DISCARD:取消事務,放棄執行事務塊內的命令;

UNWATCH:取消WATCH命令對所有key的監控;

演示:

1) 開始一個事務,最後由EXEC觸發事務;

image.png

2) 用WATCH命令監視一個或多個key,然後啟動一個事務,在未執行EXEC之前,在另一個終端修改這個被監視的key;

image.png

在上面的EXEC執行之前,在另一個終端上執行如下命令;

image.png

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訂閱頻道;

image.png

2) 在另外一個客戶端向頻道釋出訊息;

image.png

3) 在客戶端1上會顯示如下的訊息;

image.png

5. Redis的持久化;

RDB和AOF

RDB:snapshot,二進位制格式;按事先定製的策略,週期性的將資料儲存至磁碟;資料檔案預設為dump.rdb;

客戶端也可顯式使用SAVE或BGSAVE命令啟動快照儲存機制;

SAVE:同步,在主執行緒中儲存快照;此時會阻塞所有客戶端請求;

BGSAVE:非同步,

在配置檔案中定義週期性的工作機制:

1) 指定在多長時間內,有多少次更新操作,就將資料同步到資料檔案,可以多個條件配合;

image.png

2) 指定儲存至本地資料庫時是否壓縮資料,預設為yes,redis採用LZF壓縮,如果為了節省CPU時間,可以關閉該選項,但會導致資料庫檔案變的巨大;

rdbcompression yes

image.png

3) 指定本地資料庫檔名,預設值為dump.rdb

dbfilename dump.rdb

image.png

4) 指定本地資料庫存放目錄;

image.png

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)的從庫;

image.png

Note:由於一開始兩臺主機上的iptables和selinux沒有關閉,導致資料不能同步過來;

從節點node2上檢視INFO資訊及日誌如下:

image.png

image.png

主節點檢視INFO資訊及日誌如下:

image.png

image.png

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:

image.png

從節點node2:

image.png

從節點node3:

image.png

2) 在主節點node1上配置啟用sentinel機制,編輯配置檔案/etc/redis-sentinel.conf檔案並啟動;

image.png

Note:要啟用daemonize yes選項,讓sentinel以守護程序的方式啟動;否則,會出現啟動問題;而將Protected-mode設為no,因為在後面的啟動連線操作中,不講保護模式取消,不能執行操作;

開啟服務,檢視26379埠;

image.png

3) 連線sentinel執行命令;

image.png

檢視從節點伺服器資訊;

image.png

4) 測試,讓主節點下線,再次檢視sentinel資訊;

讓node1下線:

image.png

檢視主節點變成了node2;

image.png


轉載於:https://blog.51cto.com/claude666/2094240