- 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的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我有一个关于 Redis Pubsub 的练习,如下所示: 如果发布者发布消息但订阅者没有收到服务器崩溃。订阅者如何在重启服务器时收到该消息? 请帮帮我,谢谢! 最佳答案 在这种情况下,消息将永远消失
我们正在使用 Service Stack 的 RedisClient 的 BlockingDequeue 来保存一些数据,直到它可以被处理。调用代码看起来像 using (var client =
我有一个 Redis 服务器和多个 Redis 客户端。每个 Redis 客户端都是一个 WebSocket+HTTP 服务器,其中包括管理 WebSocket 连接。这些 WebSocket+HTT
我有多个 Redis 实例。我使用不同的端口创建了一个集群。现在我想将数据从预先存在的 redis 实例传输到集群。我知道如何将数据从一个实例传输到集群,但是当实例多于一个时,我无法做到这一点。 最佳
配置:三个redis集群分区,跨三组一主一从。当 Master 宕机时,Lettuce 会立即检测到中断并开始重试。但是,Lettuce 没有检测到关联的 slave 已经将自己提升为 master
我想根据从指定集合中检索这些键来删除 Redis 键(及其数据集),例如: HMSET id:1 password 123 category milk HMSET id:2 password 456
我正在编写一个机器人(其中包含要禁用的命令列表),用于监视 Redis。它通过执行禁用命令,例如 (rename-command ZADD "")当我重新启动我的机器人时,如果要禁用的命令列表发生变化
我的任务是为大量听众使用发布/订阅。这是来自 docs 的订阅的简化示例: r = redis.StrictRedis(...) p = r.pubsub() p.subscribe('my-firs
我一直在阅读有关使用 Redis 哨兵进行故障转移的内容。我打算有1个master+1个slave,如果master宕机超过1分钟,就把slave变成master。我知道这在 Sentinel 中是
与仅使用常规 Redis 和创建分片相比,使用 Redis 集群有哪些优势? 在我看来,Redis Cluster 更注重数据安全(让主从架构解决故障)。 最佳答案 我认为当您需要在不丢失任何数据的情
由于 Redis 以被动和主动方式使 key 过期, 有没有办法得到一个 key ,即使它的过期时间已过 (但 在 Redis 中仍然存在 )? 最佳答案 DEBUG OBJECT myKey 将返回
我想用redis lua来实现monitor命令,而不是redis-cli monitor。但我不知道怎么办。 redis.call('monitor') 不起作用。 最佳答案 您不能从 Redis
我读过 https://github.com/redisson/redisson 我发现有几个 Redis 复制设置(包括对 AWS ElastiCache 和 Azure Redis 缓存的支持)
Microsoft.AspNet.SignalR.Redis 和 StackExchange.Redis.Extensions.Core 在同一个项目中使用。前者需要StackExchange.Red
1. 认识 Redis Redis(Remote Dictionary Server)远程词典服务器,是一个基于内存的键值对型 NoSQL 数据库。 特征: 键值(key-value)型,value
1. Redis 数据结构介绍 Redis 是一个 key-value 的数据库,key 一般是 String 类型,但 value 类型多种多样,下面就举了几个例子: value 类型 示例 Str
1. 什么是缓存 缓存(Cache) 就是数据交换的缓冲区,是存贮数据的临时地方,一般读写性能较高。 缓存的作用: 降低后端负载 提高读写效率,降低响应时间 缓存的成本: 数据一致性成本 代码维护成本
我有一份记录 list 。对于我的每条记录,我都需要进行一些繁重的计算,因为我要在Redis中创建反向索引。为了达到到达记录,需要在管道中执行多个redis命令(sadd为100 s + set为1
我有一个三节点Redis和3节点哨兵,一切正常,所有主服务器和从属服务器都经过验证,并且哨兵配置文件已与所有Redis和哨兵节点一起更新,但是问题是当Redis主服务器关闭并且哨兵希望选举失败者时再次
我正在尝试计算Redis中存储的消息之间的响应时间。但是我不知道该怎么做。 首先,我必须像这样存储chat_messages的时间流 ZADD conversation:CONVERSATION_ID
我是一名优秀的程序员,十分优秀!