Redis(64)Redis的Lua脚本有哪些常见场景?

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

Redis 的 Lua 脚本可以极大提升操作的原子性和效率,特别适用于需要多个 Redis 命令组合执行的场景。以下是一些常见的使用场景,并结合代码进行详细说明。

1. 分布式锁

Redis 的 Lua 脚本常用于实现分布式锁,以确保多个客户端在并发访问时的互斥性。

示例:分布式锁的获取与释放

1-- 获取锁
2local lock_key = KEYS[1]
3local lock_value = ARGV[1]
4local ttl = tonumber(ARGV[2])
5
6if redis.call("SETNX", lock_key, lock_value) == 1 then
7    redis.call("PEXPIRE", lock_key, ttl)
8    return 1
9else
10    return 0
11end
12
1redis-cli EVAL "local lock_key = KEYS[1]; local lock_value = ARGV[1]; local ttl = tonumber(ARGV[2]); if redis.call('SETNX', lock_key, lock_value) == 1 then redis.call('PEXPIRE', lock_key, ttl); return 1; else return 0; end" 1 mylock lock_value 30000
2
1-- 释放锁
2local lock_key = KEYS[1]
3local lock_value = ARGV[1]
4
5if redis.call("GET", lock_key) == lock_value then
6    redis.call("DEL", lock_key)
7    return 1
8else
9    return 0
10end
11
1redis-cli EVAL "local lock_key = KEYS[1]; local lock_value = ARGV[1]; if redis.call('GET', lock_key) == lock_value then redis.call('DEL', lock_key); return 1; else return 0; end" 1 mylock lock_value
2

2. 计数器

实现自增、自减等计数器功能。

示例:原子性的自增操作

1local key = KEYS[1]
2local increment = tonumber(ARGV[1])
3
4local current = redis.call("GET", key)
5if current == false then
6    current = 0
7else
8    current = tonumber(current)
9end
10
11local new_value = current + increment
12redis.call("SET", key, new_value)
13return new_value
14
1redis-cli EVAL "local key = KEYS[1]; local increment = tonumber(ARGV[1]); local current = redis.call('GET', key); if current == false then current = 0; else current = tonumber(current); end; local new_value = current + increment; redis.call('SET', key, new_value); return new_value;" 1 mycounter 1
2

3. 事务性操作

Lua 脚本可以确保多条命令的原子性,避免使用事务的复杂性。

示例:转账操作

1local from_account = KEYS[1]
2local to_account = KEYS[2]
3local amount = tonumber(ARGV[1])
4
5local from_balance = tonumber(redis.call("GET", from_account))
6local to_balance = tonumber(redis.call("GET", to_account))
7
8if from_balance >= amount then
9    redis.call("DECRBY", from_account, amount)
10    redis.call("INCRBY", to_account, amount)
11    return 1
12else
13    return 0
14end
15
1redis-cli EVAL "local from_account = KEYS[1]; local to_account = KEYS[2]; local amount = tonumber(ARGV[1]); local from_balance = tonumber(redis.call('GET', from_account)); local to_balance = tonumber(redis.call('GET', to_account)); if from_balance >= amount then redis.call('DECRBY', from_account, amount); redis.call('INCRBY', to_account, amount); return 1; else return 0; end" 2 account1 account2 100
2

4. 排行榜

操作有序集合(sorted sets)实现排行榜功能。

示例:获取排行榜前 N 名

1local key = KEYS[1]
2local limit = tonumber(ARGV[1])
3
4return redis.call("ZRANGE", key, 0, limit - 1, "WITHSCORES")
5
1redis-cli EVAL "local key = KEYS[1]; local limit = tonumber(ARGV[1]); return redis.call('ZRANGE', key, 0, limit - 1, 'WITHSCORES');" 1 leaderboard 10
2

5. 队列操作

通过列表(list)实现任务队列。

示例:推送和弹出任务

1-- 推送任务到队列
2local queue_key = KEYS[1]
3local task = ARGV[1]
4
5redis.call("RPUSH", queue_key, task)
6return redis.call("LLEN", queue_key)
7
1redis-cli EVAL "local queue_key = KEYS[1]; local task = ARGV[1]; redis.call('RPUSH', queue_key, task); return redis.call('LLEN', queue_key);" 1 task_queue "task1"
2
1-- 弹出任务
2local queue_key = KEYS[1]
3
4local task = redis.call("LPOP", queue_key)
5if not task then
6    return nil
7else
8    return task
9end
10
1redis-cli EVAL "local queue_key = KEYS[1]; local task = redis.call('LPOP', queue_key); if not task then return nil; else return task; end" 1 task_queue
2

