Redis 的鍵、HyperLogLog 、腳本、連接、服務器命令

Redis 的鍵命令、HyperLogLog 命令、腳本命令、連接命令、服務器命令

Redis 的鍵命令

Redis 的鍵命令主要用於管理 Redis 的鍵,如刪除鍵、查詢鍵、修改鍵及設置某個鍵等。

1. EXISTS 命令:判斷鍵是否存在

2. KEYS 命令:查找鍵

KEYS 命令用於按照指定的模式(pattern)查找所有的 key。參數 pattern 類似於正則表達式。

● KEYS*:表示匹配查找數據庫中的所有 key。

● KEYS r?dis:表示匹配 radis、redis、rxdis 等。

● KEYS r*dis:表示匹配 rdis、redis、reeedis 等。

● KEYS r[ae]dis:表示匹配 radis 和 redis,但是不會匹配 ridis。

遇到特殊符號需要使用「\\」隔開(轉義)。

3. OBJECT 命令:查看鍵的對象

OBJECT 命令用於從內部查看給定 key 的 Redis 對象。該命令通常用在除錯或者為了節省空間而對 key 使用特殊編碼的情況下。如果要用 Redis 來實現與緩存相關的功能,則可以使用 OBJECT 命令來決定是否清除 key。

OBJECT 命令有如下子命令:

● OBJECT REFCOUNT key 用於返回給定 key 引用所存儲的值的次數,多用於除錯。

● OBJECT ENCODING key 用於返回給定 key 所存儲的值所使用的底層數據結構。

● OBJECT IDLETIME key 用於返回給定 key 自存儲以來的空閒時間,以秒為單位。

Redis 對象具有多種編碼格式。

● 針對字符串可以被編碼為 raw(一個字符串)或 int(Redis 會將字符串表示的 64 位有符號整數編碼為整數來存儲,以此來節約內存)。

● 針對列表可以被編碼為 ziplist 或 linkedlist。ziplist 是壓縮列表,用來表示佔用空間較小的列表。

● 針對集合可以被編碼為 intset 或 hashtable。intset 是隻存儲數字的小集合的特殊表示。

● 針對哈希表可以被編碼為 zipmap 或 hashtable。zipmap 是小哈希表的特殊表示。

● 針對有序集合可以被編碼為 ziplist 或 skiplist。ziplist 主要用於表示小的有序集合;而 skiplist 可以表示任意大小的有序集合。

返回值:OBJECT 命令的子命令 REFCOUNT 和 IDLETIME 會返回數字,而 ENCODING 會返回相對應的編碼類型。

4. RANDOMKEY 命令:隨機返回一個鍵

<code>127.0.0.1:6379> exists student:name
(integer) 1
127.0.0.1:6379> keys *
1) "bookorder"
2) "book"
3) "student:id"
4) "str1"
5) "student:age"
6) "video:10010"
7) "student:name"
8) "student:home"
127.0.0.1:6379> object encoding video:10010
"raw"/<code>

5. RENAME 命令:修改鍵的名稱(如果 newkey 已經存在,則 RENAME 命令執行後將會覆蓋舊值。)

6. RENAMENX 命令:修改鍵的名稱 (當且僅當 newkey 不存在時才能修改)

<code>127.0.0.1:6379> rename str1 str
OK/<code>

7. DUMP 命令:序列化鍵

8.RESTORE 命令:對序列化值進行反序列化

使用 DUMP 命令序列化生成的值具有以下特點:

● 這個值具有 64 位的校驗和,用於檢測錯誤。RESTORE 命令在進行反序列化之前,會先檢查校驗和。

● 這個值的編碼格式和 RDB 文件的編碼格式保持一致。

● RDB 版本會被編碼在序列化值中。如果 Redis 的版本不同,那麼這個 RDB 文件會存在不兼容,Redis 也就無法對這個值進行反序列化。

● 這個序列化的值中沒有生存時間信息。

<code>127.0.0.1:6379> dump str
"\\\\x00\\\\xc0{\\\\x06\\\\x00\\\\xde\\\\x0f;a\\\\xf5/[*"/<code>

9. PTTL 命令:獲取鍵的生存時間(毫秒)

10. TTL 命令:獲取鍵的生存時間(秒)

11. EXPIRE 命令:設置鍵的生存時間(秒)

12. PEXPIRE 命令:設置鍵的生存時間(毫秒)

