Redis中使用lua脚本

news2025/1/12 13:25:23

微信公众号访问地址:Redis中使用lua脚本

推荐文章:

    1、springBoot对接kafka,批量、并发、异步获取消息,并动态、批量插入库表;

    2、SpringBoot用线程池ThreadPoolTaskExecutor异步处理百万级数据;

    3、为什么引入Redisson分布式锁?

    4、Redisson可重入锁原理

    5、SpringBoot整合多数据源,并支持动态新增与切换(详细教程)

一、简介

       Lua是一种轻量小巧的脚本语言,用标准C语言编写并以源代码形式开放,其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。参考网站:https://www.runoob.com/lua/lua-tutorial.html

1.2、应用场景:

  • 1、游戏开发

  • 2、独立应用脚本

  • 3、Web 应用脚本

  • 4、扩展和数据库插件如:MySQL Proxy 和 MySQL WorkBench

  • 5、安全系统,如入侵检测系统

1.3、在redis使用lua脚本的好处

      1、减少网络开销。可以将多个请求通过脚本的形式一次发送,减少网络时延及开销。

      2、原子性操作。Redis会将整个脚本作为一个整体执行,中间不会被其他请求插入。因此在脚本运行过程中无需担心会出现竞态条件,无需使用事务。

      3、复用。客户端发送的脚本会永久存在redis中,这样其他客户端可以复用这一脚本,而不需要使用代码完成相同的逻辑。

二、常见命令

2.1、EVAL命令

命令格式:EVAL script numkeys key [key …] arg [arg …]

参数说明:

      1、script:是 Lua5.1 脚本程序。此Lua脚本不需要也不应该定义函数,它运行在Redis服务器中。

      2、numkeys:键名参数的个数。即:key [key …]中key的个数。如没有key,则为0。

      3、key[]:键名参数,表示在脚本中所用到的那些Redis键(key),这些键名参数可以在Lua中通过全局变量KEYS数组。在Lua脚本中通过KEYS[1], KEYS[2]获取。

      4、arg [arg …] :不是键名参数的附加参数,可以在Lua中通过全局变量ARGV数组访问。在Lua脚本中通过ARGV[1],ARGV[2]获取。

参考案例如下:

127.0.0.1:6379> EVAL "return redis.call('set',KEYS[1],ARGV[1])" 1 name xiaoli01OK127.0.0.1:6379> GET name"xiaoli01"127.0.0.1:6379> EVAL "return redis.call('set',KEYS[1],ARGV[1])" 1 name02 xiaoli02OK127.0.0.1:6379> get name02"xiaoli02"

2.2、SCRIPT FLUSH 命令

命令格式:SCRIPT FLUSH作用:清除Redis服务端所有 Lua 脚本缓存

案例如下:

127.0.0.1:6379> SCRIPT EXISTS 1111111) (integer) 1127.0.0.1:6379> SCRIPT FLUSHOK127.0.0.1:6379> SCRIPT EXISTS 1111111) (integer) 0

2.3、SCRIPT KILL 命令

命令格式:SCRIPT FLUSH作用:杀死当前正在运行的 Lua 脚本,当且仅当这个脚本没有执行过任何写操作时,这个命令才生效。 这个命令主要用于终止运行时间过长的脚本,比如一个因为 BUG 而发生无限 loop 的脚本,诸如此类。

2.4、SCRIPT EXISTS 命令

命令格式:SCRIPT EXISTS sha1 [sha1 …]作用:给定一个或多个脚本的 SHA1 校验和,返回一个包含 0 和 1 的列表,表示校验和所指定的脚本是否已经被保存在缓存当中

参考案例如下:

127.0.0.1:6379> SCRIPT EXISTS 1111111) (integer) 1127.0.0.1:6379> SCRIPT EXISTS 2222221) (integer) 0127.0.0.1:6379> SCRIPT EXISTS 111111 2222221) (integer) 12) (integer) 0

三、具体业务使用案例

--unlock.lua脚本内容如下:

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

改进redis分布式锁

在java中调用:

//初始化Lua脚本文件    private static final DefaultRedisScript<Long> UNLOCK_SCRIPT;    static {        UNLOCK_SCRIPT = new DefaultRedisScript<>();        //lua脚本位置        UNLOCK_SCRIPT.setLocation(new ClassPathResource("luaFiles/unlock.lua"));        //返回值类型        UNLOCK_SCRIPT.setResultType(Long.class);    }  /**     * 功能描述:方法二:使用Lua脚本释放锁     * @MethodName: unlock     * @MethodParam: [lockKey, lockValue]     * @Return: void     * @Author: yyalin     * @CreateDate: 2023/8/13 16:09     */    public void unlock(String lockKey,String lockValue){        // 调用lua脚本        redisTemplate.execute(                UNLOCK_SCRIPT,                Collections.singletonList(lockKey),                lockValue);    }       

更多优秀文章,请关注个人微信公众号或搜索“程序猿小杨”查阅。

参考网站:

https://blog.csdn.net/weixin_42854904/article/details/124503054


如果这篇文章对您有所帮助、有所启发,请帮忙 分享、收藏、点赞、在看,您的支持就是我坚持下去的最大动力!谢谢!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/885938.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

60页数字政府智慧政务大数据资源平台项目可研方案PPT

导读&#xff1a;原文《60页数字政府智慧政务大数据资源平台项目可研方案PPT》&#xff08;获取来源见文尾&#xff09;&#xff0c;本文精选其中精华及架构部分&#xff0c;逻辑清晰、内容完整&#xff0c;为快速形成售前方案提供参考。 项目需求分析 项目建设原则和基本策略…

C++之类之间访问函数指针(一百八十一)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…

一、window配置微软商店中的Ubuntu,及错误解决方法

&#xff08;1&#xff09;首先&#xff0c;在微软商店中搜索“Ubuntu”&#xff0c;下载你喜欢的版本(此处) &#xff08;2&#xff09;设置适用于window的Linux子系统&#xff0c;跟着红色方框走 点击“确定”之后&#xff0c;会提示你重启电脑&#xff0c;按要求重启电脑即可…

无涯教程-Perl - sub函数

描述 此函数定义一个新的子例程。上面显示的参数遵循以下规则- NAME是子例程的名称。可以在有或没有原型规范的情况下预先声明命名的子例程(没有关联的代码块)。 匿名子例程必须具有定义。 PROTO定义了函数的原型,调用该函数以验证提供的参数时将使用该原型。 ATTRS为解析…

管理类联考——逻辑——真题篇——按知识分类——汇总篇——一、形式逻辑——假言—公式化转换—等价+矛盾

文章目录 第一节 假言—公式化转换—等价矛盾真题&#xff08;2012—38&#xff09;—假言—A→B的公式化转换—A→B的等价命题&#xff1a;①逆否命题&#xff1a;非B→非A。真题&#xff08;2015—47&#xff09; —假言A→B的公式化转换—A→B的等价命题&#xff1a;①逆否…

重新定义物化视图,你必须拥有的极速湖仓神器!

当今企业在进行数据分析时&#xff0c;面临着多重问题和挑战&#xff0c;而数据加工作为其中不可或缺的一环显得尤为重要。 首要的挑战在于数据加工的复杂性。从数据的产生到最终产生价值的整个链路仍然十分复杂&#xff0c;涉及多个环节和技术方案&#xff0c;这导致了技术复…

Java培训机构出来的好找工作吗?有的人还是没有工资!

Java培训机构出来的好找工作吗?为什么有的人找不到呢?事实上&#xff0c;参加Java培训机构并不是直接保证找到工作&#xff0c;而是提供了一定的学习和就业支持。以下是关于Java培训机构和就业的一些要点&#xff1a; 1.学习质量和教学内容 好的Java培训机构通常提供系统化、…

设计模式 : 单例模式笔记

文章目录 一.单例模式二.单例模式的两种实现方式饿汉模式懒汉模式 一.单例模式 一个类只能创建一个对象,这样的类的设计模式就称为单例模式,该模式保证系统中该类只能有一个实例(并且父子进程共享),一个很典型的单例类就是CSTL的内存池C单例模式的基本设计思路: 私有化构造函数…

海外应用ASO优化的小技巧2

应用程序的名称可以表达很多内容&#xff0c;是应用程序元数据的重要组成部分&#xff0c;一个强大的标题可以识别应用中的潜在消费者&#xff0c;使得用户看名字就可以知道这个程序是做什么的&#xff0c;从而有助于转化率的提高。 1、详细的标题可以更好地帮助我们的软件。 …

