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

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。如有错误或未考虑完全的地方,望不吝赐教。

(0)

相关推荐

  • 解决Java Redis删除HashMap中的key踩到的坑

    现象 Java使用Redis删除HashMap中的key时,取出对应的HashMap后通过Java中HashMap的remove方法移除key然后重新调用redis的Hmset方法将覆盖无效 示例代码 //通过key取出对应的HashMap Map<String, String> ruleMap = jedisCluster.hgetAll("HashKey"); //通过java中移除HashMap中的Key ruleMap.remove("ruleA"

  • 浅谈redis key值内存消耗以及性能影响

    一.redis key数量为1千万时. 存储value为"0",比较小.如果value较大,则存储内存会增多 redis key数量为一千万时,使用了865M的内存. # Keyspace db0:keys=11100111,expires=0,avg_ttl=0 内存使用情况 # Memory used_memory:907730088 used_memory_human:865.68M used_memory_rss:979476480 used_memory_rss_human:

  • 解决RedisTemplate的key默认序列化器的问题

    redis的客户端换成了spring-boot-starter-data-redis,碰到了一个奇怪的问题, 在同一个方法中 1.先hset,再hget,正常获得数据. 在不同的方法中 先hset,再hget获取不到数据,通过redis的monitor监控发现了命令的问题: 实际我的key为JK_HASH:csrk,hashkey为user,但是根据上图所示,实际执行的命令多了好多其他字符,这是什么原因呢? 在服务器端先确认发现实际有这个Hash,通过hset可以得到正确的数据,所以第一次执行h

  • SpringBoot通过RedisTemplate执行Lua脚本的方法步骤

    lua 脚本 Redis 中使用 lua 脚本,我们需要注意的是,从 Redis 2.6.0后才支持 lua 脚本的执行. 使用 lua 脚本的好处: 原子操作:lua脚本是作为一个整体执行的,所以中间不会被其他命令插入. 减少网络开销:可以将多个请求通过脚本的形式一次发送,减少网络时延. 复用性:lua脚本可以常驻在redis内存中,所以在使用的时候,可以直接拿来复用,也减少了代码量. 1.RedisScript 首先你得引入spring-boot-starter-data-redis依赖,其

  • 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 = red

  • 详解Redis中Lua脚本的应用和实践

    引言 前段时间组内有个投票的产品,上线前考虑欠缺,导致被刷票严重.后来,通过研究,发现可以通过 redis lua 脚本实现限流,这里将 redis lua 脚本相关的知识分享出来,讲的不到位的地方还望斧正. redis lua 脚本相关命令 这一小节的内容是基本命令,可粗略阅读后跳过,等使用的时候再回来查询 redis 自 2.6.0 加入了 lua 脚本相关的命令,EVAL.EVALSHA.SCRIPT EXISTS.SCRIPT FLUSH.SCRIPT KILL.SCRIPT LOAD,

  • redis中lua脚本的简单使用

    一.背景 在使用redis的过程中,发现有些时候需要原子性去操作redis命令,而redis的lua脚本正好可以实现这一功能.比如: 扣减库存操作.限流操作等等. redis的pipelining虽然也可以一次执行一组命令,但是如果在这一组命令的执行过程中,需要根据上一步执行的结果做一些判断,则无法实现. 二.使用lua脚本 Redis中使用的是 Lua 5.1 的脚本规范,同时我们编写的脚本的时候,不需要定义 Lua 函数.同时也不能使用全局变量等等. 1.lua脚本的格式和注意事项 1.格式

  • redis执行lua脚本的实现方法

    目录 1. 语法格式 2.类型转换 3.lua脚本 3.1 script命令 3.2 脚本原子性 3.3 脚本缓存和EVALSHA 3.4 全局变量保护 3.5 日志记录 从redis 2.6.0版本开始,redis内置了Lua解释器,并提供了eval命令来解析Lua脚本求值. 1. 语法格式 语法: eval script numkeys keys args 参数: eval - redis提供解析lua脚本的命令          script - lua脚本           numke

  • Redis调用Lua脚本及使用场景快速掌握

    目录 一.阅读本文前置条件 二.为什么需要Lua脚本 三.学点Lua语法 3.1.一个简单的例子 3.2.仔细看下Lua脚本里的内容 3.3.复杂点的例子 四.Lua脚本预加载 五.一个修改JSON数据的例子? 六.总结 一.阅读本文前置条件 可以遵循这个链接中的方法在操作系统上安装 Redis 如果你对redis命令不熟悉,查看<Redis 命令引用> 二.为什么需要Lua脚本 简而言之:Lua脚本带来性能的提升. 很多应用的服务任务包含多步redis操作以及使用多个redis命令,这时你可

  • redis中lua脚本使用教程

    目录 一.背景 二.使用lua脚本 三.lua和redis数据类型转换 四.lua脚本中输出日志 五.一个简单限流的案例 六.lua脚本的debug 七.参考文档 一.背景 在使用redis的过程中,发现有些时候需要原子性去操作redis命令,而redis的lua脚本正好可以实现这一功能.比如: 扣减库存操作.限流操作等等. redis的pipelining虽然也可以一次执行一组命令,但是如果在这一组命令的执行过程中,需要根据上一步执行的结果做一些判断,则无法实现. 二.使用lua脚本 Redi

  • Redis中lua脚本实现及其应用场景

    目录 1. Redis Lua脚本概述 2. Redis Lua脚本的优势 3. Redis Lua脚本的应用场景 4. Redis Lua脚本的使用方法 5. java中使用redis的lua脚本 5.1. 添加Redis依赖 在pom.xml中添加以下依赖: 5.2. 配置Redis连接信息 在application.properties中添加以下配置: 5.3. 定义Redis Lua脚本 5.4. 实现RedisService 5.5. 编写Redis Lua脚本 5.6. 测试Redi

  • Redis执行Lua脚本的好处与示例代码

    前言 Redis从2.6版本开始引入对Lua脚本的支持,通过在服务器中嵌入Lua环境,Redis客户端可以使用Lua脚本,直接在服务端原子的执行多个Redis命令. 其中,使用EVAL命令可以直接对输入的脚本进行求值: redis>EVAL "return 'hello world'" 0 "hello world" 使用脚本的好处如下: 1.减少网络开销:本来5次网络请求的操作,可以用一个请求完成,原先5次请求的逻辑放在redis服务器上完成.使用脚本,减少

  • Redis中Lua脚本的使用和设置超时

    目录 EVAL命令简介 eval格式 特性 执行流程 关于脚本超时 SCRIPT KILL 命令 SHUTDOWN NOSAVE 命令 参考 Redis提供了Lua脚本功能来让用户实现自己的原子命令,但也存在着风险,编写不当的脚本可能阻塞线程导致整个Redis服务不可用. 本文将介绍Redis中Lua脚本的基本用法,以及脚本超时导致的问题和处理方式. EVAL命令简介 eval格式 Redis 提供了命令EVAL来执行Lua脚本,格式如下 EVAL script numkeys key [key

  • django模板获取list中指定索引的值方式

    格式: list.index 示例: {{ goods.0 }} 补充知识:使用Django从后端向前端页面中传递一个数组的方法 今天用Django框架时遇到一个坑,就是当前端页面接收后端传回来的数据时,该数据是一个列表形式,列表里有字符串类型的数据,然后就一直报错... 查了老半天才知道是django的自动转义搞的鬼! 那什么是转义呢,就是把html语言的关键字过滤掉.例如, 就是html的关键字,如果要在html页面上呈现, 其源代码就必须是<div> 标题默认情况下,django自动为开

随机推荐