13. EXPIREAT 命令:設置鍵的生存 UNIX 時間戳(秒)

14. PEXPIREAT:設置鍵的生存 UNIX 時間戳(毫秒)

<code>127.0.0.1:6379> expire str 10
(integer) 1
127.0.0.1:6379> ttl str
(integer) 5/<code>

15. MIGRATE 命令:轉移鍵值對到遠程目標數據庫

<code>migrate host port key destination-db timeout [copy] [replace]/<code>

MIGRATE 命令是原子操作,它在執行的時候會阻塞進行轉移的兩個數據庫,直到轉移成功,或轉移失敗,又或者出現等待超時。

MIGRATE 命令的實現原理為:在當前數據庫(源數據庫)中,對給定的 key 執行 DUMP 命令,將它序列化後,轉移到目標數據庫中,目標數據庫再使用 RESTORE 命令對數據進行反序列化,將反序列化後的結果保存到數據庫中;源數據庫就好像目標數據庫的客戶端一樣,只要遇到 RESTORE 命令返回 OK,就會調用 DEL 命令刪除自己數據庫中的 key。

● 參數 timeout:用於設置當前數據庫與目標數據庫進行轉移時的最大時間間隔,單位為毫秒。當轉移的時間超過了 timeout 時,就會報請求超時。

MIGRATE 命令需要在 timeout 時間範圍內完成 I/O 操作。如果在轉移數據的過程中發生了 I/O 操作,或者達到了超時時間,那麼該命令將會終止執行,並返回一個特殊的錯誤:IOERR。出現 IOERR 錯誤有兩種情況:

➢ 源數據庫和目標數據庫中可能同時存在這個 key。

➢ key 也可能只在源數據庫中存在。

此時讀者可能會問:會不會存在 key 丟失的情況?答案是:key 丟失的情況是不可能發生的。如果 MIGRATE 命令在執行的過程中出現了其他錯誤,那麼該命令可以保證這個 key 只存在於源數據庫中。

● 參數 COPY:如果在 MIGRATE 命令中設置了 COPY 參數,則表示在轉移之後不會刪除源數據庫中的 key。

● 參數 REPLACE:如果在 MIGRATE 命令中設置了 REPLACE 參數,則表示在轉移過程中會替換目標數據庫中已經存在的 key。

16. MOVE 命令:轉移鍵值對到本地目標數據庫

<code>127.0.0.1:6379> move student:name 1
(integer) 1
127.0.0.1:6379> select 1
OK
127.0.0.1:6379[1]> keys *
1) "student:name"/<code>

17. SORT 命令:對鍵值對進行排序

排序默認以數字作為對象,值會被解釋為 double 類型的浮點數,然後進行比較。

18. TYPE 命令:獲取鍵對應值的類型

<code>127.0.0.1:6379[1]> type student:name
string/<code>

19. DEL 命令:刪除鍵

<code>127.0.0.1:6379[1]> del student:name
(integer) 1/<code>

20. PERSIST 命令:刪除鍵的生存時間

HyperLogLog 命令

基數:舉一個例子,有數據集{1,3,5,8,5,8,9},去掉重複數據之後,得到這個數據集的基數集為{1,3,5,8,9},這個基數集的基數就是 5。

基數的特點:基數不可重複,且基數估計在誤差允許的範圍內。

HyperLogLog 是 Redis 用來做基數統計的算法。當 Redis 數據庫中的數據量非常龐大時,使用 HyperLogLog 命令來計算相關基數時,它具有所需空間固定、所佔空間小的優點。在 Redis 中,每個 HyperLogLog 鍵只需要耗費 12KB 的內存,就可以計算接近 2^64 個不同元素的基數。HyperLogLog 不會存儲輸入的元素,它僅僅根據輸入的元素來計算基數,因此它不會返回輸入的元素。

使用HyperLogLog可以統計網站每天的uv數據

1.PFADD 命令:向 HyperLogLog 中添加鍵值對。
<code>127.0.0.1:6379> pfadd age-log 18 19 20 12 19 18
(integer) 1/<code>
2.PFCOUNT 命令:獲取 HyperLogLog 的基數。
<code>127.0.0.1:6379> pfcount age-log
(integer) 4/<code>

當給定的 key 有多個時,PFCOUNT 命令返回給定 HyperLogLog 的並集的近似基數,這個近似基數是通過將所有給定的 HyperLogLog 合併到一個臨時的 HyperLogLog 中計算出來的。

