redis通過lua腳本,獲取滿足key pattern的所有值方式
我們知道,redis提供瞭keys命令去獲取所有滿足格式的key,如我們鍵入命令
keys "user*"
將得到所有以user開頭的key
然後執行 mget命令可以獲取多個key的值,如
但如果滿足條件的key過多,我們要將所有key拿到,再用mget去拿到所有值則為相對比較麻煩,因此可以借助xargs
redis-cli keys “user*”|xargs redis-cli mget獲取到所有key的值
也可以執行lua腳本local keys = redis.call(‘keys’, KEYS[1]); return redis.call(‘mget’,unpack(keys));
如果需要同時輸出key和value,可以調整lua腳本
eval "local keys = redis.call('keys', KEYS[1]); local values = redis.call('mget',unpack(keys)); local keyValuePairs = {};for i = 1, #keys do keyValuePairs[i] = keys[i]..':'..values[i] end; return keyValuePairs;" 1 "user*",
最後輸出結果如下
這裡簡單普及下redis eval命令 和lua腳本基本用法
eval命令的格式如下
eval script numkeys key1 key2 arg1 arg2
scriptlua腳本,字符串,首尾引號必須,腳本中的雙引號全改為單引號即可
numkeyskey的數量,key和arg都是傳入lua腳本的參數,下面提到
key1,key2指具體key值,上面的numkeys有多少個,這裡的key就有多少個
arg1,arg2key結束後就是arg。
如 eval “return ‘hello'” 3 1 2 3 4 5 6 7中第一個3為key的數量,即後面的123為key,4567為arg。
在腳本中可以用KEYS[2]表式第二個參數,ARGV[2]表示第2個參數值,比如我們修改上面return ‘hello’的值
eval “return KEYS[3]” 3 1 2 3 4 5 6 7將返回第3個參數,即3
eval “return ARGV[2]” 3 1 2 3 4 5 6 7將返回第二個值,即5
在lua腳本中使用redis.call(‘get’,…)可調用redis命令,我們將上面的lua腳本格式化,解釋如下 :
lua中用–表示註釋
--local為局部變量,沒有local關鍵字,則視為全局變量 --redis.call是調用redis命令,下面使用瞭keys命令 --KEYS[1]為第1個參數,lua數組下標從1開始 local keys = redis.call('keys', KEYS[1]); --下面通過mget獲取所有key的值,call後面是可變長參數,unpack是將數組變成可變長參數 local values = redis.call('mget', unpack(keys)); --定義返回結果 local keyValuePairs = {}; --#keys是獲取keys的長度,這裡作瞭個for循環,將key與value對應起來 --lua中字符串拼接是用.. for i = 1, #keys do keyValuePairs[i] = keys[i] .. '\t' .. values[i] end; --返回結果 return keyValuePairs;
補充:redis String鍵值對常用命令整理及Lua腳本
一、保存
1、set key value [EX seconds]|[PX milliseconds] [NX|XX]
a. set name myname //直接設置鍵值對,鍵已存在會刷新值 b. set name myname EX 10 //在a的基礎上鍵值對10秒過期 c. set name myname px 10000 //在a的基礎上鍵值對10000毫秒過期 d. set name myname NX //隻有鍵不存在時才能插入 e. set name myname XX //隻有鍵存在時才能插入 f. set name myname EX 10 NX //鍵值對不存在時才能插入並且10秒過期
2、在1的基礎上衍生
a. setnx name myname //等同於1.d b. setex name 10 myname //等於1.b
二、其他
get key //得到指定的值 exists key //判斷key是否存在,存在返回1,不存在返回0 expire key 10 // 設置key-value過期時間,成功返回1,不存在返回0, del key //刪除指定key-value
三、Lua腳本
格式:eval script numkeys key [key...] arg [arg...] eval:告訴redis執行後面的lua腳本 script:lua腳本內容 numkeys:後續參數key的個數 key [key...]:key arg [arg...]:值
註:num不能為空,且以key為準
1:set key value
a.eval "return redis.call('set','name','www')" 0 b.eval "return redis.call('set',KEYS[1],'www')" 1 name c.eval "return redis.call('set','name',ARGV[1])" 0 www d.eval "return redis.call('set',KEYS[1],ARGV[1])" 1 name www
2:get key 類似set
3:稍微復雜點的語句
eval "if redis.call('get',KEYS[1])==ARGV[1] then return 0 else return 1 end" 1 name www then end在這個語句中都是必須的,如果直接用 eval "return redis.call('get',KEYS[1])==ARGV[1]" 1 name www 返回值是nil
以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。如有錯誤或未考慮完全的地方,望不吝賜教。