Redis(63)Redis的Lua脚本如何使用?

作者:Victor356日期:2025/10/15

Redis 提供了对 Lua 脚本的支持,使得用户可以在服务器端执行原子操作,从而能够降低网络开销、提高性能和确保操作的原子性。以下是关于如何使用 Redis 的 Lua 脚本的详细指南,并结合实例代码进行说明。

1. 使用 Lua 脚本的基本命令

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

  • EVAL
  • EVALSHA

EVAL 命令

EVAL 命令用于直接执行 Lua 脚本。

语法:

1EVAL script numkeys key [key ...] arg [arg ...]
2
  • script: Lua 脚本。
  • numkeys: 脚本中的键的数量。
  • key [key ...]: 传递给脚本的键。
  • arg [arg ...]: 传递给脚本的参数。

EVALSHA 命令

EVALSHA 命令用于执行已经缓存过的 Lua 脚本,其 SHA1 哈希值作为脚本标识符。

语法:

1EVALSHA sha1 numkeys key [key ...] arg [arg ...]
2

2. Lua 脚本示例

示例 1:简单的计数器

我们编写一个简单的 Lua 脚本来实现计数器。

1local current = redis.call("GET", KEYS[1])
2if current == false then
3    redis.call("SET", KEYS[1], 1)
4    return 1
5else
6    redis.call("INCR", KEYS[1])
7    return redis.call("GET", KEYS[1])
8end
9

在 Redis 中执行此脚本:

1redis-cli EVAL "local current = redis.call('GET', KEYS[1]); if current == false then redis.call('SET', KEYS[1], 1); return 1; else redis.call('INCR', KEYS[1]); return redis.call('GET', KEYS[1]); end" 1 mycounter
2

示例 2:条件更新

一个示例 Lua 脚本,用于在满足特定条件下更新键的值。

1local currentValue = redis.call("GET", KEYS[1])
2if tonumber(currentValue) < tonumber(ARGV[1]) then
3    redis.call("SET", KEYS[1], ARGV[1])
4    return ARGV[1]
5else
6    return currentValue
7end
8

执行此脚本:

1redis-cli EVAL "local currentValue = redis.call('GET', KEYS[1]); if tonumber(currentValue) < tonumber(ARGV[1]) then redis.call('SET', KEYS[1], ARGV[1]); return ARGV[1]; else return currentValue; end" 1 mykey 100
2

3. Lua 脚本与 Redis 事务

Lua 脚本的一个重要特点是它们是原子的。在脚本执行期间,Redis 不会中断脚本去处理其他命令。

示例 3:原子性操作

1local balance = redis.call("GET", KEYS[1])
2local amt = tonumber(ARGV[1])
3if balance == false then
4    redis.call("SET", KEYS[1], amt)
5else
6    redis.call("INCRBY", KEYS[1], amt)
7end
8return redis.call("GET", KEYS[1])
9

执行此脚本:

1redis-cli EVAL "local balance = redis.call('GET', KEYS[1]); local amt = tonumber(ARGV[1]); if balance == false then redis.call('SET', KEYS[1], amt); else redis.call('INCRBY', KEYS[1], amt); end; return redis.call('GET', KEYS[1]);" 1 user:balance 50
2

4. 使用 EVALSHA 执行缓存脚本

首先,我们使用 EVAL 命令加载脚本并获取其 SHA1 哈希值。

示例 4:使用 EVALSHA

  1. 加载脚本并获取 SHA1 哈希值:
1$ redis-cli SCRIPT LOAD "local balance = redis.call('GET', KEYS[1]); local amt = tonumber(ARGV[1]); if balance == false then redis.call('SET', KEYS[1], amt); else redis.call('INCRBY', KEYS[1], amt); end; return redis.call('GET', KEYS[1]);"
2
3"e0c7a2d6c64616e9a7e1a0c0e51c8eb5bdbf7cbb"
4
  1. 使用 EVALSHA 执行脚本:
1$ redis-cli EVALSHA "e0c7a2d6c64616e9a7e1a0c0e51c8eb5bdbf7cbb" 1 user:balance 50
2

5. Lua 脚本的调试

为了调试 Lua 脚本,可以使用 Redis 提供的日志功能。可以通过 redis.log 将信息写入日志。

示例 5:调试脚本

1redis.log(redis.LOG_NOTICE, "Script started")
2local balance = redis.call("GET", KEYS[1])
3if balance == false then
4    redis.call("SET", KEYS[1], 0)
5    balance = 0
6end
7redis.log(redis.LOG_NOTICE, "Current balance: " .. balance)
8return balance
9

执行脚本:

1redis-cli EVAL "redis.log(redis.LOG_NOTICE, 'Script started'); local balance = redis.call('GET', KEYS[1]); if balance == false then redis.call('SET', KEYS[1], 0); balance = 0; end; redis.log(redis.LOG_NOTICE, 'Current balance: ' .. balance); return balance;" 1 user:balance
2

查看日志:

1tail -f /var/log/redis/redis.log
2

6. 使用 Lua 脚本操作 Redis 数据结构

Lua 脚本不仅可以操作简单键值对,还可以操作 Redis 提供的多种数据结构,如列表、集合、哈希等。

示例 6:操作列表

1local listName = KEYS[1]
2local newItem = ARGV[1]
3redis.call("RPUSH", listName, newItem)
4return redis.call("LRANGE", listName, 0, -1)
5

执行脚本:

1redis-cli EVAL "local listName = KEYS[1]; local newItem = ARGV[1]; redis.call('RPUSH', listName, newItem); return redis.call('LRANGE', listName, 0, -1);" 1 mylist item1
2

总结

通过 Lua 脚本,Redis 可以在服务器端执行复杂的逻辑操作,保证操作的原子性和高效性。本文详细介绍了如何使用 EVALEVALSHA 命令执行 Lua 脚本,并给出了多个示例代码,包括操作基本键值对和复杂数据结构、调试脚本和使用缓存脚本。通过合理使用 Lua 脚本,可以大大提升 Redis 的性能,并简化客户端的逻辑处理。


Redis(63)Redis的Lua脚本如何使用?》 是转载文章,点击查看原文


相关推荐


html5的新增标签
期待~明天2025/10/14

HTML5新增结构标签 HTML5引入了多个语义化标签,用于更清晰地描述网页结构: <header>:定义文档或节的页眉<footer>:定义文档或节的页脚<nav>:定义导航链接<article>:定义独立的内容块<section>:定义文档中的节<aside>:定义页面内容之外的内容(如侧栏) HTML5新增多媒体标签 为支持原生多媒体内容,新增以下标签: <audio>:嵌入音频内容<video>:嵌入视频内容<source>:为多媒体元素定义多种媒体资源<track>:为视频添


在实际项目中如何设计一个高可用的Spring Cloud Gateway集群?
IT橘子皮2025/10/12

在高可用架构中,Spring Cloud Gateway 集群的设计是关键环节。下面我将从核心架构、关键配置到生产级优化,为你梳理高可用网关集群的设计方案。 🏗️ 集群架构设计 构建高可用网关集群的核心是消除单点故障,并通过分层设计实现流量可靠分发。 ​核心模式​:标准的解决方案是部署多个 Gateway 实例,并在前端配置一个负载均衡器(如云服务商的SLB/ELB/ALB或自建的Nginx/HAProxy)作为统一的流量入口。所有外部请求先到达负载均衡器,再由其分发到后端的各个Gatewa


先用js快速开发,后续引入ts是否是一个好的实践?
你的人类朋友2025/10/11

前言 我在业余时间做一些小项目时,每次进行技术选型,都会有一个疑问: 应该直接使用 TypeScript 开发,还是先用 JavaScript 快速启动,后续再引入 TypeScript? 今天干脆来整理一下思路,方便后续复用这些想法 正文 一、快速开发的优势 先用 JavaScript 进行快速开发确实有其明显优势: 开发速度更快 无需类型定义和接口声明 跳过类型检查的编译步骤 ⭐ 【重要】特别适合【原型开发】和【概念验证】,个人认为这个是最重要的 学习成本低 更容易上手 ⭐ 【重要】减


深入解析 Vue 3 源码:computed 的底层实现原理
excel2025/10/9

