濮阳杆衣贸易有限公司

主頁 > 知識庫 > redis通過lua腳本,獲取滿足key pattern的所有值方式

redis通過lua腳本,獲取滿足key pattern的所有值方式

熱門標(biāo)簽:北京400電話辦理收費(fèi)標(biāo)準(zhǔn) 十堰營銷電銷機(jī)器人哪家便宜 魔獸2青云地圖標(biāo)注 山東外呼銷售系統(tǒng)招商 貴州電銷卡外呼系統(tǒng) 宿遷便宜外呼系統(tǒng)平臺 日本中國地圖標(biāo)注 鄭州人工智能電銷機(jī)器人系統(tǒng) 超呼電話機(jī)器人

我們知道,redis提供了keys命令去獲取所有滿足格式的key,如我們鍵入命令

keys "user*"

將得到所有以user開頭的key

然后執(zhí)行 mget命令可以獲取多個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));

如果需要同時輸出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有多少個,這里的key就有多少個

arg1,arg2key結(jié)束后就是arg。

如 eval "return 'hello'" 3 1 2 3 4 5 6 7中第一個3為key的數(shù)量,即后面的123為key,4567為arg。

在腳本中可以用KEYS[2]表式第二個參數(shù),ARGV[2]表示第2個參數(shù)值,比如我們修改上面return 'hello'的值

eval "return KEYS[3]" 3 1 2 3 4 5 6 7將返回第3個參數(shù),即3

eval "return ARGV[2]" 3 1 2 3 4 5 6 7將返回第二個值,即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個參數(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的長度,這里作了個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è)置鍵值對,鍵已存在會刷新值
 b. set name myname EX 10 //在a的基礎(chǔ)上鍵值對10秒過期
 c. set name myname px 10000 //在a的基礎(chǔ)上鍵值對10000毫秒過期
 d. set name myname NX //只有鍵不存在時才能插入
 e. set name myname XX //只有鍵存在時才能插入
 f. set name myname EX 10 NX //鍵值對不存在時才能插入并且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過期時間,成功返回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的個數(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在這個語句中都是必須的,如果直接用
 eval "return redis.call('get',KEYS[1])==ARGV[1]" 1 name www
 返回值是nil

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。如有錯誤或未考慮完全的地方,望不吝賜教。

您可能感興趣的文章:
  • Java Pattern和Matcher字符匹配方式
  • Java中Pattern.compile函數(shù)的使用詳解
  • logback 自定義Pattern模板教程
  • springboot Interceptor攔截器excludePathPatterns忽略失效
  • Java如何利用狀態(tài)模式(state pattern)替代if else
  • Swift 中如何使用 Option Pattern 改善可選項的 API 設(shè)計
  • java正則表達(dá)式之Pattern與Matcher類詳解
  • Java之Pattern.compile函數(shù)用法詳解

標(biāo)簽:果洛 朝陽 江蘇 大慶 北京 吉安 楊凌 臺州

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《redis通過lua腳本,獲取滿足key pattern的所有值方式》,本文關(guān)鍵詞  redis,通過,lua,腳本,獲取,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《redis通過lua腳本,獲取滿足key pattern的所有值方式》相關(guān)的同類信息!
  • 本頁收集關(guān)于redis通過lua腳本,獲取滿足key pattern的所有值方式的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    扎赉特旗| 英吉沙县| 林芝县| 莆田市| 监利县| 利津县| 红安县| 集安市| 汉阴县| 马鞍山市| 景谷| 宁乡县| 苏尼特左旗| 旬邑县| 策勒县| 山东省| 宝丰县| 武鸣县| 峨边| 英吉沙县| 桃园市| 清水县| 盐津县| 仁怀市| 洞口县| 舟山市| 融水| 武定县| 公安县| SHOW| 邻水| 长顺县| 乐清市| 汽车| 衡山县| 柯坪县| 承德县| 望奎县| 六安市| 封丘县| 新郑市|