Redis中的Lua脚本

news2025/2/25 3:21:19
EVAL 命令
命令格式
EVAL script numkeys key [key ...] arg [arg ...]
命令说明

1、script 参数:

  • 一段Lua脚本程序,会在Redis服务器上下文中运行,不需要(也不应该)定义为一个Lua函数。

2、numkeys 参数:

  • 指定键名参数的个数。

3、key [key …] 参数:

  • 从EVAL的第三个参数开始,使用了numkeys个键,这些键名参数可以在Lua中通过全局变量KEYS数组,用1为基址的形式访问(KEYS[1], KEYS[2]···)。

4、arg [arg …]参数:

  • 可以在Lua中通过全局变量ARGV数组访问,访问形式和KEYS变量类似(ARGV[1], ARGV[2]···)。
示例
eval "return {KEYS[1],KEYS[2],ARGV[1],ARGV[2]}" 2 key1 key2 first second

在这个示例中,key [key …] 参数的作用并不明显。其最大的作用是在Lua脚本中调用Redis命令。

Lua脚本中调用Redis命令

使用call()命令:

eval "return redis.call('mset',KEYS[1],ARGV[1],KEYS[2],ARGV[2])" 2 key1 key2 first second
EVALSHA 命令

EVAL命令每次执行脚本时都需要发送脚本,因此Redis提供了内部缓存机制,避免每次重新编译脚本。然而,这样会消耗带宽。为此,Redis提供了EVALSHA命令,其功能与EVAL相同,但接受的第一个参数是脚本的SHA1摘要。

借助script命令:

  • script flush:清除所有脚本缓存。
  • script exists:检查指定脚本是否存在于缓存中。
  • script load:将一个脚本装入缓存,返回SHA1摘要,但不立即运行。
  • script kill:终止当前正在运行的脚本。

生成SHA1摘要:

script load "return redis.call('set',KEYS[1],ARGV[1])"

然后执行脚本:

evalsha "c686f316aaf1eb01d5a4de1b0b63cd233010e63d" 1 key1 testscript
redis-cli 执行脚本

使用redis-cli命令直接执行脚本,新建一个Lua脚本文件来获取Redis中存入的key1值。编写Lua命令:

local value = redis.call('get','key1')
return value

然后执行:

./redis-cli -p 6379 --eval ../scripts/test.lua

或:

./redis-cli -p 6379 script load "$(cat ../scripts/test.lua)"

Redis与限流

使用Redis+Lua语言实现限流

项目代码示例:

项目代码示例

方案好处:

  • 分布式支持:Redis 本身是单线程的,但可以通过在多个实例上运行 Lua 脚本来实现分布式限流。

使用Lua脚本的好处:

  • 减少网络开销:Lua 脚本在服务器端执行,减少了客户端与服务器之间的通信次数。
  • 原子操作:整个限流逻辑作为一个原子操作执行,不会出现并发问题。
  • 复用:脚本可以被多个客户端复用,无需每个客户端都发送相同的限流逻辑。

示例代码

-- 简单的限流 Lua 脚本示例
local limit = tonumber(ARGV[1])  -- 限流大小
local key = KEYS[1]              -- 用于限流的 Redis key
local current = redis.call('get', key)

if current then
    if tonumber(current) >= limit then
        return 0  -- 达到限流大小,返回 0
    else
        -- 如果当前数量小于限流大小,增加计数
        redis.call('incr', key)
        return 1
    end
else
    -- 如果是第一次请求,设置 key 并过期
    redis.call('set', key, 1, 'EX', ARGV[2])  -- ARGV[2] 是过期时间
    return 1
end

这个脚本可以被 EVAL 命令执行,用于控制对某个资源的访问频率。

通过这种方式,Redis 的 Lua 脚本功能不仅提高了性能,还增加了 Redis 在复杂场景下的可用性。

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

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

相关文章

IT人的拖延——别让“需求沟通”耽误了你的正事

IT人的工作,很多“需求沟通”的场景,而在沟通需求时,又会因为沟通的不顺畅,没有结果而产生烦躁的情绪或者是悬而未决的不能开始行动,进而间接地造成了拖延。这种拖延的原因,需要从需求沟通的根源来找方案&a…

人工智能将成为数学家的“副驾驶”

人工智能将成为数学家的“副驾驶” 数学传统上是一门独立的科学。1986年,安德鲁怀尔斯为了证明费马定理,退到书房里呆了7年。由此产生的证明往往很难让同事们理解,有些至今仍有争议。但近年来,越来越多的数学领域被严格地分解为各…

汇编:EFLAGS寄存器

EFLAGS寄存器是x86架构处理器中的一个状态寄存器,用于存储当前处理器状态和控制特定操作;寄存器中的各个标志位可以影响指令执行,并且指令执行过程中也可以修改这些标志位,每个位都有特定的含义。 EFLAGS寄存器图示: …

振弦采集仪在隧道工程中的安全监测与控制研究

振弦采集仪在隧道工程中的安全监测与控制研究 隧道工程的安全监测与控制是保障隧道施工和运营安全的重要工作。隧道工程常面临的问题包括地层变形、地下水位变化、地震影响等,这些问题对隧道结构的安全性和使用寿命有着重要影响。因此,隧道工程中的安全…

【CS.AI】AI引领编程新时代:深度探索GitHub Copilot

文章目录 引言0. TOP TAKEAWAYS 重要要点1. Copilot的基本功能2. 技术原理3. 优势与局限优势局限 4. 使用体验4.1 初次使用4.2 在 JetBrains 全家桶中使用 GitHub Copilot1. 安装插件2. 配置插件3. 使用 GitHub Copilot 4.3 日常开发4.4 体验与反馈 5. 对开发者生态系统的影响5…

