天天看點

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

Linux自學筆記——redis

3.      修改配置檔案;

Linux自學筆記——redis

4.      啟動服務,并檢視端口;

Linux自學筆記——redis

5.      用用戶端指令連接配接;

Linux自學筆記——redis

Redis:k/v

1.      String(字元串):

作用:用于管理redis字元串值;

指令用法:

Linux自學筆記——redis
Linux自學筆記——redis

示範:

Linux自學筆記——redis

2.      List(清單)

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

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

相關指令:

Linux自學筆記——redis

LPUSH:将一個或多個值插入到清單頭部

RPUSH:在清單中添加一個或多個值;

LPOP:移出并擷取清單的第一個元素;

RPOP:移除并擷取清單最後一個元素;

LINDEX:通過索引擷取清單中的元素;

LSET:通過索引設定清單元素的值;

Linux自學筆記——redis

3.      Set(集合)

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

Redis中集合是通過哈希表實作的,是以添加,删除,查找的複雜度都是O(1);

      基本指令:

Linux自學筆記——redis

       SADD:向集合添加一個或多個成員;

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

       SUNION:傳回所有給定集合的并集

       SPOP:移除并傳回集合中的一個随機元素;

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

       SMEMBERS:列出集合中的元素;

       示範:

Linux自學筆記——redis

4.      Hash(哈希)

作用:redis hash是一個string類型的field和value的映射表,hash特别适合用于存儲對象。

Linux自學筆記——redis

基本指令:

HSET:将hash表key中的字段field的值設為value

HSETNX:隻有在字段field不存在時,設定哈希表字段的值;

HGET:擷取存儲在哈希表中指定字段的值。

HKEYS:擷取所有哈希表中的字段;

HVALS:擷取哈希表中的所有值;

HDEL:删除一個或多個哈希表字段;

Linux自學筆記——redis

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

Linux自學筆記——redis

2)      重新開機redis服務,并測試檢視;

Linux自學筆記——redis

2.      事務功能;

通過MULTI,EXEC,WATCH等指令實作事務功能;将一個或多個指令歸并為一個操作提醒伺服器按順序執行的機制;不支援復原操作;

MULTI:啟動一個事務;

EXEC:執行事務;

一次性将事務中的所有操作執行完成後傳回給用戶端;

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

DISCARD:取消事務,放棄執行事務塊内的指令;

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

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

Linux自學筆記——redis

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

Linux自學筆記——redis

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

Linux自學筆記——redis

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

Linux自學筆記——redis

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

Linux自學筆記——redis

3)      在用戶端1上會顯示如下的消息;

Linux自學筆記——redis

5.      Redis的持久化;

RDB和AOF

RDB:snapshot,二進制格式;按事先定制的政策,周期性的将資料儲存至磁盤;資料檔案預設為dump.rdb;

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

        SAVE:同步,在主線程中儲存快照;此時會阻塞所有用戶端請求;

BGSAVE:異步,

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

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

Linux自學筆記——redis

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

rdbcompression   yes

Linux自學筆記——redis

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

dbfilename   dump.rdb

Linux自學筆記——redis

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

Linux自學筆記——redis

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

Linux自學筆記——redis

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

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

Linux自學筆記——redis
Linux自學筆記——redis

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

Linux自學筆記——redis
Linux自學筆記——redis

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:

Linux自學筆記——redis

從節點node2:

Linux自學筆記——redis

從節點node3:

Linux自學筆記——redis

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

Linux自學筆記——redis

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

開啟服務,檢視26379端口;

Linux自學筆記——redis

3)      連接配接sentinel執行指令;

Linux自學筆記——redis

檢視從節點伺服器資訊;

Linux自學筆記——redis

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

讓node1下線:

Linux自學筆記——redis

檢視主節點變成了node2;

Linux自學筆記——redis

繼續閱讀