Redis篇-5--原理篇4--Lua脚本

1、概述

Redis 支持使用 Lua 脚本来执行复杂的操作,这为 Redis 提供了更强的灵活性和性能优化能力。通过 Lua 脚本,你可以在服务器端执行一系列命令,而不需要多次往返客户端与服务器之间,从而减少了网络延迟并提高了效率。此外,Lua 脚本是原子性的,这意味着在脚本执行期间,其他客户端的请求不会被处理,确保了数据的一致性。

2、使用Lua脚本的好处

(1)、减少网络往返:将多个命令封装到一个脚本中,可以减少客户端与 Redis 服务器之间的通信次数。
(2)、提高性能:由于减少了网络延迟,并且脚本是在 Redis 服务器端直接执行的,因此可以显著提高性能。
(3)、保证原子性:Lua 脚本在执行时是原子性的,即在脚本执行期间,不会有其他命令插入,确保了操作的原子性和一致性。
(4)、复杂逻辑处理:可以实现更复杂的逻辑,比如条件判断、循环等,这些在普通的 Redis 命令中是无法实现的。

3、执行Lua脚本的方式

Redis 提供了两个命令来执行Lua脚本:

(1)、EVAL

作用:
用于执行一次性的Lua脚本。你需要提供完整的Lua代码作为参数,并指定脚本要操作的键以及可选的额外参数。
语法:
EVAL script numkeys key [key …] [arg [arg …]]
参数说明:

  • EVAL:这是Redis提供的命令,用于执行Lua脚本。
  • script:Lua脚本的内容,作为字符串传递给EVAL
  • numkeys:表示脚本中使用的键的数量。这些键将通过KEYS数组传递给Lua脚本。
  • key [key …]:实际的键名,按照顺序对应 KEYS 数组中的元素。
  • arg [arg …]:可选的额外参数,它们会通过 ARGV 数组传递给 Lua 脚本。

示例:
使用lua脚本打印aa的值。

EVAL "return redis.call('GET', KEYS[1])" 1 aa

在这里插入图片描述

(2)、EVALSHA

用于执行已经加载到 Redis 中的 Lua 脚本。你可以先使用 SCRIPT LOAD 将脚本加载到 Redis 中,然后通过其 SHA1 校验和来调用它。这样可以避免每次都传输整个脚本文本,节省带宽和解析时间。

示例:
首先加载脚本:

SCRIPT LOAD "return redis.call('GET', KEYS[1])"

然后使用EVALSHA执行:

EVALSHA d3c21d0c2b9ca22f82737626a27bcaf5d288f99f 1 aa

在这里插入图片描述

4、Lua 脚本中的Redis API

在 Lua 脚本中,可以使用 redis.call() 或 redis.pcall() 来调用 Redis 命令。这两个函数的区别在于错误处理方式:
(1)、redis.call():如果调用的 Redis 命令失败,会抛出错误并终止整个脚本的执行。
(2)、redis.pcall():即使调用的 Redis 命令失败,也会返回一个包含错误信息的表,而不是抛出错误,允许你继续执行脚本中的其他逻辑。

示例:
获取一个键的值,如果不存在则设置默认值并返回

EVAL "local value = redis.call('GET', KEYS[1]) \
                       if not value then \
                           redis.call('SET', KEYS[1], ARGV[1]) \
                           return ARGV[1] \
                       else \
                           return value \
                       end" 1 mykey "default_haha"

在这里插入图片描述
实际这里我没有设置过mykey,所以这段lua脚本会设置mykey为default_haha并发挥这个值。因为没有语法错误这里就正常执行了。也可以直接使用redisp.call来执行这段脚本,即使有错误也可以继续执行。

学海无涯苦作舟!!!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【数据库】关系代数和SQL语句

