- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章redis通过lua脚本,获取满足key pattern的所有值方式由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
我们知道,redis提供了keys命令去获取所有满足格式的key,如我们键入命令 。
1
|
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脚本 。
1
|
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命令的格式如下 。
1
|
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中用–表示注释 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
--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、保存 。
1、set key value [ex seconds]|[px milliseconds] [nx|xx] 。
1
2
3
4
5
6
|
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的基础上衍生 。
1
2
|
a. setnx
name
myname //等同于1.d
b. setex
name
10 myname //等于1.b
|
2、其他 。
1
2
3
4
|
get
key
//得到指定的值
exists
key
//判断
key
是否存在,存在返回1,不存在返回0
expire
key
10 // 设置
key
-value过期时间,成功返回1,不存在返回0,
del
key
//删除指定
key
-value
|
3、lua脚本 。
1
2
3
4
5
6
|
格式: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 。
1
2
3
4
|
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:稍微复杂点的语句 。
1
2
3
4
|
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
|
以上为个人经验,希望能给大家一个参考,也希望大家多多支持我。如有错误或未考虑完全的地方,望不吝赐教.
最后此篇关于redis通过lua脚本,获取满足key pattern的所有值方式的文章就讲到这里了,如果你想了解更多关于redis通过lua脚本,获取满足key pattern的所有值方式的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
这个问题在这里已经有了答案: Difference between / and /* in servlet mapping url pattern (5 个回答) 4年前关闭。 web.xml 中的/
Scala 具有支持模式匹配中析取的语言功能(“模式替代”): x match { case _: String | _: Int => case _ => } 但是,如果审查满足 P
解释我的问题: 类别:玩具 特质 1:说话像男性 特质2:说话像女性 我能否在运行时更改 Toy 的行为(特征),以便有时同一个对象说话像男性,有时同一个对象说话像女性? 我想在运行时改变说话行为。
我已经能够找到很好的资源,这些资源告诉我 Java API 中的 MouseAdapter 没有使用适配器模式。问题是:MouseAdapter 是否实现了某种模式? 我知道它的作用:它为 Mouse
我有兴趣了解有关模式识别的更多信息。我知道这是一个广泛的领域,所以我将列出一些我想学习处理的特定类型的问题: 在看似随机的字节集中查找模式。 识别图像中的已知形状(例如圆形和正方形)。 注意给定位置流
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 8 年前。 Improve this ques
所以,问题很简单:在 awk 中,if (var ~/pattern/) 是否与 if (var ~ "pattern") 相同? 我已经对 csv 进行了一些基本测试,两者似乎都产生了相同的结果..
我的问题是 this 的 Scala (Java) 变体Python 上的查询。 特别是,我有一个字符串 val myStr = "Shall we meet at, let's say, 8:45
我最近一直在研究正则表达式并注意到了这一点。 Pattern pNoEmbed = Pattern.compile("[ a-z]+", Pattern.CASE_INSENSITIVE); Patt
在研究大型应用程序的 C++ 源代码时,我发现了这种模式(该示例的语法可能很粗略,但基本细节都在那里): class A : X friend B; B *parent; ...
有人可以举一个“中介者模式”在现实世界中有用的用例吗? 最佳答案 Mediator是一种添加第三方对象以控制一组(2 个或更多)对象之间交互的方法。 您能找到的最简单的示例是 Chat Room例如,
尝试编译以下代码片段时: type 'a frame = Empty | Frame of string * 'a * 'a frame let rec searchFrame f s = match
目标 我的目标是获得一个 servlet 过滤器来处理对主页的请求,然后再将它们转发到 index.jsp。 问题 我无法让过滤器接收来自“/”的请求。它的 URL 模式是 / 相反,对该模式的请求最
这个问题已经有答案了: Difference between / and /* in servlet mapping url pattern (5 个回答) 已关闭 6 年前。 我已经设置了一个具有此
第 6 章(代码重用模式)中有以下示例: // the parent constructor function Parent(name) { this.name = name || 'Adam
Pattern类中的pattern()方法和toString()方法有什么区别? 文档说: public String pattern() Returns the regular expression
我有脚本 here并且 ng-pattern 工作正常,因为 scope.subnet 仅在输入匹配模式后才显示在输出中。但是如果 ng-pattern 不匹配,ng-show 不会显示任何错误
我想知道为什么当提供相同的正则表达式和相同的字符串时,java regex pattern.matcher() 和 pattern.matches() 的结果会不同 String str = "hel
This SO answer引用“患有模式综合症的小男孩”。虽然我可以通过上下文推断出一些含义,但我并不完全理解。 “有模式综合症的小男孩”的良好定义是什么? 最佳答案 它只是意味着寻找将模式注入(i
我有以下微服务架构的用例。 我的问题是,在当前情况下,我有 3 个微服务和一个 APIGateway。 最后,网关必须在聚合(组合)来自 3 个服务的数据之前进行大量查询。因为这 3 个微服务只提供基
我是一名优秀的程序员,十分优秀!