3.PFMERGE 命令:合併多個 HyperLogLog 為一個新的 HyperLogLog。

腳本命令

Redis 腳本使用 Lua 解釋器來執行。使用 Redis 腳本可以一次性將多個請求命令發送出去,以減少網絡的開銷;使用 Redis 腳本實現原子操作,Redis 會將整個腳本作為一個整體執行,中間不會有其他命令被執行,以此來保證原子性;使用 Redis 腳本可以達到複用的目的,因為 Redis 會永久保存客戶端發送的腳本,所以其他客戶端可以直接複用這個腳本。

Redis 腳本命令用於操作 Redis 腳本。

1.SCRIPT LOAD 命令:添加 Lua 腳本到緩存中

SCRIPT LOAD 命令用於將腳本>

Lua 腳本可以在 Redis 的緩存中長時間保存,直到遇到 SCRIPT FLUSH 命令為止。

2.SCRIPT EXISTS 命令:判斷腳本是否已在緩存中

3.EVAL 命令:對 Lua 腳本求值

<code>eval>

● 參數>

● 參數 numkeys 用於指定鍵名參數的個數。

● 鍵名參數 key [key...]從 EVAL 命令的第三個參數開始算起,表示腳本中所用到的那些 Redis 鍵(key)。在 Lua 腳本中,可以使用全局變量 KEYS 數組(下標從 1 開始)

來訪問這些鍵名參數。

● 參數 arg [arg...]是附加參數。在 Lua 腳本中,可以使用 ARGV 數組(下標從 1 開始)來訪問這些附加參數。

4. EVALSHA 命令:對緩存中的腳本求值(參數及用法同上)

5. SCRIPT KILL 命令:殺死正在運行的 Lua 腳本

針對一個正在運行且沒有執行過任何寫操作的 Lua 腳本,可以使用 SCRIPT KILL 命令來殺死它。SCRIPT KILL 命令主要用於終止運行時間過長的腳本。該命令執行之後,當前正在運行的腳本會被殺死,執行這個腳本的客戶端會從 EVAL 命令的阻塞當中退出,並收到一個錯誤的返回值。

如果這個正在運行的腳本執行過寫操作,那麼使用 SCRIPT KILL 命令是無法殺死它的。Lua 腳本是原子性執行的。如果你非要殺死這個運行中的 Lua 腳本,則可以使用 SHUTDOWN NOSAVE 命令來直接關閉整個 Redis 進程,進而停止這個腳本的運行,並防止不完整的數據寫入數據庫中。

6. SCRIPT FLUSH 命令:清除緩存中的 所有Lua 腳本

連接命令

Redis 連接命令主要用於連接 Redis 的服務,如查看服務狀態、切換數據庫等

1. AUTH 命令:用於解鎖密碼。
2. QUIT 命令:斷開客戶端與服務器的連接。
3. PING 命令:查看服務器的運行狀態。
<code>127.0.0.1:6379> ping 

PONG/<code>
4. ECHO 命令:輸出打印消息。
5.SELECT 命令:切換數據庫。
<code>127.0.0.1:6379> select 1
OK/<code>

服務器命令

Redis 服務器命令主要用於操作管理 Redis 服務,比如,管理 Redis 的日誌,保存數據,修改相關配置等。

1.CLIENT LIST 命令:獲取客戶端相關信息
<code>127.0.0.1:6379[1]> client list
id=9 addr=127.0.0.1:52421 fd=10 name= age=457 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/<code>

返回的域含義如下。

● id:表示客戶端編號。

● addr:表示客戶端的地址(IP 地址 + 端口)。

● fd:表示套接字所使用的文件描述符。

● age:表示已連接時長,單位為秒。

● idle:表示連接空閒時長,單位為秒。

● flags:表示客戶端 flag(見下文)。

● db:指明該客戶端正在使用的數據庫,數值表示數據庫的索引號。

● sub:表示已訂閱的消息頻道數量。

● psub:表示已訂閱模式的數量。

● multi:表示在事務中被執行的命令數量。

● qbuf:表示查詢緩衝區的長度,0 表示沒有分配查詢緩衝區,單位為字節。

● qbuf-free:表示查詢緩衝區剩餘空間的長度,0 表示沒有剩餘空間,單位為字節。

● obl:表示輸出緩衝區的長度,0 表示沒有分配輸出緩衝區,單位為字節。

