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.main
和overhead.hashtable.expires
)的開銷以位元組為單位報告 -
overhead.total
: 所有開銷的總和,即startup.allocated
、replication.backlog
、clients.slaves
、clients.normal
、aof.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
: 同INFO
的mem_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*"