文章建立一個統一的認識就是Redis的版本是3.2.8
1:BGREWRITEAOF(bgrewriteaof)
執行一個 AOF文件 重寫操作。重寫會創建一個當前 AOF 文件的體積優化版本。
即使 BGREWRITEAOF 執行失敗,也不會有任何數據丟失,因為舊的 AOF 文件在 BGREWRITEAOF 成功之前不會被修改。
重寫操作只會在沒有其他持久化工作在后台執行時被觸發,也就是說:
如果 Redis 的子進程正在執行快照的保存工作,那么 AOF 重寫的操作會被預定(scheduled),等到保存工作完成之后再執行 AOF 重寫。在這種情況下, BGREWRITEAOF 的返回值仍然是 OK ,但還會加上一條額外的信息,說明 BGREWRITEAOF 要等到保存操作完成之后才能執行。在 Redis 2.6 或以上的版本,可以使用 INFO 命令查看 BGREWRITEAOF 是否被預定。
如果已經有別的 AOF 文件重寫在執行,那么 BGREWRITEAOF 返回一個錯誤,並且這個新的 BGREWRITEAOF 請求也不會被預定到下次執行。
從 Redis 2.4 開始, AOF 重寫由 Redis 自行觸發, BGREWRITEAOF 僅僅用於手動觸發重寫操作。所以說已經並不適用於3.2.8,不在詳述。
2:BGSAVE(bgsave)
在后台異步(Asynchronously)保存當前數據庫的數據到磁盤。
BGSAVE 命令執行之后立即返回 OK ,然后 Redis fork 出一個新子進程,原來的 Redis 進程(父進程)繼續處理客戶端請求,而子進程則負責將數據保存到磁盤,然后退出。
客戶端可以通過 LASTSAVE 命令查看相關信息,判斷 BGSAVE 命令是否執行成功。
首先進入6739的Redis:
127.0.0.1:6379[1]> config get dir 1) "dir" 2) "/home/redis/data"
看一下現在的dump.rbd文件
[root@localhost data]# ls -ll total 4 -rw-r--r-- 1 root root 108 May 2 16:32 dump.rdb
看一下日期,執行bgsave並且查看dump.rbd文件:
127.0.0.1:6379[1]> bgsave Background saving started \[root@localhost data]# ls -ll total 4 -rw-r--r-- 1 root root 108 May 9 10:18 dump.rdb
看一下,備份時間已經修改為最新我們執行備份的時間了。
下面有兩個命令和BGSAVE息息相關,SAVE|LASTSAVE
SAVE
SAVE 命令執行一個同步保存操作,將當前 Redis 實例的所有數據快照(snapshot)以 RDB 文件的形式保存到硬盤。
一般來說,在生產環境很少執行 SAVE 操作,因為它會阻塞所有客戶端,保存數據庫的任務通常由 BGSAVE 命令異步地執行。然而,如果負責保存數據的后台子進程不幸出現問題時, SAVE 可以作為保存數據的最后手段來使用。
LASTSAVE
返回最近一次 Redis 成功將數據保存到磁盤上的時間,以 UNIX 時間戳格式表示。
127.0.0.1:6379[1]> lastsave (integer) 1494296312
我們把時間戳轉換以后就是1494296312=2017/5/9 10:18:32
3:關於CLIENT的幾個系統命令
CLIENT GETNAME,返回 CLIENT SETNAME 命令為連接設置的名字。另外還有CLIENT LIST和CLIENT KILL
因為新創建的連接默認是沒有名字的, 對於沒有名字的連接, CLIENT GETNAME 返回空白回復。
為當前連接分配一個名字。
這個名字會顯示在 CLIENT LIST 命令的結果中, 用於識別當前正在與服務器進行連接的客戶端。
舉個例子, 在使用 Redis 構建隊列(queue)時, 可以根據連接負責的任務(role), 為信息生產者(producer)和信息消費者(consumer)分別設置不同的名字。
名字使用 Redis 的字符串類型來保存, 最大可以占用 512 MB 。 另外, 為了避免和 CLIENT LIST 命令的輸出格式發生沖突, 名字里不允許使用空格。
要移除一個連接的名字, 可以將連接的名字設為空字符串 "" 。
使用 CLIENT GETNAME 命令可以取出連接的名字。
新創建的連接默認是沒有名字的。
在 Redis 應用程序發生連接泄漏時,為連接設置名字是一種很好的 debug 手段。下面給個例子
127.0.0.1:6379[1]> client getname (nil) 127.0.0.1:6379[1]> client setname mxqconnect1 OK 127.0.0.1:6379[1]> client getname "mxqconnect1" 127.0.0.1:6379[1]> client list id=2350 addr=172.16.16.34:13200 fd=7 name=sentinel-51fc16eb-cmd age=583234 idle=0 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=0 oll=0 omem=0 events=r cmd=publish id=2351 addr=172.16.16.34:13201 fd=9 name=sentinel-51fc16eb-pubsub age=583234 idle=0 flags=N db=0 sub=1 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=0 oll=0 omem=0 events=r cmd=subscribe id=2352 addr=172.16.16.35:39670 fd=10 name= age=583233 idle=0 flags=S db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=0 oll=0 omem=0 events=r cmd=replconf id=2362 addr=127.0.0.1:34498 fd=12 name=mxqconnect1 age=150 idle=0 flags=N db=1 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=32768 obl=0 oll=0 omem=0 events=r cmd=client id=2353 addr=172.16.16.35:39672 fd=6 name=sentinel-d7303108-pubsub age=583232 idle=0 flags=N db=0 sub=1 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=0 oll=0 omem=0 events=r cmd=subscribe id=2354 addr=172.16.16.35:39671 fd=8 name=sentinel-d7303108-cmd age=583232 idle=0 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=0 oll=0 omem=0 events=r cmd=ping id=2355 addr=172.16.16.35:39687 fd=11 name= age=583223 idle=0 flags=S db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=0 oll=0 omem=0 events=r cmd=replconf 127.0.0.1:6379[1]>
關閉自身的鏈接:
127.0.0.1:6379[1]> CLIENT KILL 127.0.0.1:34498 OK 127.0.0.1:6379[1]> 127.0.0.1:6379[1]> GET NAME (error) NOAUTH Authentication required.
我們知道Redis 使用單線程設計,所以當 Redis 正在執行命令的時候,不會有客戶端被斷開連接。我們斷開本身的鏈接后,在執行下一次命令,就會出現一個錯誤,告知我們已經斷開了連接。
下面看一下CLIENT LIST的各個域的含義,也是Redis官網給出的解釋:
以下是域的含義: addr : 客戶端的地址和端口 fd : 套接字所使用的文件描述符 age : 以秒計算的已連接時長 idle : 以秒計算的空閑時長 flags : 客戶端 flag (見下文) db : 該客戶端正在使用的數據庫 ID sub : 已訂閱頻道的數量 psub : 已訂閱模式的數量 multi : 在事務中被執行的命令數量 qbuf : 查詢緩存的長度( 0 表示沒有查詢在等待) qbuf-free : 查詢緩存的剩余空間( 0 表示沒有剩余空間) obl : 輸出緩存的長度 oll : 輸出列表的長度(當輸出緩存沒有剩余空間時,回復被入隊到這個隊列里) omem : 輸出緩存的內存占用量 events : 文件描述符事件(見下文) cmd : 最近一次執行的命令 客戶端 flag 可以由以下部分組成: O : 客戶端是 MONITOR 模式下的附屬節點(slave) S : 客戶端是一般模式下(normal)的附屬節點 M : 客戶端是主節點(master) x : 客戶端正在執行事務 b : 客戶端正在等待阻塞事件 i : 客戶端正在等待 VM I/O 操作(已廢棄) d : 一個受監視(watched)的鍵已被修改, EXEC 命令將失敗 c : 在將回復完整地寫出之后,關閉鏈接 u : 客戶端未被阻塞(unblocked) A : 盡可能快地關閉連接 N : 未設置任何 flag 文件描述符事件可以是: r : 客戶端套接字(在事件 loop 中)是可讀的(readable) w : 客戶端套接字(在事件 loop 中)是可寫的(writeable)
4:CONFIG SET|GET|REWRITE
CONFIG SET 命令可以動態地調整 Redis 服務器的配置(configuration)而無須重啟。
你可以使用它修改配置參數,或者改變 Redis 的持久化(Persistence)方式。
CONFIG SET 可以修改的配置參數可以使用命令 CONFIG GET * 來列出,所有被 CONFIG SET 修改的配置參數都會立即生
CONFIG GET 命令用於取得運行中的 Redis 服務器的配置參數(configuration parameters),在 Redis 2.4 版本中, 有部分參數沒有辦法用 CONFIG GET 訪問,但是在最新的 Redis 2.6 版本中,所有配置參數都已經可以用 CONFIG GET 訪問了。
CONFIG GET 接受單個參數 parameter 作為搜索關鍵字,查找所有匹配的配置參數,其中參數和值以“鍵-值對”(key-value pairs)的方式排列。
例如我們可以修改一下交互時間:
127.0.0.1:6379[1]> clinet get name (error) ERR unknown command 'clinet' 127.0.0.1:6379[1]> client getname (error) NOAUTH Authentication required. 127.0.0.1:6379[1]> AUTH maxiangqianreids (error) ERR invalid password 127.0.0.1:6379[1]> AUTH maxiangqianredis OK 127.0.0.1:6379[1]> config get timeout 1) "timeout" 2) "300" 127.0.0.1:6379[1]> config set timeout 3000 OK 127.0.0.1:6379[1]> config get timeout 1) "timeout" 2) "3000"
CONFIG REWRITE 命令對啟動 Redis 服務器時所指定的 redis.conf 文件進行改寫: 因為 CONFIG SET 命令可以對服務器的當前配置進行修改, 而修改后的配置可能和 redis.conf 文件中所描述的配置不一樣, CONFIG REWRITE 的作用就是通過盡可能少的修改, 將服務器當前所使用的配置記錄到 redis.conf 文件中。
重寫會以非常保守的方式進行:
原有 redis.conf 文件的整體結構和注釋會被盡可能地保留。
如果一個選項已經存在於原有 redis.conf 文件中 , 那么對該選項的重寫會在選項原本所在的位置(行號)上進行。
如果一個選項不存在於原有 redis.conf 文件中, 並且該選項被設置為默認值, 那么重寫程序不會將這個選項添加到重寫后的 redis.conf 文件中。
如果一個選項不存在於原有 redis.conf 文件中, 並且該選項被設置為非默認值, 那么這個選項將被添加到重寫后的 redis.conf 文件的末尾。
未使用的行會被留白。 比如說, 如果你在原有 redis.conf 文件上設置了數個關於 save 選項的參數, 但現在你將這些 save 參數的一個或全部都關閉了, 那么這些不再使用的參數原本所在的行就會變成空白的。
即使啟動服務器時所指定的 redis.conf 文件已經不再存在, CONFIG REWRITE 命令也可以重新構建並生成出一個新的 redis.conf 文件。
另一方面, 如果啟動服務器時沒有載入 redis.conf 文件, 那么執行 CONFIG REWRITE 命令將引發一個錯誤。
我們執行config rewrite,然后查看配置文件
[root@localhost redis]# cat redis.conf #bind 127.0.0.1 # 綁定的主機地址 port 6379 timeout 3000
timeout已經被修改為3000了。
還有一個CONFIG 命令CONFIG RESETSTAT
重置 INFO 命令中的某些統計數據,包括:
Keyspace hits (鍵空間命中次數)
Keyspace misses (鍵空間不命中次數)
Number of commands processed (執行命令的次數)
Number of connections received (連接服務器的次數)
Number of expired keys (過期key的數量)
Number of rejected connections (被拒絕的連接數量)
Latest fork(2) time(最后執行 fork(2) 的時間)
The aof_delayed_fsync counter(aof_delayed_fsync 計數器的值)
5:DBSIZE
返回當前數據庫的 key 的數量
127.0.0.1:6379> DBSIZE (integer) 4 127.0.0.1:6379> INFO KEYSPACE # Keyspace db0:keys=4,expires=0,avg_ttl=0 db1:keys=1,expires=0,avg_ttl=0
6:DEBUG OBJECT key
DEBUG OBJECT 是一個調試命令,它不應被客戶端所使用。
DEBUG SEGFAULT
執行一個不合法的內存訪問從而讓 Redis 崩潰,僅在開發時用於 BUG 模擬。
7:FLUSHALL:清空整個 Redis 服務器的數據(刪除所有數據庫的所有 key )。此命令從不失敗。
FLUSHDB:清空當前數據庫中的所有 key。此命令從不失敗。
8:INFO:系統相關信息,下面看一下相關的例子:
127.0.0.1:6379> INFO KEYSPACE # Keyspace db0:keys=4,expires=0,avg_ttl=0 db1:keys=1,expires=0,avg_ttl=0 127.0.0.1:6379> info replication # Replication role:master connected_slaves:2 slave0:ip=172.16.16.35,port=6380,state=online,offset=131088123,lag=0 slave1:ip=172.16.16.35,port=6379,state=online,offset=131088123,lag=1 master_repl_offset:131088123 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:130039548 repl_backlog_histlen:1048576 127.0.0.1:6379> info Persistence # Persistence loading:0 rdb_changes_since_last_save:2 rdb_bgsave_in_progress:0 rdb_last_save_time:1494299732 rdb_last_bgsave_status:ok rdb_last_bgsave_time_sec:0 rdb_current_bgsave_time_sec:-1 aof_enabled:0 aof_rewrite_in_progress:0 aof_rewrite_scheduled:0 aof_last_rewrite_time_sec:-1 aof_current_rewrite_time_sec:-1 aof_last_bgrewrite_status:ok aof_last_write_status:ok
我們可以通過INFO 后帶域的信息查看相關復制,KEY值和相關的持久化信息。
9:MONITOR相關信息
127.0.0.1:6379> MONITOR OK 1494300607.699131 [0 172.16.16.34:13200] "PING" 1494300607.783224 [0 172.16.16.34:13200] "PUBLISH" "__sentinel__:hello" "172.16.16.34,26379,51fc16eb8e0bf950a3f3ada8c1eb9d70145c9ffb,2,localhost,172.16.16.34,6379,2" 1494300608.585669 [0 172.16.16.35:39671] "PING" 1494300608.676104 [0 172.16.16.35:39671] "PUBLISH" "__sentinel__:hello" "172.16.16.35,26379,d73031089231fd5f46bdda23d8a448cfe64ec8fd,2,localhost,172.16.16.34,6379,2" 1494300608.724879 [0 172.16.16.34:13200] "PING" 1494300609.640910 [0 172.16.16.35:39671] "PING" 1494300609.746056 [0 172.16.16.34:13200] "PING" 1494300609.836231 [0 172.16.16.34:13200] "PUBLISH" "__sentinel__:hello" "172.16.16.34,26379,51fc16eb8e0bf950a3f3ada8c1eb9d70145c9ffb,2,localhost,172.16.16.34,6379,2" 1494300610.713244 [0 172.16.16.35:39671] "PING" 1494300610.752325 [0 172.16.16.34:13200] "PING"
主要就是監控Redis的實時鏈接信息,這個功能感覺也是很好用。當大量新鏈接出問題時候我們可以看到連接的來源地址和主要作用。
10:SLAVEOF host port
SLAVEOF 命令用於在 Redis 運行時動態地修改復制(replication)功能的行為。
通過執行 SLAVEOF host port 命令,可以將當前服務器轉變為指定服務器的從屬服務器(slave server)。
如果當前服務器已經是某個主服務器(master server)的從屬服務器,那么執行 SLAVEOF host port 將使當前服務器停止對舊主服務器的同步,丟棄舊數據集,轉而開始對新主服務器進行同步。
另外,對一個從屬服務器執行命令 SLAVEOF NO ONE 將使得這個從屬服務器關閉復制功能,並從從屬服務器轉變回主服務器,原來同步所得的數據集不會被丟棄。
利用『 SLAVEOF NO ONE 不會丟棄同步所得數據集』這個特性,可以在主服務器失敗的時候,將從屬服務器用作新的主服務器,從而實現無間斷運行。
11:SHUTDOWN 命令執行以下操作:
停止所有客戶端
如果有至少一個保存點在等待,執行 SAVE 命令
如果 AOF 選項被打開,更新 AOF 文件
關閉 redis 服務器(server)
如果持久化被打開的話, SHUTDOWN 命令會保證服務器正常關閉而不丟失任何數據。
另一方面,假如只是單純地執行 SAVE 命令,然后再執行 QUIT 命令,則沒有這一保證 —— 因為在執行 SAVE 之后、執行 QUIT 之前的這段時間中間,其他客戶端可能正在和服務器進行通訊,這時如果執行 QUIT 就會造成數據丟失。
SAVE 和 NOSAVE 修飾符
通過使用可選的修飾符,可以修改 SHUTDOWN 命令的表現。比如說:
執行 SHUTDOWN SAVE 會強制讓數據庫執行保存操作,即使沒有設定(configure)保存點
執行 SHUTDOWN NOSAVE 會阻止數據庫執行保存操作,即使已經設定有一個或多個保存點(你可以將這一用法看作是強制停止服務器的一個假想的 ABORT 命令)
本文是自己測試學習結果,如果你感覺此文對你有幫助,請幫忙點一下推薦。這將鼓勵我繼續寫下去。