在 Vue 3 的响应式系统中,computed 是一个非常重要的功能,它用于创建基于依赖自动更新的计算属性。本文将通过分析源码,理解 computed 的底层实现逻辑,帮助你从源码层面掌握它的原理。 一、computed 的基本使用 在使用层面上,computed 有两种常见用法: 1. 只读计算属性 const count = ref(1) const plusOne = computed(() => count.value + 1) console.log(plusOne.value)


CICD工具选型指南,Jenkins vs Arbess哪一款更好用?
高效研发之旅2025/10/8

Jenkins是一款常用的CICD工具,Arbess作为一款新兴的国产开源免费的CICD工具,两款工具各有特点。本文将从安装配置、功能特性、用户体验等几个方面对两款软件进行详细对比。 1、安装配置 项目 Jenkins Arbess 安装难度需要预装Java环境,需要手动配置端口和后台服务。一键安装,私有部署不同环境均支持傻瓜式一键安装。配置难度需要配置国内镜像源,安装核心插件零配置,安装后即刻可用,无需额外配置。支持操作系统支持Windows、ma


【征文计划】基于Rokid CXR-M SDK 打造AI 实时会议助手:从连接到自定义界面的完整实践
_摘星_2025/10/6

【征文计划】基于Rokid CXR-M SDK 打造AI 实时会议助手:从连接到自定义界面的完整实践 > **摘要**:本文基于 Rokid CXR-M SDK,详细阐述如何构建一个面向商务会议场景的“AI 实时会议助手”应用。通过手机端与 Rokid 智能眼镜的协同,实现语音转写、要点提炼、提词引导、多语翻译与会后纪要自动生成。文章涵盖从环境配置、蓝牙/Wi-Fi 连接、设备控制、AI 场景交互到自定义 UI 渲染的完整开发流程,并提供关键代码示例与最佳实践建议。 > > ![](https:


第4篇 vs2019+QT调用SDK连接海康相机显示图片
txwtech笛克电科2025/10/5

vs2019+QT调用SDK连接海康相机显示图片 连接,采图,获取与设置参数,曝光,增益,帧率 新建项目-文件结构: debug x64 调用类: TTcamera.cpp #include "TTcamera.h" #include <QDebug> TTcamera::TTcamera() { m_hDevHandle = NULL; m_pBufForSaveImage = nullptr; m_nBufSizeForSaveImage = 0;


AI 自动化测试:接口测试全流程自动化的实现方法
Jinkxs2025/10/4

在 AI 技术飞速渗透各行各业的当下,我们早已告别 “谈 AI 色变” 的观望阶段,迈入 “用 AI 提效” 的实战时代 💡。无论是代码编写时的智能辅助 💻、数据处理中的自动化流程 📊,还是行业场景里的精准解决方案 ,AI 正以润物细无声的方式,重构着我们的工作逻辑与行业生态 🌱。曾几何时,我们需要花费数小时查阅文档 📚、反复调试代码 ⚙️,或是在海量数据中手动筛选关键信息 ,而如今,一个智能工具 🧰、一次模型调用 ⚡,就能将这些繁琐工作的效率提升数倍 📈。正是在这样的变革中,AI


基于PyTorch的CIFAR10加载与TensorBoard可视化实践
StarPrayers.2025/10/3

视频学习来源:https://www.bilibili.com/video/BV1hE411t7RN?t=1.1&p=15 import torchvision from torch.utils.data import DataLoader from torch.utils.tensorboard import SummaryWriter from test_03 import writer # 添加 添加 download=True 参数来下载数据集 test_data = torchv


什么是 ONNX Runtime?
Cosolar2025/10/2

在人工智能技术飞速发展的今天,模型训练与部署之间的“鸿沟”始终是行业痛点——训练好的模型往往因框架差异、硬件限制等问题难以高效落地。而ONNX Runtime的出现,为这一难题提供了强有力的解决方案。作为微软开源的跨平台推理引擎,ONNX Runtime凭借其跨框架兼容性、全硬件加速能力和极致的性能优化,已成为AI模型部署领域的关键基础设施。本文将深入解析ONNX Runtime的核心价值、技术原理与应用场景,带你领略它如何为AI落地“加速”。 1、什么是ONNX Runtime? ONNX R

首页编辑器站点地图

Copyright © 2025 聚合阅读

License: CC BY-SA 4.0