6. 限流器

实现简单的限流器,用于控制请求频率。

示例:限流脚本

1local key = KEYS[1]
2local limit = tonumber(ARGV[1])
3local interval = tonumber(ARGV[2])
4
5local current = tonumber(redis.call("GET", key) or "0")
6if current + 1 > limit then
7    return false
8else
9    redis.call("INCR", key)
10    if current == 0 then
11        redis.call("EXPIRE", key, interval)
12    end
13    return true
14end
15
1redis-cli EVAL "local key = KEYS[1]; local limit = tonumber(ARGV[1]); local interval = tonumber(ARGV[2]); local current = tonumber(redis.call('GET', key) or '0'); if current + 1 > limit then return false; else redis.call('INCR', key); if current == 0 then redis.call('EXPIRE', key, interval); end; return true; end" 1 rate_limit_key 10 60
2

总结

Redis 的 Lua 脚本强大且灵活,适用于多种场景。通过合理使用 Lua 脚本,可以确保操作的原子性、减少网络开销和提高系统性能。上述示例涵盖了常见的分布式锁、计数器、事务性操作、排行榜、队列操作和限流器等场景,为这些应用场景提供了高效、可靠的解决方案。


Redis(64)Redis的Lua脚本有哪些常见场景?》 是转载文章,点击查看原文


相关推荐


Python 的内置函数 bytearray
IMPYLH2025/10/14

Python 内建函数列表 > Python 的内置函数 bytearray class bytearray(x=b''): ''' 创建 bytearray :param x: 要转换的变量 :return: x 转换为 bytearray 后的值 ''' Python 的内置函数 bytearray 是一个可变序列,用于存储字节数据。它类似于 bytes 类型,但主要区别在于 bytearray 是可变的,而 bytes 是不可变的。以下是关于


【HarmonyOS AI赋能】朗读控件详解
GeorgeGcs2025/10/13

【HarmonyOS AI赋能】朗读控件详解 一、前言 鸿蒙系统提供了系统级别的朗读控件,来实现对文本进行朗读的业务需求。不需要复杂的SDK接入和集成,就可实现商业级别的朗读效果。 朗读控件分为听筒组件和朗读控制器,以及朗读面板三部分组成。 朗读面板又分为吸边小面板和全屏朗读面板。 需要注意的是,仅支持中国境内(不包含中国香港、中国澳门、中国台湾)提供服务。并且实时朗读的正文信息长度10000字符以内。 二、如何使用朗读控件? 以下代码为上图所示的DEMO源码,可直接新建工程后,贴到index


不止能聊,还能“动手”:谷歌AI代理掀起数字浪潮
墨风如雪2025/10/12

想象一下,你不再需要亲自盯着屏幕,点击鼠标,输入文字,一遍遍重复那些枯燥的在线操作。有一天,你只需对AI说一声:“帮我预订下周五的餐厅,找到离家最近的那个,并且确保能带宠物。”然后,它就能像一个训练有素的助手,熟练地在浏览器中穿梭,完成一系列复杂的任务——搜索、筛选、填写信息、预约…… 这并非遥远的科幻场景。就在最近,谷歌扔下了一颗重磅炸弹:Gemini 2.5 Computer Use模型正式登场。这不仅仅是一个新模型,更是谷歌向“计算机使用智能体”(CUA)这个未来战场吹响的号角,预示着AI


汽车软件开发的质量和安全管理流程
NewCarRen2025/10/10

摘要 软件开发流程是智能车辆(联网车辆和自动驾驶车辆)的核心,必须精心管理。自动化与联网功能的开发分别通过功能安全和网络安全开发流程实现,且需遵循相关标准,这些标准规定了流程、最佳实践、危害、威胁及管理策略。通过改进软件开发流程,智能车辆的人体工程学性能将得到提升。本文阐述了如何通过软件开发来管理实现自动化与联网功能的流程,以及是否可能改变管理团队的策略与软件开发流程。 1、引言 智能车辆是一种能够从周围环境中获取信息,并对信息进行处理,从而实现自主安全行驶且不造成任何伤害的车辆。此外,智