● oll:表示輸出列表中包含的對象數量。如果輸出緩衝區沒有剩餘空間,則命令回覆會以字符串對象的形式被添加到這個隊列中。

● omem:表示輸出緩衝區和輸出列表佔用的內存總量。

● events:表示文件描述符事件。

➢ r:在 loop 事件中,表示套接字是可讀的。

➢ w:在 loop 事件中,表示套接字是可寫的。

● cmd:表示最近一次執行的命令。

客戶端 flag 可以由以下幾部分組成。

● O:客戶端是 MONITOR 模式下的附屬節點(slave)。

● S:客戶端是一般模式下(normal)的附屬節點。

● M:客戶端是主節點(master)。

● x:客戶端正在執行事務。

● b:客戶端正在等待阻塞事件。

● i:客戶端正在等待 VM I/O 操作(已廢棄)。

● d:一個受監視(watched)的鍵已被修改,EXEC 命令將執行失敗。

● c:在將回復完整地寫出來之後,關閉連接。

● u:客戶端未被阻塞(unblocked)。

● A:儘可能快地關閉連接。

● N:未設置任何 flag。

2. CLIENT GETNAME 命令:獲取客戶端名字

3. CLIENT SETNAME 命令:設置客戶端名字

4. CLIENT PAUSE 命令:在指定時間範圍內停止運行來自客戶端的命令

5. CLIENT KILL 命令:關閉客戶端連接
<code>127.0.0.1:6379[1]> client kill 127.0.0.1:52421
OK/<code>
6. COMMAND 命令:查看 Redis 命令的詳細信息
<code>127.0.0.1:6379[1]> command
1) 1) "bitpos"
2) (integer) -3
3) 1) readonly
4) (integer) 1
5) (integer) 1
6) (integer) 1
。。。。。。/<code>

7. COMMAND COUNT 命令:統計 Redis 的命令個數

8. COMMAND GETKEYS 命令:獲取指定的所有鍵

9. COMMAND INFO 命令:查看 Redis 命令的描述信息

10. DBSIZE 命令:統計當前數據庫中鍵的數量

11. INFO 命令:查看服務器的各種信息

<code>127.0.0.1:6379> info server
# Server
redis_version:3.0.504
redis_git_sha1:00000000
redis_git_dirty:0
redis_build_id:a4f7a6e86f2d60b3
redis_mode:standalone
os:Windows
arch_bits:64
multiplexing_api:WinSock_IOCP
process_id:11760
run_id:cf21313e82a0f23bf2cb01e2379739b8076ad2e4
tcp_port:6379
uptime_in_seconds:82434
uptime_in_days:0
hz:10
lru_clock:8057624
config_file:/<code>

參數 section 的設置可以讓 INFO 命令只返回某一部分的信息。

INFO 命令執行後,會返回如下幾部分的信息。

● server 部分:該部分主要說明 Redis 的服務器信息。

● clients 部分:該部分記錄了已連接客戶端的信息。

● memory 部分:該部分記錄了 Redis 服務器的內存相關信息。

● persistence 部分:該部分記錄了與持久化(RDB 持久化和 AOF 持久化)相關的信息。

● stats 部分:該部分記錄了相關的統計信息。

● replication 部分:該部分記錄了 Redis 數據庫主從複製信息。

● cpu 部分:該部分記錄了 CPU 的計算量統計信息。

● commandstats 部分:該部分記錄了 Redis 各種命令的執行統計信息,如執行命令消耗的 CPU 時間、執行次數等。

● cluster 部分:該部分記錄了與 Redis 集群相關的信息。

● keyspace 部分:該部分記錄了與 Redis 數據庫相關的統計信息,如鍵的數量。

參數 section 除可以取上面的值以外,它的值還可以是 all(表示返回所有信息)和 default (表示返回默認選擇的信息)。

12. LASTSAVE 命令:獲取最近一次保存數據的時間(UNIX 時間戳。)

<code>127.0.0.1:6379> lastsave
(integer) 1585106127/<code>

13. MONITOR 命令:實時打印服務器接收到的命令

14. TIME 命令:獲取當前服務器的時間
15. CONFIG SET 命令:修改 Redis 服務器的配置
16. CONFIG GET 命令:查看 Redis 服務器的配置
<code>127.0.0.1:6379> config set requirepass 123456
OK
127.0.0.1:6379> config get requirepass
(error) NOAUTH Authentication required.
127.0.0.1:6379> Auth 123456
OK
127.0.0.1:6379> config get requirepass
1) "requirepass"
2) "123456"/<code>

