Redis基础教程(十三):Redis lua脚本

news2025/2/23 12:36:20

💝💝💝首先,欢迎各位来到我的博客,很高兴能够在这里和您见面!希望您在这里不仅可以有所收获,同时也能感受到一份轻松欢乐的氛围,祝你生活愉快!
💝💝💝如有需要请大家订阅我的专栏【Redis系列】哟!我会定期更新相关系列的文章
💝💝💝关注!关注!!请关注!!!请大家关注下博主,您的支持是我不断创作的最大动力!!!

文章目录

    • 引言
    • 一、Redis脚本基础
      • `EVAL`命令
      • `EVALSHA`命令
    • 二、实战案例:实现事务性操作
      • 场景描述
      • 实战代码
    • 三、结论

引言

Redis 脚本功能是Redis提供的一种强大工具,允许用户在服务器端执行Lua脚本,从而实现复杂的数据处理逻辑和业务规则。通过在Redis内部执行脚本,可以显著减少网络延迟,提高数据处理的效率和响应速度。本文将深入探讨Redis脚本的使用方法,并通过详细的实战案例展示如何利用Lua脚本来优化数据操作。

一、Redis脚本基础

Redis使用Lua作为其脚本语言,Lua是一种轻量级、高效的脚本语言,非常适合用于编写简短且高效的脚本。Redis提供了EVALEVALSHA两个命令来执行Lua脚本。

EVAL命令

EVAL命令用于在Redis服务器上执行Lua脚本。它接受三个参数:脚本、键的数量以及键和参数的列表。

EVALSHA命令

EVALSHA命令类似于EVAL,但它使用SHA1摘要来引用脚本。当脚本首次执行时,Redis会计算其SHA1摘要并保存在服务器上。后续执行相同脚本时,可以直接使用SHA1摘要,避免了重新编译脚本的开销。

二、实战案例:实现事务性操作

场景描述

假设我们正在开发一个在线商城系统,需要在购物车中处理商品的增加和减少操作,同时确保库存的准确性。在高并发环境下,我们需要保证这些操作的原子性和一致性,避免超卖等情况的发生。

实战代码

我们将使用Redis脚本来实现一个原子性的购物车操作,包括增加和减少商品数量,同时检查库存是否充足。

-- Lua脚本定义
local function shoppingCartOperation(cartKey, inventoryKey, operation, quantity)
    -- 获取当前购物车中商品的数量
    local currentQuantity = tonumber(redis.call('HGET', cartKey, ARGV[1]))
    
    -- 检查库存
    local stock = tonumber(redis.call('GET', inventoryKey))
    
    -- 如果操作是增加,检查库存是否足够
    if operation == 'add' then
        if currentQuantity + quantity > stock then
            return 0 -- 库存不足,返回错误
        end
        redis.call('HINCRBY', cartKey, ARGV[1], quantity)
    elseif operation == 'subtract' then
        if currentQuantity < quantity then
            return 0 -- 购物车数量不足,返回错误
        end
        redis.call('HINCRBY', cartKey, ARGV[1], -quantity)
    end
    
    -- 更新库存
    redis.call('DECRBY', inventoryKey, quantity)
    
    return 1 -- 成功执行
end

-- 执行脚本
local cartKey = 'user:123:cart'
local inventoryKey = 'product:1:inventory'
local operation = 'add'
local quantity = 2
local productId = 'product:1'

local sha = redis.call('SCRIPT', 'LOAD', shoppingCartOperation)
redis.call('EVALSHA', sha, 2, cartKey, inventoryKey, operation, quantity, productId)

在这个例子中,我们定义了一个Lua脚本shoppingCartOperation,它接受购物车的键、库存的键、操作类型(增加或减少)以及操作的数量。脚本首先检查库存是否充足,然后根据操作类型更新购物车中的商品数量,最后更新库存。通过在Redis服务器端执行这个脚本,我们确保了操作的原子性和一致性,避免了并发环境下的数据竞争问题。

三、结论

Redis脚本功能,特别是Lua脚本,为处理复杂的数据操作和业务逻辑提供了强大的工具。通过在服务器端执行脚本,可以减少网络延迟,提高数据处理的效率。在实际项目中,合理地利用Redis脚本来封装复杂的业务规则,可以显著提高系统的性能和稳定性。掌握Redis脚本的使用,将帮助开发者在构建高性能、高并发的应用系统时更加得心应手。


喜欢博主的同学,请给博主一丢丢打赏吧↓↓↓您的支持是我不断创作的最大动力哟!感谢您的支持哦😘😘😘
打赏下吧

💝💝💝如有需要请大家订阅我的专栏【Redis系列】哟!我会定期更新相关系列的文章
💝💝💝关注!关注!!请关注!!!请大家关注下博主,您的支持是我不断创作的最大动力!!!

