redis通過lua腳本,獲取滿足key pattern的所有值方式
我們知道,redis提供了keys命令去獲取所有滿足格式的key,如我們鍵入命令
keys "user*"
將得到所有以user開頭的key

然后執(zhí)行 mget命令可以獲取多個(gè)key的值,如

但如果滿足條件的key過多,我們要將所有key拿到,再用mget去拿到所有值則為相對比較麻煩,因此可以借助xargs
redis-cli keys "user*"|xargs redis-cli mget獲取到所有key的值

也可以執(zhí)行l(wèi)ua腳本local keys = redis.call('keys', KEYS[1]); return redis.call('mget',unpack(keys));

如果需要同時(shí)輸出key和value,可以調(diào)整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*",
最后輸出結(jié)果如下

這里簡單普及下redis eval命令 和lua腳本基本用法
eval命令的格式如下
eval script numkeys key1 key2 arg1 arg2
scriptlua腳本,字符串,首尾引號必須,腳本中的雙引號全改為單引號即可
numkeyskey的數(shù)量,key和arg都是傳入lua腳本的參數(shù),下面提到
key1,key2指具體key值,上面的numkeys有多少個(gè),這里的key就有多少個(gè)
arg1,arg2key結(jié)束后就是arg。
如 eval "return 'hello'" 3 1 2 3 4 5 6 7中第一個(gè)3為key的數(shù)量,即后面的123為key,4567為arg。
在腳本中可以用KEYS[2]表式第二個(gè)參數(shù),ARGV[2]表示第2個(gè)參數(shù)值,比如我們修改上面return 'hello'的值
eval "return KEYS[3]" 3 1 2 3 4 5 6 7將返回第3個(gè)參數(shù),即3

eval "return ARGV[2]" 3 1 2 3 4 5 6 7將返回第二個(gè)值,即5

在lua腳本中使用redis.call('get',...)可調(diào)用redis命令,我們將上面的lua腳本格式化,解釋如下 :
lua中用–表示注釋
--local為局部變量,沒有l(wèi)ocal關(guān)鍵字,則視為全局變量
--redis.call是調(diào)用redis命令,下面使用了keys命令
--KEYS[1]為第1個(gè)參數(shù),lua數(shù)組下標(biāo)從1開始
local keys = redis.call('keys', KEYS[1]);
--下面通過mget獲取所有key的值,call后面是可變長參數(shù),unpack是將數(shù)組變成可變長參數(shù)
local values = redis.call('mget', unpack(keys));
--定義返回結(jié)果
local keyValuePairs = {};
--#keys是獲取keys的長度,這里作了個(gè)for循環(huán),將key與value對應(yīng)起來
--lua中字符串拼接是用..
for i = 1, #keys do
keyValuePairs[i] = keys[i] .. '\t' .. values[i]
end;
--返回結(jié)果
return keyValuePairs;
補(bǔ)充:redis String鍵值對常用命令整理及Lua腳本
一、保存
1、set key value [EX seconds]|[PX milliseconds] [NX|XX]
a. set name myname //直接設(shè)置鍵值對,鍵已存在會(huì)刷新值 b. set name myname EX 10 //在a的基礎(chǔ)上鍵值對10秒過期 c. set name myname px 10000 //在a的基礎(chǔ)上鍵值對10000毫秒過期 d. set name myname NX //只有鍵不存在時(shí)才能插入 e. set name myname XX //只有鍵存在時(shí)才能插入 f. set name myname EX 10 NX //鍵值對不存在時(shí)才能插入并且10秒過期
2、在1的基礎(chǔ)上衍生
a. setnx name myname //等同于1.d b. setex name 10 myname //等于1.b
二、其他
get key //得到指定的值 exists key //判斷key是否存在,存在返回1,不存在返回0 expire key 10 // 設(shè)置key-value過期時(shí)間,成功返回1,不存在返回0, del key //刪除指定key-value
三、Lua腳本
格式:eval script numkeys key [key...] arg [arg...] eval:告訴redis執(zhí)行后面的lua腳本 script:lua腳本內(nèi)容 numkeys:后續(xù)參數(shù)key的個(gè)數(shù) key [key...]:key arg [arg...]:值
注:num不能為空,且以key為準(zhǔn)
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:稍微復(fù)雜點(diǎn)的語句
eval "if redis.call('get',KEYS[1])==ARGV[1] then return 0 else return 1 end" 1 name www
then end在這個(gè)語句中都是必須的,如果直接用
eval "return redis.call('get',KEYS[1])==ARGV[1]" 1 name www
返回值是nil
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。
相關(guān)文章
Redis有序集合類型的操作_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
今天通過本文給大家說一下Redis中最后一個(gè)數(shù)據(jù)類型 “有序集合類型”,需要的的朋友參考下吧2017-08-08
ubuntu 16.04安裝redis的兩種方式教程詳解(apt和編譯方式)
這篇文章主要介紹了ubuntu 16.04安裝redis的兩種方式教程詳解(apt和編譯方式),需要的朋友可以參考下2018-03-03
Redis查看KEY的數(shù)據(jù)類型的方法和步驟
在Redis中,可以使用 TYPE 命令來查看指定key的數(shù)據(jù)類型,該命令會(huì)返回存儲(chǔ)在指定key中的值的數(shù)據(jù)類型,本文給大家介紹了具體的使用方法和步驟,感興趣的朋友可以參考下2024-04-04
redis延時(shí)隊(duì)列zset實(shí)現(xiàn)的示例
延時(shí)隊(duì)列是一種常用的設(shè)計(jì)模式,用于處理那些需要在未來某個(gè)時(shí)間點(diǎn)執(zhí)行的任務(wù),本文主要介紹了redis延時(shí)隊(duì)列zset實(shí)現(xiàn)的示例,具有一定的參考價(jià)值,感興趣的可以了解一下2024-08-08
Redis報(bào)錯(cuò)NOAUTH?Authentication?required簡單解決辦法
這篇文章主要給大家介紹了關(guān)于Redis報(bào)錯(cuò)NOAUTH?Authentication?required的簡單解決辦法,Redis無密碼報(bào)錯(cuò)NOAUTH Authentication required的原因是客戶端訪問Redis時(shí)需要提供密碼,但是沒有提供或提供的密碼不正確,需要的朋友可以參考下2024-05-05

