redis筆記補充

wang03發表於2022-04-05

redis補充

這篇文章是redis入門筆記的補充。

1.info命令

用來顯示服務的資訊。

info命令可以跟下面的選項:

  • server: 關於 Redis 伺服器的一些資訊
  • clients: 客戶端連線部分
  • memory: 記憶體消耗相關資訊
  • persistence: RDB和AOF相關資訊
  • stats: 一些統計
  • replication: 主/副本複製資訊
  • cpu: CPU消耗統計
  • commandstats: Redis 命令統計
  • delatencystats: Redis 命令延遲百分位分佈統計
  • cluster: Redis 叢集部分
  • modules: 模組部分
  • keyspace: Redis資料庫相關的統計資訊
  • errorstats: Redis 錯誤統計

info keyspace就能檢視redis每個庫中儲存的key的資訊。

同時info也可以跟下面的一些選項

  • all:返回所有部分(不包括模組生成的部分)
  • default:僅返回預設的部分集
  • everything:包括所有和模組

如果單純是info命令的話,等價於info default

具體的資訊大家可以檢視官方文件部分的介紹:https://redis.io/commands/info/

2.memory stats命令

用來顯示服務的記憶體使用的相關情況。

  • peak.allocated: Redis 消耗的峰值記憶體(以位元組為單位)(參見 INFO 的 used_memory_peak

  • total.allocated: Redis 使用其分配器分配的總位元組數(參見 INFO 的 used_memory

  • startup.allocated: Redis 在啟動時消耗的初始記憶體量(以位元組為單位)(參見 INFO 的 used_memory_startup

  • replication.backlog: 複製積壓快取區的位元組大小(參見INFO的repl_backlog_active

  • clients.slaves: 所有副本開銷的總大小(以位元組為單位)(輸出和查詢緩衝區、連線上下文)

  • clients.normal: 所有客戶端開銷(輸出和查詢緩衝區、連線上下文)的總大小(以位元組為單位)

  • aof.buffer: AOF 相關緩衝區的總大小(以位元組為單位)

  • lua.caches: Lua 指令碼快取開銷的總大小(以位元組為單位)

  • dbXXX: 對於伺服器的每個資料庫,主字典和過期字典(分別為overhead.hashtable.mainoverhead.hashtable.expires)的開銷以位元組為單位報告

  • overhead.total: 所有開銷的總和,即 startup.allocatedreplication.backlogclients.slavesclients.normalaof.buffer 以及用於管理 Redis 鍵空間的內部資料結構的總和(參見 INFO 的 used_memory_overhead)

  • keys.count: 整個redis例項key的個數

  • keys.bytes-per-key: 每個key平均位元組數,net memory usage(total.allocated 減去 startup.allocated)與keys.count的比值

  • dataset.bytes: Redis 例項中資料佔用的總位元組數,計算方法total.allocated減去overhead.total

  • dataset.percentage: Redis 資料消耗記憶體佔總記憶體的百分比

  • peak.percentage: 當前記憶體消耗佔峰值記憶體消耗的百分比

  • fragmentation: 同 INFOmem_fragmentation_ratio

    中文官方文件連結:https://www.redis.com.cn/commands/memory-stats.html

3.debug object命令

可以用來顯示關於key的一些除錯資訊

debug object [key]

4.lua指令碼

格式:eval [script] [numkeys] key ... arg ...

eval "return 'hello world'" 0 "hello world"

這裡return關鍵字主要用來返回命令執行的結果。如果我們不需要命令直接的結果,那就不需要寫return


直接在指令碼中通過呼叫redis.call()函式或者redis.pcall()函式執行Redis命令

eval "return redis.call('set',KEYS[1],ARGV[1])" 1 "message" "hello world"

這裡有2個地方需要注意:

  • 陣列下標是從1開始
  • KEYS,ARGV都必須大寫

redis.call()函式和redis.pcall()函式都可以用於執行Redis命令,它們之間唯一不同的就是處理錯誤的方式。前者在執行命令出錯時會引發一個Lua錯誤,迫使EVAL命令向呼叫者返回一個錯誤;而後者則會將錯誤包裹起來,並返回一個表示錯誤的Lua表格.


值轉換:

Redis伺服器中有兩種不同的環境:一種是Redis命令執行器所處的環境,而另一種則是Lua直譯器所處的環境。因為這兩種環境

使用的是不同的輸入和輸出,所以在這兩種環境之間傳遞值將引發相應的轉換操作:

1)當Lua指令碼通過redis.call()函式或者redis.pcall()函式執行Redis命令時,傳入的Lua值將被轉換成Redis協議值;

2)當redis.call()函式或者redis.pcall()函式執行完Redis命令時,命令返回的Redis協議值將被轉換成Lua值。

3)當Lua指令碼執行完畢並向EVAL命令的呼叫者返回結果時,Lua值將被轉換為Redis協議值。

將Redis協議值轉換成Lua值的規則

將Lua值轉換為Redis協議值的規則


全域性變數保護

為了防止預定義的Lua環境被汙染,Redis只允許使用者在Lua指令碼中建立區域性變數而不允許建立全域性變數,嘗試在指令碼中建立全域性變數將引發一個錯誤。


通過lua指令碼刪除redis中多個key

在redis中沒有通過正則去刪除多個key的方法,所以我們可以通過lua指令碼的方式去刪除多個key。

首先看下lua指令碼中關於陣列遍歷的方法。

arr = {"a","b","c"}
for i = 1, #arr do
    print(arr[i])
end

將上面的內容儲存到新建的名為a.lua檔案中。執行lua a.lua就可以分別列印a、b、c.

下面我們看看如果刪除多個key。做法還是通過keys命令查到多個符合要求的key,再通過遍歷陣列的方式刪除。

比如我們要刪除所有a開頭的key,就可以使用下面的命令。

eval "local ks=redis.call('keys',KEYS[1]) for i = 1, #ks do   redis.call('del',ks[i]) end " 1  "a*"

相關文章