一 对于教学数据库的三个基本表 学生S(S#,SNAME,AGE,SEX) 学习SC(S#,C#,GRADE) 课程(C#,CNAME,TEACHER) (1)试用关系代数表达式和SQL语句表示:检索WANG同学不学的课程号 select C# from C where C# not in(select C# from SCwhere S# in…

【git】--- 通过 git 和 gitolite 管理单仓库的 SDK

在编程的艺术世界里,代码和灵感需要寻找到最佳的交融点,才能打造出令人为之惊叹的作品。而在这座秋知叶i博客的殿堂里,我们将共同追寻这种完美结合,为未来的世界留下属于我们的独特印记。【git】--- 通过 git 和 gitolite 管理单仓库的 SDK 开发环境一、安装配置 gitolite二…

HDFS高可用模式安装部署

实验步骤 将ZooKeeper集群模式启动获取安装包 安装包在本地:通过XFTP等工具将安装包上传到虚拟机中安装包在网络: 虚拟机可以访问互联网虚拟机无法访问互联网解压缩安装包将解压出来安装目录重命名配置环境变量刷新环境变量,使新增的环境变量…

mysql程序介绍,选项介绍(常用选项,指定选项的方式,特性),命令介绍(查看,部分命令),从sql文件执行sql语句的两种方法

目录 mysql程序 介绍 选项 介绍 常用选项 指定选项的方式 ​编辑配置文件 环境变量 选项特性 指定选项 选项名 选项值 命令 介绍 查看客户端命令 tee/notee prompt source system help contents 从.sql文件执行sql语句 介绍 方式 source 从外部直接导入…

PDF处理的创新工具:福昕低代码平台尝鲜实现PDF2word功能

在当今数字化时代,PDF文件的处理和管理变得越来越重要。福昕低代码平台是新发布的一款创新的工具,旨在简化PDF处理和管理的流程。通过这个平台,用户可以通过简单的拖拽界面上的按钮,轻松完成对Cloud API的调用工作流,而…

【C++】C++11(统一列表初始化、声明、右值引用)

🌈个人主页:秦jh_-CSDN博客🔥 系列专栏:https://blog.csdn.net/qinjh_/category_12575764.html?spm1001.2014.3001.5482 ​ 目录 C11简介 统一的列表初始化 {}初始化 std::initializer_list 声明 …

对比九种MySQL高可用方案

文章目录 一、读写分离如何在业务中落地什么时候需要读写分离MySQL 主从复制技术--binlog日志主从复制过程存在主从复制延时问题主从同步延迟的解决方案主从复制如何避免丢数据总结二、对比九种MySQL高可用方案组复制、半同步复制、异步复制主从复制方案选型-异步复制主从复制方…

再用RNN神经网络架构设计生成式语言模型

上一篇:《用谷歌经典ML方法方法来设计生成式人工智能语言模型》 序言:市场上所谓的开源大语言模型并不完全开源,通常只提供权重和少量工具,而架构、训练数据集、训练方法及代码等关键内容并未公开。因此,要真正掌握人…

httprunner实践样例

目录 1. 安装 HTTPRunner 2. 基本概念和目录结构 3. 编写一个 HTTPRunner 测试用例(YAML 示例) 4. 运行测试用例 5. 使用 Python 编写测试用例 6. 运行 Python 测试用例 7. 集成测试报告 8. 高级用法:集成环境变量、外部数据 9. 集成…

没有在 SCM 配置或者插件中的 Git 存储库配置错误

问题: jenkins 配置新项目后首次运行报错如下,同时git代码分支无法选择。 已返回默认值 没有在 SCM 配置或者插件中的 Git 存储库配置错误 选项"使用仓库"设置为:"http://xxxx.git 请检查配置 原因: 配置pipeline 脚本时指…

HBU深度学习实验15-循环神经网络(2)

LSTM的记忆能力实验 飞桨AI Studio星河社区-人工智能学习与实训社区 (baidu.com) 长短期记忆网络(Long Short-Term Memory Network,LSTM)是一种可以有效缓解长程依赖问题的循环神经网络.LSTM 的特点是引入了一个新的内部状态&am…

算法日记 46 day 图论(并查集)

题目:冗余连接 108. 冗余连接 (kamacoder.com) 题目描述 有一个图,它是一棵树,他是拥有 n 个节点(节点编号1到n)和 n - 1 条边的连通无环无向图(其实就是一个线形图),如图&#xff…

二叉树优选算法(一)

一、根据二叉树创建字符串 题目介绍: 给你二叉树的根节点 root ,请你采用前序遍历的方式,将二叉树转化为一个由括号和整数组成的字符串,返回构造出的字符串。 空节点使用一对空括号对 "()" 表示,转化后需…

RabbitMq死信队列延迟交换机

架构图 配置 package com.example.demo.config;import org.springframework.amqp.core.*; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration;Configuration public class DeadLetterConfig {public String …

JavaWeb学习--cookie和session,实现登录的记住我和验证码功能

目录 (一)Cookie概述 1.什么叫Cookie 2.Cookie规范 3.Cookie的覆盖 4.cookie的最大存活时间 ​​​​​​(Cookie的生命) (二) Cookie的API 1.创建Cookie:new 构造方法 2.保存到客户端浏…

开启第二阶段---蓝桥杯

一、12.10--数据类型的范围及转化 今天是刚开始,一天一道题 对于这道题我想要记录的是Java中的整数默认是 int 类型,如果数值超出了 int 的范围,就会发生溢出错误。为了避免这个问题,可以将数字表示为 long 类型,方法…

黑马头条学习笔记

Day01-环境搭建 项目概述 课程大纲 业务说明 技术栈 Spring-Cloud-Gateway : 微服务之前架设的网关服务,实现服务注册中的API请求路由,以及控制流速控制和熔断处理都是常用的架构手段,而这些功能Gateway天然支持 运用Spring Boot快速开发…

详解RabbitMQ在Ubuntu上的安装

​​​​​​​ 目录 Ubuntu 环境安装 安装Erlang 查看Erlang版本 退出命令 ​编辑安装RabbitMQ 确认安装结果 安装RabbitMQ管理界面 启动服务 查看服务状态 通过IP:port访问 添加管理员用户 给用户添加权限 再次访问 Ubuntu 环境安装 安装Erlang RabbitMq需要…

SpringBoot【二】yaml、properties两配置文件介绍及使用

一、前言 续上一篇咱们已经搭建好了一个springboot框架雏形。但是很多初学的小伙伴私信bug菌说,在开发项目中,为啥.yaml的配置文件也能配置,SpringBoot 是提供了两种2 种全局的配置文件嘛,这两种配置有何区别,能否给大…

Excel的文件导入遇到大文件时

Excel的文件导入向导如何把已导入数据排除 入起始行,选择从哪一行开始导入。 比如,前两行已经导入了,第二次导入的时候排除前两行,从第三行开始,就将导入起始行设置为3即可,且不勾选含标题行。 但遇到大文…