Redis相关文章索引文章链接
Redis基础教程(一):redis配置Redis基础教程(一):redis配置
Redis基础教程(二):redis数据类型Redis基础教程(二):redis数据类型
Redis基础教程(三):redis命令Redis基础教程(三):redis命令
Redis基础教程(四):redis键(key)Redis基础教程(四):redis键(key)
Redis基础教程(五):string字符串Redis基础教程(五):string字符串
Redis基础教程(六):redis 哈希(Hash)Redis基础教程(六):redis 哈希(Hash)
Redis基础教程(七):redis列表(List)Redis基础教程(七):redis列表(List)
Redis基础教程(八):redis集合(Set)Redis基础教程(八):redis集合(Set)
Redis基础教程(九):redis有序集合Redis基础教程(九):redis有序集合
Redis基础教程(十):HyperLogLogRedis基础教程(十):HyperLogLog
Redis基础教程(十一):Redis 发布订阅Redis基础教程(十一):Redis 发布订阅
Redis基础教程(十二):Redis事务Redis基础教程(十二):Redis事务

❤️❤️❤️觉得有用的话点个赞 👍🏻 呗。
❤️❤️❤️本人水平有限,如有纰漏,欢迎各位大佬评论批评指正!😄😄😄
💘💘💘如果觉得这篇文对你有帮助的话,也请给个点赞、收藏下吧,非常感谢!👍 👍 👍
🔥🔥🔥Stay Hungry Stay Foolish 道阻且长,行则将至,让我们一起加油吧!🌙🌙🌙

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

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

相关文章

vue3【提效】使用 VueUse 高效开发(工具库 @vueuse/core + 新增的组件库 @vueuse/components)

Vueuse 是一个功能强大的 Vue.js 生态系统工具库&#xff0c;提供了可重用的组件和函数&#xff0c;帮助开发者更轻松地构建复杂的应用程序。 官网 &#xff1a;https://vueuse.org/core/useWindowScroll/ 安装 VueUse npm i vueuse/core vueuse/components&#xff08;可选&a…

VideoAgent——使用大规模语言模型作为代理来理解长视频

概述 论文地址&#xff1a;https://arxiv.org/pdf/2403.10517 本研究引入了一个新颖的基于代理的系统&#xff0c;名为 VideoAgent。该系统以大规模语言模型为核心&#xff0c;负责识别关键信息以回答问题和编辑视频。VideoAgent 在具有挑战性的 EgoSchema 和 NExT-QA 基准上进…

讲个SystemVerilog随机约束小坑

正文 记录个在写SystemVerilog随机约束时遇到的一个小坑&#xff0c;如果没有认真去查看随机结果是否符合预期&#xff0c;还真不容易发现。 为了方便讲述&#xff0c;写了如下示例代码。类cl_a里有个随机变量aa&#xff0c;初始值为222。在module top里对类cl_a例化并进行约…

释放区块链数据科学的力量

如今&#xff0c;区块链技术和数据科学是两项最先进、最不可预测的技术。数据科学已被证明可以使用区块链技术作为原始数据源来了解有关系统运行的信息。 通过将区块链技术与数据科学相结合&#xff0c;软件开发、金融和其他领域的创造性改进已经成为可能。 在本文中&#xf…

【HTML】-解决页面内容无法选择、复制问题

目录 1、网页内容无法选中 1.1、问题原因 1.2、解决脚本 1.2.1、开启控制台窗口 1.2.2、执行脚本命令 2、内容复制弹出阻止框 2.2、解决脚本 1、网页内容无法选中 1.1、问题原因 今天在访问某一网站平台&#xff0c;需要将内容进行选择、复制时发现不可使用。 在使用…

MATLAB-分类CPO-RF-Adaboost冠豪猪优化器(CPO)优化RF随机森林结合Adaboost分类预测(二分类及多分类)

MATLAB-分类CPO-RF-Adaboost冠豪猪优化器&#xff08;CPO&#xff09;优化RF随机森林结合Adaboost分类预测&#xff08;二分类及多分类&#xff09; 分类CPO-RF-Adaboost冠豪猪优化器&#xff08;CPO&#xff09;优化RF随机森林结合Adaboost分类预测&#xff08;二分类及多分类…

[Vite]Vite插件生命周期了解

[Vite]Vite插件生命周期了解 Chunk和Bundle的概念 Chunk&#xff1a; 在 Vite 中&#xff0c;chunk 通常指的是应用程序中的一个代码片段&#xff0c;它是通过 Rollup 或其他打包工具在构建过程中生成的。每个 chunk 通常包含应用程序的一部分逻辑&#xff0c;可能是一个路由视…

公务员考试、事业编考试、教师资格证、面试、K12资料、电子书

点击上方△腾阳 关注 作者 l 腾阳 转载请联系授权 你好&#xff0c;我是腾阳。 在这个自媒体的海洋里&#xff0c;我曾是一只迷失方向的小鸟&#xff0c;多次尝试飞翔却总是跌跌撞撞。 但每一次跌倒&#xff0c;都让我更坚定地相信&#xff0c;只要不放弃&#xff0c;总…

---java KMP算法---