17. CONFIG RESETSTAT 命令:重置 INFO 命令中的統計數據

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 計數器的值。

18. CONFIG REWRITE 命令:改寫 Redis 配置文件

19. BGREWRITEAOF 命令:執行 AOF 文件重寫操作

BGREWRITEAOF 命令用於執行一個 AOF 文件重寫操作。該命令執行後,會創建一個當前 AOF 文件的優化版本。當 BGREWRITEAOF 命令執行失敗時,AOF 文件數據並不會丟失。舊的 AOF 文件在 BGREWRITEAOF 命令執行成功之前是不會被修改的,因此不存在數據丟失問題。

在 Redis 的高版本(Redis 2.4 以後)中,AOF 文件的重寫將由 Redis 自動觸發,使用 BGREWRITEAOF 命令只是用於手動觸發重寫操作。

20. SAVE 命令:將數據同步保存到磁盤中

SAVE 命令用於保存數據到磁盤中。SAVE 命令具體執行的是一個同步保存操作,它以 RDB 文件的形式將當前 Redis 的所有數據快照保存到磁盤中。在生產環境中,不建議使用 SAVE 命令來保存數據,因為它在執行後會阻塞所有客戶端。推薦使用 BGSAVE 命令來異步執行保存數據的任務。如果後臺子進程保存數據失敗,或者出現其他問題,則可以使用 SAVE 命令來做最後的保存

21.BGSAVE 命令:將數據異步保存到磁盤中

BGSAVE 命令用於在 Redis 服務後端採用異步的方式將數據保存到當前數據庫的磁盤中。

BGSAVE 命令的執行原理:在 BGSAVE 命令執行後會返回 OK,之後 Redis 啟動一個新的子進程,原來的 Redis 進程(父進程)繼續執行客戶端請求操作,而子進程則負責將數據保存到磁盤中,然後退出。

我們可以使用 LASTSAVE 命令來查看相關信息,進而判斷 BGSAVE 命令是否將數據保存成功。

22. SYNC 命令,PSYNC 命令

SYNC, PSYNC 命令是 Redis 複製功能的內部命令

23. SLAVEOF 命令:修改複製功能

在 Redis 運行時,可以使用 SLAVEOF 命令動態修改複製功能的行為。我們利用 SLAVEOF host port 命令來修改當前服務器,使其轉變為指定服務器的從屬服務器(Slave Server)。如果當前服務器是某個主服務器的從屬服務器,則在執行 SLAVEOF host port 命令後,會使當前服務器停止對舊主服務器的同步,並且將舊數據集丟棄,然後開始對新主服務器數據進行同步。

如果想在同步時不丟失數據集,則可以使用 SLAVEOF NO ONE 命令,該命令執行後不會丟棄同步數據集。當主服務器出現故障的時候,我們可以利用該命令將從屬服務器用作新的主服務器,實現數據不丟失,不間斷運行。

24. ROLE 命令:查看主從服務器的角色

25. SLOWLOG 命令:管理 Redis 的慢日誌

Slow log(慢日誌)是 Redis 的日誌系統,用於記錄查詢執行時間。查詢執行時間指的是執行一個查詢命令所耗費的時間,它不包括客戶端響應、發送信息等 I/O 操作。Slow log 保存在內存裡面,讀/寫速度非常快。

26. SHUTDOWN 命令:關閉 Redis 服務器或客戶端

SHUTDOWN 命令具有多種作用,具體如下:

● 直接關閉 Redis 服務器。a

● 關閉(停止)所有客戶端。

● 在 AOF 選項被打開的情況下,執行 SHUTDOWN 命令將會更新 AOF 文件。

● 如果 Redis 服務中至少存在一個保存點在等待,則在執行 SHUTDOWN 命令的同時將會執行 SAVE 命令。

在持久化被打開的情況下,執行 SHUTDOWN 命令,它會保證服務器正常關閉,不會丟失任何數據。

SHUTDOWN SAVE 命令會強制 Redis 數據庫執行保存命令,即使沒有設置保存點,也會執行。

SHUTDOWN NOSAVE 命令的作用與 SHUTDOWN SAVE 命令的作用剛好相反,它會阻止 Redis 數據庫執行保存操作,即使設置了一個或多個保存點,也會阻止。


分享到:


相關文章: