【Redis】Redis 的学习教程(十二)之在 Redis使用 lua 脚本

这篇具有很好参考价值的文章主要介绍了【Redis】Redis 的学习教程(十二)之在 Redis使用 lua 脚本。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

lua 菜鸟教程:https://www.runoob.com/lua/lua-tutorial.html

在 Redis 使用 lua 脚本的好处:

  1. 减少网络开销。可以将多个请求通过脚本的形式一次发送,减少网络时延及开销
  2. 原子性操作。Redis会将整个脚本作为一个整体执行,中间不会被其他请求插入。因此在脚本运行过程中无需担心会出现竞态条件,无需使用事务
  3. 复用。客户端发送的脚本会永久存在redis中,这样其他客户端可以复用这一脚本,而不需要使用代码完成相同的逻辑

1. 常用命令

  • EVAL:将脚本 script 添加到脚本缓存中,并且立即执行这个脚本
    • 语法:EVAL script numkeys key [key …] arg [arg …]
    • 参数含义:
      • script:是 Lua5.1 脚本程序。此Lua脚本不需要也不应该定义函数,它运行在 Redis 服务器中
      • numkeys:键名参数的个数。即:key [key …] 中 key 的个数。如没有 key,则为 0
      • key[]:键名参数,表示在脚本中所用到的那些 Redis 键(key),这些键名参数可以在 lua 中通过全局变量 KEYS 数组。在 lua 脚本中通过 KEYS[1],KEYS[2] 获取
      • arg [arg …] :不是键名参数的附加参数,可以在 lua 中通过全局变量 ARGV 数组访问。在 lua 脚本中通过 ARGV[1],ARGV[2] 获取
    • 案例
      1. 调用 set 方法:EVAL "return redis.call('set', 'name', 'bob')" 0
      2. 调用 set 方法(使用参数):EVAL "return redis.call('set', KEYS[1], ARGV[1])" 1 name jack
  • EVALSHA:根据给定的 sha1 校验码,执行缓存在服务器中的脚本。将脚本缓存到服务器的操作可以通过 SCRIPT LOAD 命令进行。这个命令的其他地方,比如参数的传入方式,都和 EVAL 命令一样
    • 语法:EVALSHA sha1 numkeys key [key ...] arg [arg ...]
  • SCRIPT LOAD:将脚本 script 添加到脚本缓存中,但并不立即执行这个脚本。 在脚本被加入到缓存之后,通过 EVALSHA 命令,可以使用脚本的 SHA1 校验和来调用这个脚本。
    脚本可以在缓存中保留无限长的时间,直到执行 SCRIPT FLUSH 为止
    • 语法:SCRIPT LOAD script
    • 返回:脚本的 SHA1 校验和
  • SCRIPT EXISTS:校验指定的脚本是否已经被保存在缓存当中
    • 语法:SCRIPT EXISTS sha1 [sha1 ...]
  • SCRIPT FLUSH:清除 Redis 服务端所有 lua 脚本缓存
  • SCRIPT KILL用于杀死当前正在运行的 lua 脚本,当且仅当这个脚本没有执行过任何写操作时,这个命令才生效。这个命令主要用于终止运行时间过长的脚本,比如一个因为 BUG 而发生无限循环的脚本

案例:

redis 127.0.0.1:6379> SCRIPT LOAD "return 'hello moto'"    # 载入一个脚本
"232fd51614574cf0867b83d384a5e898cfd24e5a"

redis 127.0.0.1:6379> SCRIPT EXISTS 232fd51614574cf0867b83d384a5e898cfd24e5a
1) (integer) 1

redis 127.0.0.1:6379> SCRIPT FLUSH     # 清空缓存
OK

redis 127.0.0.1:6379> SCRIPT EXISTS 232fd51614574cf0867b83d384a5e898cfd24e5a
1) (integer) 0

2. 具体业务使用案例

基于 Redis 的分布式锁

释放锁的流程:

  1. 获取锁中的线程标识
  2. 判断是否与指定的标识(当前线程标识)一致
  3. 如果一致,则删除;否则,什么都不做

unlock.lua 如下:resources/unlock.lua

-- 比较线程标示与锁中的标示是否一致
if(redis.call('get', KEYS[1]) ==  ARGV[1]) then
    -- 释放锁 del key
    return redis.call('del', KEYS[1])
end
return 0

在 Java 中调用:文章来源地址https://www.toymoban.com/news/detail-730379.html

// 初始化 lua 脚本文件
private static final DefaultRedisScript<Long> UNLOCK_SCRIPT;
static {
    UNLOCK_SCRIPT = new DefaultRedisScript<>();
    //lua脚本位置
    UNLOCK_SCRIPT.setLocation(new ClassPathResource("unlock.lua"));
    //返回值类型
    UNLOCK_SCRIPT.setResultType(Long.class);
}

// 使用 lua 脚本释放锁
public void unlock(String lockKey,String lockValue){
    // 调用lua脚本
    redisTemplate.execute(
            UNLOCK_SCRIPT,
            Collections.singletonList(lockKey),
            lockValue);
}

到了这里,关于【Redis】Redis 的学习教程(十二)之在 Redis使用 lua 脚本的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【深度学习】Pytorch 系列教程(十二):PyTorch数据结构:4、数据集(Dataset)

             目录 一、前言 二、实验环境 三、PyTorch数据结构 0、分类 1、张量(Tensor) 2、张量操作(Tensor Operations) 3、变量(Variable) 4、数据集(Dataset) 随机洗牌           ChatGPT:         PyTorch是一个开源的机器学习框架,广泛应用于深度学习领域。它提供了丰富

    2024年02月07日
    浏览(44)
  • Java生态/Redis中如何使用Lua脚本

    Mac上安装LUA很简单,直接使用 brew 相关命令; 使用 lua -v 命令可以看到lua已经安装完毕。 创建一个test.lua文件,内容为: 执行命令: 输出为: Lua 提供了交互式编程和脚本式编程: 交互式编程:直接在命令行中输入语法,可以立即执行并查看到执行效果。 脚本是编程:编写

    2024年01月20日
    浏览(63)
  • Spring Boot - 结合 Redis 使用 Lua脚本

    在Spring Boot中整合Redis并使用Lua脚本: 添加Spring Boot和Redis的依赖: 首先,在Spring Boot项目的 pom.xml 文件中添加Spring Boot和Spring Data Redis的依赖: 配置Redis连接: 在 application.properties 或 application.yml 中配置Redis的连接信息,以及 redis 配置: RedisConfig.java

    2024年02月08日
    浏览(43)
  • lua脚本的基本语法,以及Redis中简单使用

    Lua 脚本的基本语法如下: 变量与赋值: 变量名可以是字母、数字和下划线的组合,以字母或下划线开头。Lua 是动态类型语言,无需事先声明变量类型。 控制结构: a) 条件语句: b) 循环语句: 函数定义: 函数可以有参数和返回值。 表(table): 表是 Lua 中的一种数据结构

    2024年02月04日
    浏览(51)
  • 【深度学习】 Python 和 NumPy 系列教程(十二):NumPy详解:4、数组广播;5、排序操作

    目录 一、前言 二、实验环境 三、NumPy 0、多维数组对象(ndarray) 多维数组的属性 1、创建数组 2、数组操作 3、数组数学 4、数组广播 5、排序操作 1. np.sort() 函数 2. np.argsort() 函数 3. ndarray.sort() 方法 4. 按列或行排序 5. np.lexsort() 函数 6. np.partition() 函数 7. np.argpartition() 函

    2024年02月08日
    浏览(67)
  • 【MYSQL】MYSQL 的学习教程(十二)之 MySQL 啥时候用记录锁,啥时候用间隙锁

    在「读未提交」和「读已提交」隔离级别下,都只会使用 记录锁 ;而对于「可重复读」隔离级别来说,会使用 记录锁、间隙锁和 Next-Key 锁 那么 MySQL 啥时候会用记录锁,啥时候会用间隙锁,啥时候又会用 Next-Key 锁呢? 影响其使用哪种行级锁的因素有: 索引类型(聚簇索引

    2024年02月02日
    浏览(40)
  • 在 Redis 中使用 Lua 脚本执行复杂操作和事务

    在 Redis 中使用 Lua 脚本执行复杂操作和事务 Redis 作为一个高性能的键值存储数据库,它的强大功能远不止于简单的数据存储和检索。Redis 自 2.6 版本起引入了对 Lua 脚本的支持,这意味着你可以在 Redis 服务器上直接运行 Lua 脚本。这一功能为执行复杂的操作和事务提供了强大

    2024年01月25日
    浏览(51)
  • 在Springboot项目中使用Redis提供给Lua的脚本

    在Spring Boot项目中,你可以使用RedisTemplate来执行Lua脚本。RedisTemplate是Spring Data Redis提供的一个Redis客户端,它可以方便地与Redis进行交互。以下是使用RedisTemplate执行Lua脚本的一般步骤: 添加Spring Data Redis依赖: 首先,确保你的Spring Boot项目中已经添加了Spring Data Redis依赖。你可

    2024年02月07日
    浏览(36)
  • 【Redis】Redis 的学习教程(一)入门基础

    Redis 全称: Remote Dictionary Server(远程字典服务器) ,是一款开源的,遵守 BSD 协议,使用 C 语言开发的 key-value 存储系统。简单的说,它是一款跨平台的非关系型数据库,支持优先内存存储, 并提供多种语言的 API 客户端 虽然开源软件市场上也有很多优秀的缓存服务中间件,

    2024年02月12日
    浏览(39)
  • Redis 读写分离 使用redisTemplate执行lua脚本时,报错处理

    项目配置 redis架构 1主2从3哨兵模式 采用了读写分离模式 springboot使用 luttuce 项目使用redisTemplate执行lua脚本 测试代码 大致意思是说 在从节点上执行 写操作(实际上写操作是在lua脚本里面的) 为什么执行lua脚本会只走从节点? 在主从模式下,框架自身应该是可以区分读和写

    2024年02月17日
    浏览(50)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包