对于在一段字符串中查找一段字符串&#xff0c;如果用数组遍历的方法那就效率低下&#xff0c;所以产生了效率更高的KMP算法 KMP算法查只需要遍历一次字符串就可以找出第一次出现的目标字符串 要学的话建议区b站看视频&#xff0c;学着由视频学者比较容易 我这里就提供下我实…

html的作业

目录 作业题目 1.用户注册 A图 B代码 2.工商银行电子汇款单 A图 B代码 3.李白诗词 A图 B代码 4.豆瓣电影 A图 B代码 学习产出&#xff1a; 作业题目 1.用户注册 A图 B代码 <!DOCTYPE html> <html lang"zh"> <head><meta charset&qu…

rider使用libman

问题 rider没有libman的相关功能&#xff0c;需要使用cli 安装Libman dotnet tool install -g Microsoft.Web.LibraryManager.Cli # 如果存在可以尝试更新 dotnet tool update -g Microsoft.Web.LibraryManager.Cli查看命令 libman --help初始化 cdnjs官网 libman init安…

记录excel表生成一列按七天一个周期的方法

使用excel生成每七天一个周期的列。如下图所示&#xff1a; 针对第一列的生成办法&#xff0c;使用如下函数&#xff1a; TEXT(DATE(2024,1,1)(ROW()-2)*7,"yyyy/m/d")&" - "&TEXT(DATE(2024,1,1)(ROW()-1)*7-1,"yyyy/m/d") 特此记录。…

【PWN · ret2shellcode | sandbox-bypass | 格式化字符串】[2024CISCN · 华东北赛区]pwn1_

一道栈ret2shellcodesandbox&#xff08;seccomp&#xff09;格式化字符串的题目 前言 ret2shellcode&#xff0c;已经不是简单的放到栈上、ret这样一个简单的过程。套一层seccomp的沙箱&#xff0c;打ORW又遇到open受限等等&#xff0c;考虑的蛮多。过程中收获最多的可以说是…

Codeforces Round 903 (Div. 3)A~F

A.Dont Try to Count 输入样例&#xff1a; 12 1 5 a aaaaa 5 5 eforc force 2 5 ab ababa 3 5 aba ababa 4 3 babb bbb 5 1 aaaaa a 4 2 aabb ba 2 8 bk kbkbkbkb 12 2 fjdgmujlcont tf 2 2 aa aa 3 5 abb babba 1 19 m mmmmmmmmmmmmmmmmmmm输出样例&#xff1a; 3 1 2 -1 1 0…

密码学及其应用 —— 密码学的经典问题

1. 古典密码学问题 1.1 问题1&#xff1a;破解凯撒密码 1.1.1 问题 凯撒密码是最简单的单字母替换加密方案。这是一种通过将字母表中的字母固定向右移动几位来实现的加密方法。解密下面的文本&#xff0c;该文本通过对一个去除了空格的法语文本应用凯撒密码获得&#xff1a; …

IDEA越用越卡?教你轻松解决IDEA内存占用过高问题

大家好&#xff0c;我是瑶山&#xff0c;最近IDEA越用越卡了&#xff0c;刚刚内存卡爆&#xff0c;带着整个电脑也卡的飞起&#xff0c;只能重启了电脑。 虽然重启后又恢复到了流畅&#xff0c;但是问题还是如鲠在喉&#xff0c;痛定思痛&#xff0c;还是决定处理下&#xff01…

Debezium报错处理系列之第110篇: ERROR Error during binlog processing.Access denied

Debezium报错处理系列之第110篇:ERROR Error during binlog processing. Last offset stored = null, binlog reader near position = /4 Access denied; you need at least one of the REPLICATION SLAVE privilege for this operation 一、完整报错二、错误原因三、解决方法…

JVM原理(十七):JVM虚拟机即时编译器详解

编译器无论在何时、在何种状态下把Class文件转换成与本地基础设施相关的二进制机器码&#xff0c;他都可以视为整个编译过程的后端。 后端编译器编译性能的好坏、代码优化质量的高低却是衡量一款商用虛拟机优秀与否的关键指标之一。 1. 即时编译器 即时编译器是一个把Java的…

Linux安装达梦

文章目录 前言一、docker安装1.下载镜像2.导入镜像3.生成容器 二、ios安装1.环境准备2.iso安装3.配置实例4.注册服务5.启停服务 总结 前言 公司要求我将数据从oracle迁移到达梦数据库&#xff0c;这个国产数据库以前没用过&#xff0c;所以记录一下这次的安装过程。 一、docke…

基于PHP技术的在线校园美食攻略程序设计与实现

基于PHP技术的在线校园美食攻略程序设计与实现 摘 要 网络技术正在以空前持续的速度在改变着我们的生活。利用互联网技术&#xff0c;人们对网上食物共享越来越关注。基于此&#xff0c;本文利用 PHP技术&#xff0c;对网上大学饮食指南应用软件进行了研究。 整个系统的设计&a…