当前位置: 代码网 > it编程>数据库>Redis > redis执行lua脚本的实现

redis执行lua脚本的实现

2024年11月25日 Redis 我要评论
redis eval命令可以执行lua脚本,redis保证脚本执行的原子性,脚本由嵌入式执行引擎(lua 5.1解释器)执行。1,语法eval script numkeys [key [key ...

redis eval命令可以执行lua脚本,redis保证脚本执行的原子性,脚本由嵌入式执行引擎(lua 5.1解释器)执行。

1,语法

eval script numkeys [key [key ...]] [arg [arg ...]]

第一个参数 script 是脚本的源代码
第二个参数 numkeys 是输入键名参数的数量
后面的就是 key 和 参数。

例如:

> eval "return 'hello, scripting!'" 0
"hello, scripting!"

其中 "return 'hello, scripting!'" 就是lua脚本,后面的0就是没有key 也没有参数,可以看到redis返回的就是脚本的返回值。

还有一种方式就是 写一个固定的脚本传递参数,比如

> eval "return argv[1]" 0 'hello scripting'
"hello scripting"
> eval "return argv[1]" 0 hello scripting
"hello"
> eval "return argv[3]" 0 hello scripting
(nil)

可以看到是从[1] 开始获取,而不是[0],参数是以空格隔开,如果超出范围返回nil。

一个使用key的例子

> eval "return { keys[1], keys[2], argv[1], argv[2], argv[3] }" 2 key1 key2 arg1 arg2 arg3
1) "key1"
2) "key2"
3) "arg1"
4) "arg2"
5) "arg3"

可以看到这个lua脚本可以使用{}返回多个值。不知道这个在java 里面返回的是个字符串还是list。

2,调用redis命令

可以通过 redis.call() 或 redis.pcall() 从lua脚本调用redis命令。两者几乎相同,除了调用 redis.call() 函数时产生的错误会直接返回到执行该函数的客户端。相反,调用 redis.pcall() 函数时遇到的错误会返回到脚本的执行上下文。
例子:

> eval "return redis.call('set', keys[1], argv[1])" 1 foo bar
ok

简单的调用了一个set命令,看起来没有意义,但是多了可以保证原子性就有意义了,比如

> eval "local a=redis.call('set',keys[1],argv[1]) local b=redis.call('set',keys[2],argv[2]) return a and b" 2 k1 k2 v1 v2
ok

3,脚本缓存

> script load "return 'immabe a cached script'"
"c664a3bf70bd1d45c4284ffebb65a6f2299bfc9f"
> evalsha c664a3bf70bd1d45c4284ffebb65a6f2299bfc9f 0
"immabe a cached script"

可以看到使用script load 缓存一个脚本,返回一个id,之后可以通过evalsha id 来调用它。

至于lua脚本语言这个东西,摸索着写写就熟悉了。举几个例子:
获取并删除

local value = redis.call('get', keys[1]) if value then redis.call('del', keys[1]) return value else return nil end

解释,定义一个变量value如果获取到了keys[1]的值,就是删除这个值并返回ok否则返回nil,还可以写成

if redis.call('get', keys[1]) == argv[1] then return redis.call('del', keys[1]) else return 0 end

看起来跟shell脚本差不多吧。

到此这篇关于redis执行lua脚本的实现的文章就介绍到这了,更多相关redis执行lua脚本内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

  • Redis数据一致性详解

    1、一致性一致性是指系统中各节点数据保持一致。分布式系统中,可以理解为多个节点中的数据是一致的。一致性根据严苛程度分类:强一致性:写进去的数据是什么,读出来的数据就是什么,对性能影…

    2024年11月15日 数据库
  • 为Redis设置密码的三种方法

    为Redis设置密码的三种方法

    前言redis 是一个高性能的键值对数据库,广泛应用于缓存、消息队列等场景。为了保障 redis 服务的安全性,设置密码认证是非常重要的一步。方法一:通过编辑配... [阅读全文]
  • 使用Redis实现数据库对象自增ID的方法

    使用Redis实现数据库对象自增ID的方法

    在分布式项目中,数据表的主键id一般可能存在于uuid或自增id这两种形式,uuid好理解而且实现起来也最容易,但是缺点就是数据表中的主键id是32位的字符串,... [阅读全文]
  • RedisTemplate序列化设置的流程和具体步骤

    RedisTemplate序列化设置的流程和具体步骤

    流程概述下面是整个 redistemplate 序列化设置的流程图:具体步骤1. 创建 redistemplate 实例首先,我们需要创建一个 redistem... [阅读全文]
  • 基于Redis实现API接口访问次数限制

    一,概述日常开发中会有一个常见的需求,需要限制接口在单位时间内的访问次数,比如说某个免费的接口限制单个ip一分钟内只能访问5次。该怎么实现呢,通常大家都会想到用redis,确实通过…

    2024年11月13日 数据库
  • Redis主从复制的实现示例

    Redis主从复制的实现示例

    redis 主从复制主从复制是高可用redis的基础,哨兵和集群都是在主从复制基础上实现高可用的。主从复制主要实现了数据的多机备份,以及对于读操作的负载均衡和简... [阅读全文]

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com