前端路由的秘密:手写一个迷你路由,看懂Hash和History的较量
良山有风来2025/10/9

你是不是也遇到过这样的场景?开发单页面应用时,页面跳转后刷新一下就404,或者URL里带着难看的#号,被产品经理吐槽不够优雅? 别担心,今天我就带你彻底搞懂前端路由的两种模式,手把手教你实现一个迷你路由,并告诉你什么场景该用哪种方案。 读完本文,你能获得一套完整的前端路由知识体系,从原理到实战,再到生产环境配置,一次性全搞定! 为什么需要前端路由? 想象一下,你正在开发一个后台管理系统。传统做法是每个页面都对应一个HTML文件,切换页面就要重新加载,体验特别差。 而前端路由让你可以在一个页面内实


Kubernetes核心技术与集群部署项目
企鹅侠客2025/10/7

从集群搭建到核心功能应用的完整流程,内容涵盖集群部署、核心组件、资源管理、安全机制、持久化、监控与应用交付等关键技术。首先介绍 Kubernetes 的架构与特性,深入讲解 kubeadm 与二进制两种集群搭建方式,包括 etcd 集群部署、Master 与 Node 组件安装、证书签发及高可用集群实现。核心技术部分系统解析 Pod 的运行机制、调度策略、健康检查与资源限制,讲解 Deployment、StatefulSet、DaemonSet、Job 等控制器的应用场景。配置管理方面介绍 Co


Nginx 配置负载均衡(详细版)
1加1等于2025/10/6

本文详细介绍关于Nginx 配置负载均衡,包括配置文件结构、多种负载均衡策略、如何修改均衡策略以及其他一些重要的配置。 本文目录 一、、Nginx 配置负载均衡1. 配置文件结构 二、Nginx 负载均衡策略1. 轮询(`默认策略`)2. 加权轮询3. IP 哈希4. 最少连接 三、修改负载均衡策略四、Nginx 负载均衡其他配置1. 健康检查2. 会话保持3. 超时设置 一、、Nginx 配置负载均衡 1. 配置文件结构 Nginx 的负载均衡配置主要


UNIX下C语言编程与实践16-UNIX 磁盘空间划分:引导块、超级块、i 节点区、数据区的功能解析
迎風吹頭髮2025/10/4

一、UNIX 磁盘空间划分的核心逻辑:为何分为四个区域? UNIX 文件系统在格式化时,会将磁盘分区(如 /dev/sda1)划分为引导块(Boot Block)、超级块(Super Block)、i 节点区(Inode Area)、数据区(Data Area)四个连续的区域。这种划分并非随意设计,而是为了实现“系统启动-文件系统管理-数据存储”的完整功能链路,确保磁盘空间的有序管理和高效访问。 核心定位:四个区域各司其职且相互依赖——引导块负责“启动系统”,超级块负责“管理文件系统全局信息


DeepSeek V3.1-Terminus、阿里 Qwen3-Max、ChatGPT Pulse 同周登场!| AI Weekly 9.22-9.28
AI信息Gap2025/10/3

卷,卷起来了! 📢 本周 AI 快讯 | 1 分钟速览🚀 1️⃣ 🚀 DeepSeek 发布 V3.1-Terminus :Agent 性能提升 28%,HLE 测试跃升全球第三,仅次于 Grok 4 和 GPT-5,SimpleQA 准确率达 96.8%。 2️⃣ 💰 阿里云栖大会七连发 :3800 亿 AI 基建投资起步,万亿参数 Qwen3-Max 对标 GPT-5,AIME 25 和 HMMT 数学测试满分 100 分。 3️⃣ 🖥️ Kimi 推出 OK Compu


[linux仓库]深入解析Linux动态链接与动态库加载:理解背后的原理与技巧
egoist20232025/10/2

🌟 各位看官好,我是egoist2023! 🌍 Linux == Linux is not Unix ! 🚀 今天来学习Linux的指令知识,并学会灵活使用这些指令。 👍 如果觉得这篇文章有帮助,欢迎您一键三连,分享更多人哦! 目录 进程如何看到动态库 进程间如何共享库 动态链接 编译器对可执行程序动手脚 动态库相对地址  程序如何和库具体映射 程序怎么进行库调用 全局偏移量表GOT 库间依赖(看看即可) 总结 进程如何看到动态库

首页编辑器站点地图

Copyright © 2025 聚合阅读

License: CC BY-SA 4.0