windows权限维持—黄金白银票据隐藏用户远控RustDeskGotoHttp

windows权限维持—黄金白银票据&隐藏用户&远控&RustDesk&GotoHttp 1. 前置1.1. 初始问题1.1.1. 解决办法 2. 隐藏用户2.1. 工具原理2.2. 案例操作2.2.1. 单机添加用户2.2.1.1. 工具添加用户2.2.1.2. 工具查看隐藏用户2.2.1.3. 本地查看隐藏用户 2.2.2. 域内添加…

机器学习丨1. 机器学习概述

Author&#xff1a;AXYZdong 硕士在读 工科男 有一点思考&#xff0c;有一点想法&#xff0c;有一点理性&#xff01; 定个小小目标&#xff0c;努力成为习惯&#xff01;在最美的年华遇见更好的自己&#xff01; CSDNAXYZdong&#xff0c;CSDN首发&#xff0c;AXYZdong原创 唯…

IT团队如何引领企业走向创造价值的新途径?

随着疫情结束带来的经济回暖&#xff0c;我们无疑已做好了更充分的准备。信息技术使许多企业能够在关门歇业的情况下继续运营&#xff0c;以防止大规模集会并强制执行社会隔离。得益于信息技术支持团队&#xff0c;许多企业能够动员其员工进行远程工作&#xff0c;有些甚至只需…

C++ template 循环

在元编程循环中&#xff0c;我们不需要用while&#xff0c;for来循环&#xff0c;一般情况下都要用递归&#xff0c;例如&#xff1a; #include <iostream> using namespace std; template <int Head, int...Data> constexpr static int num Head num<Data..…

企业类型的软件著作权证书申请,一次通过十几张

大家好&#xff0c;我是小悟 关于软件著作权证书申请的内容&#xff0c;已经聊过很多次了&#xff0c;之前申请的都是个人类型&#xff0c;尝试了一下申请企业类型的&#xff0c;一口气提交了多张&#xff0c;也都顺利通过了。 其实个人和企业类型所需要的资料并没有什么差别&…

flutter 常见的状态管理器

flutter 常见的状态管理器 前言一、Provider二、Bloc三、Redux四、GetX总结 前言 当我们构建复杂的移动应用时&#xff0c;有效的状态管理是至关重要的&#xff0c;因为应用的不同部分可能需要共享数据、相应用户交互并保持一致的状态。Flutter 中有多种状态管理解决方案&#…

Ubuntu安装Apache+Php

环境&#xff1a;ubuntu 22.04 虚拟机 首先更新一下 sudo apt-get update sudo apt-get upgrade安装Apache2&#xff1a; sudo apt-get install apache2 输入y&#xff0c;继续。等着他恐龙抗浪抗浪的下载安装就好了 打开浏览器访问http://localhost/ 安装php&#xff1a; …

Java学习路线来啦!看到就是赚到

“Java学习路线来啦”&#xff0c;Java作为一门常用的编程语言&#xff0c;因其广泛使用和应用&#xff0c;在IT行业中备受青睐。无论是初学者还是有一定基础的开发者&#xff0c;学习Java的路线和步骤都是必须的。下面小编将为大家推荐几个Java学习的必经之路。 一、Java编程基…

微信小程序纯前端从阿里云OSS下载json数据-完整版

起因 因为云开发开始收费(貌似很久了),准备改造在以前的小程序,数据转到oss上,小程序使用原生,不算专业领域, 所以先百度.... 网上的教程真的是千篇一律,大部分开局就是require(ali-oss); 好点的npm install ali-oss --save开局,拼凑操作到最后发现要用云开发,因为云…

【KVM虚拟化环境部署】

环境部署 KVM虚拟化环境 1、装系统时手动选择安装 2、CentOS 7 最小化安装 yum install qemu-kvm qemu-img libvirt -y yum install virt-install libvirt-python virt-manager python-virtinst libvirt-client -y安装好CentOS 7后&#xff0c;去设置里面点击处理器&#x…

智能水表抄表解决方案

对于传统的水表抄表方式存在的繁琐、耗时以及人为误差等问题&#xff0c;提出了智能水表抄表解决方案&#xff0c;让水表管理更加智能高效。 以智能抄表TSM-MR为例&#xff1a;采用最新的人工智能图像识别技术&#xff0c;能识别各类水表数据&#xff0c;辅助大数据进行纠错&a…