零碳产业园区建设指南案例

零碳产业园区的建设一直备受广泛关注,特别是在我国碳达峰碳中和的背景下。据不完全统计,目前,全国共有国家级和省级园区2500余家,这些园区在贡献了全国50%工业产出的同时,其CO2排放量也占到了全国排放总量的30%以上。作…

VMware安装ubuntu22.4虚拟机超详细图文教程

一 、下载镜像 下载地址:Index of /ubuntu-releases/22.04.4/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror 二、创建虚拟机 打开VMware点击左上角文件,创建新的虚拟机,打开后如下图: 下一步,镜像文件就是…

光纤跳线(又称光纤连接器)的种类

光纤跳线(又称光纤连接器),也就是接入光模块的光纤接头,也有好多种,且相互之间不可以互用。SFP模块接LC光纤连接器,而GBIC接的是SC光纤连接器。下面对网络工程中几种常用的光纤连接器进行详细的说明&#x…

3d交互式场景在线编辑平台的好处

在数字化教学的新时代,我们为您带来了革命性的产品——VR全景展示搭建编辑器。它将传统的教学方式升级为三维模式,让课程训练更加真实生动,为您带来前所未有的学习体验。 VR全景展示搭建编辑器不仅支持视频录播、PDF、图文等多种内容承载方式…

非阻塞IO简介和代码实例

接上篇 阻塞IO、非阻塞IO、IO多路复用和信号驱动IO简介-CSDN博客文章浏览阅读90次。阻塞IO、非阻塞IO、IO多路复用和信号驱动IO简介https://blog.csdn.net/CSDN_DU666666/article/details/139598410?csdn_share_tail%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%2…

Matlab|基于主从博弈的智能小区代理商定价策略及电动汽车充电管理

目录 一、主要内容 二、部分代码 三、程序结果 四、下载链接 一、主要内容 主要做的是一个电动汽车充电管理和智能小区代理商动态定价的问题,将代理商和车主各自追求利益最大化建模为主从博弈,上层以代理商的充电电价作为优化变量,下层以…

用PlayCanvas打造一个3D模型

本文由ScriptEcho平台提供技术支持 项目地址:传送门 基于 PlayCanvas 的 3D 物理场景开发 应用场景介绍 PlayCanvas 是一款功能强大的 3D 引擎,可用于创建各种类型的 3D 体验,包括游戏、模拟和交互式可视化。本技术博客将介绍如何使用 Pl…

低成本和颜值兼顾的 HomeLab 设备:HPE MicroServer Gen10(二)

本篇文章,继续分享另外一台端午假期折腾的设备,HP MicroServer Gen10 一代。同样分享下我的折腾思路,希望能够帮助到有类似需求的你。 写在前面 Gen10 “标准版”(第一代)和 Plus 版本设计风格一致,同样颜…

20240607在ubuntu下解压缩7z的压缩包文件

20240607在ubuntu下解压缩7z的压缩包文件 2024/6/7 10:26 百度:ubuntu 7z解压缩 在Ubuntu中,可以使用7z命令来解压.7z文件。首先,确保你已经安装了p7zip-full包,如果没有安装,可以使用以下命令安装: sudo …

预告|博睿数据将受邀出席GOPS全球运维大会北京站!

GOPS全球运维大会作为国内外运维领域最具影响力的技术盛会之一,旨在汇聚全球运维精英,分享运维领域的前沿技术、实践经验与创新理念。6月28日,博睿数据(bonree.com,股票代码688229)将受邀出席第二十三届 GO…

SQL入门到入土索引优化,聚合函数,数据备份与恢复,事务处理,查询、更新、插入和删除数据库

本人详解 作者:王文峰,参加过 CSDN 2020年度博客之星,《Java王大师王天师》 公众号:JAVA开发王大师,专注于天道酬勤的 Java 开发问题中国国学、传统文化和代码爱好者的程序人生,期待你的关注和支持!本人外号:神秘小峯 山峯 转载说明:务必注明来源(注明:作者:王文峰…

巨头 VC 间的博弈:一文了解 Paradigm 及 Lido 支持的再质押协议 Symbiotic

撰文:Yangz,Techub News 作为此轮牛市中少有的 DeFi 热门叙事,再质押赛道迎来又一位重磅选手。6 月 11 日,Symbiotic 宣布完成初步部署并在 Paradigm 和 Cyber Fund 领投的种子轮融资中筹集 580 万美元。上线 5 小时后&#xff0c…

FOXMAIL邮箱:高效办公,邮件管理新风尚

随着电子邮件在日常工作和生活中的普及,选择一个高效、易用的邮箱客户端变得尤为重要。FOXMAIL作为一款功能强大、操作简便的邮箱客户端,深受用户喜爱。下面将为您详细介绍FOXMAIL邮箱的使用方法,帮助您轻松掌握其各项功能。 一、下载安装与账…

C++中的结构体——结构体案例2

案例描述 设计一个英雄的结构体,包括成员姓名,年龄,性别;创建结构体数组,其中存放五名英雄 通过冒泡排序的算法,将数组中的英雄按照年龄升序排列,最终打印排序后的结果 五名英雄信息如下&…

OpenCV计算形状之间的相似度ShapeContextDistanceExtractor类的使用

操作系统:ubuntu22.04OpenCV版本:OpenCV4.9IDE:Visual Studio Code编程语言:C11 1.功能描述 ShapeContextDistanceExtractor是OpenCV库中的一个类,主要用于计算形状之间的相似度或距离。它是基于形状上下文(Shape Co…