当前位置: 首页 > news >正文

Redis中Lua脚本的使用场景

Redis 中的 Lua 脚本可以用于多种场景,以下是一些常见的使用场景及其对应的 Java 实现示例。
通过使用 Lua 脚本,可以在 Redis 中实现复杂的逻辑和原子操作,同时利用 Java 客户端(如 Spring Data Redis)方便地执行这些脚本,提升性能并减少网络延迟。

文章目录

    • 1. 原子计数
    • 2. 条件更新
    • 3. 事务性操作
    • 4. 分布式锁
    • 5. 批量处理
    • 6. 计数器与过期管理
    • 7. 条件删除
    • 8. 数据聚合

1. 原子计数

场景:原子性地增加计数器。
Lua 脚本:
local current = redis.call(‘INCR’, KEYS[1])
return current
Java 实现:

String luaScript = "local current = redis.call('INCR', KEYS[1]) return current";
Long count = (Long) redisTemplate.execute(new DefaultRedisScript<>(luaScript, Long.class), Collections.singletonList("counter"));

2. 条件更新

场景:仅在当前值等于特定值时更新。
Lua 脚本:

local current = redis.call('GET', KEYS[1])
if current == ARGV[1] thenredis.call('SET', KEYS[1], ARGV[2])return true
elsereturn false
end
Java 实现:
String luaScript = "local current = redis.call('GET', KEYS[1]) " +"if current == ARGV[1] then " +"    redis.call('SET', KEYS[1], ARGV[2]) return true " +"else return false end";
Boolean updated = (Boolean) redisTemplate.execute(new DefaultRedisScript<>(luaScript, Boolean.class), Collections.singletonList("key"), "oldValue", "newValue");

3. 事务性操作

场景:获取一个键的值并删除该键。
Lua 脚本:

local value = redis.call('GET', KEYS[1])
redis.call('DEL', KEYS[1])
return value
Java 实现:
String luaScript = "local value = redis.call('GET', KEYS[1]) " +"redis.call('DEL', KEYS[1]) return value";
String value = (String) redisTemplate.execute(new DefaultRedisScript<>(luaScript, String.class), Collections.singletonList("key"));

4. 分布式锁

场景:确保某个操作的独占执行。
Lua 脚本:

if redis.call('SETNX', KEYS[1], ARGV[1]) == 1 thenredis.call('EXPIRE', KEYS[1], ARGV[2])return true
elsereturn false
end
Java 实现:
String luaScript = "if redis.call('SETNX', KEYS[1], ARGV[1]) == 1 then " +"    redis.call('EXPIRE', KEYS[1], ARGV[2]) return true " +"else return false end";
Boolean lockAcquired = (Boolean) redisTemplate.execute(new DefaultRedisScript<>(luaScript, Boolean.class), Collections.singletonList("lockKey"), "lockValue", "10");

5. 批量处理

场景:一次性获取多个键的值。
Lua 脚本:

local result = {}
for i = 1, #KEYS doresult[i] = redis.call('GET', KEYS[i])
end
return result
Java 实现:
String luaScript = "local result = {} " +"for i = 1, #KEYS do " +"    result[i] = redis.call('GET', KEYS[i]) " +"end return result";
List<String> values = (List<String>) redisTemplate.execute(new DefaultRedisScript<>(luaScript, List.class), Arrays.asList("key1", "key2", "key3"));

6. 计数器与过期管理

场景:网站访问计数,并设置过期时间。
Lua 脚本:

local current = redis.call('INCR', KEYS[1])
if current == 1 thenredis.call('EXPIRE', KEYS[1], ARGV[1])
end
return current
Java 实现:
String luaScript = "local current = redis.call('INCR', KEYS[1]) " +"if current == 1 then " +"    redis.call('EXPIRE', KEYS[1], ARGV[1]) " +"end return current";
Long visitCount = (Long) redisTemplate.execute(new DefaultRedisScript<>(luaScript, Long.class), Collections.singletonList("pageVisitCounter"), "60");

7. 条件删除

场景:在特定条件下删除键。
Lua 脚本:

local current = redis.call('GET', KEYS[1])
if current == ARGV[1] thenredis.call('DEL', KEYS[1])return true
elsereturn false
end
Java 实现:
String luaScript = "local current = redis.call('GET', KEYS[1]) " +"if current == ARGV[1] then " +"    redis.call('DEL', KEYS[1]) return true " +"else return false end";
Boolean deleted = (Boolean) redisTemplate.execute(new DefaultRedisScript<>(luaScript, Boolean.class), Collections.singletonList("key"), "valueToMatch");

8. 数据聚合

场景:计算多个值的总和。
Lua 脚本:

local sum = 0
for i = 1, #KEYS dosum = sum + tonumber(redis.call('GET', KEYS[i]) or 0)
end
return sum
Java 实现:
String luaScript = "local sum = 0 " +"for i = 1, #KEYS do " +"    sum = sum + tonumber(redis.call('GET', KEYS[i]) or 0) " +"end return sum";
Long total = (Long) redisTemplate.execute(new DefaultRedisScript<>(luaScript, Long.class), Arrays.asList("key1", "key2", "key3"));

相关文章:

Redis中Lua脚本的使用场景

Redis 中的 Lua 脚本可以用于多种场景&#xff0c;以下是一些常见的使用场景及其对应的 Java 实现示例。 通过使用 Lua 脚本&#xff0c;可以在 Redis 中实现复杂的逻辑和原子操作&#xff0c;同时利用 Java 客户端&#xff08;如 Spring Data Redis&#xff09;方便地执行这些…...

重工业数字化转型创新实践:某国家特大型钢铁企业如何快速落地基于实时数仓的数据分析平台

使用 TapData&#xff0c;化繁为简&#xff0c;摆脱手动搭建、维护数据管道的诸多烦扰&#xff0c;轻量替代 OGG, Kettle 等同步工具&#xff0c;以及基于 Kafka 的 ETL 解决方案&#xff0c;「CDC 流处理 数据集成」组合拳&#xff0c;加速仓内数据流转&#xff0c;帮助企业…...

【linux】手动启动sshd

安装openssh-server修改配置文件启动 以下是在常见的Linux系统中手动开启sshd服务的步骤&#xff1a; 1.安装openssh-server CentOS/RHEL系统 首先&#xff0c;以具有管理员权限的用户&#xff08;通常是root&#xff09;登录到系统。检查sshd服务是否已经安装。可以使用以…...

前端项目【本科期间】

1.基于博达网站群的申达办官方网站开发与维护 实习项目:校发展规划中心暨申请更名大学办公室官方网站 技术栈:HTML/CSS/Javascript 博达网站群的入门级指南 -CSDN博客博达网站群的入门级指南 -CSDN博客 网上少的较全的基于博达网站建设指南,CSDN相关内容综合指数NO有.1 …...

深度学习中的学习率调度:循环学习率、SGDR、1cycle 等方法介绍及实践策略研究

深度学习实践者都知道,在训练神经网络时,正确设置学习率是使模型达到良好性能的关键因素之一。学习率通常会在训练过程中根据某种调度策略进行动态调整。调度策略的选择对训练质量也有很大影响。 大多数实践者采用一些广泛使用的学习率调度策略,例如阶梯式衰减或余弦退火。这些…...

Python毕业设计-基于 Python flask 的前程无忧招聘可视化系统,Python大数据招聘爬虫可视化分析

博主介绍&#xff1a;✌Java徐师兄、7年大厂程序员经历。全网粉丝13w、csdn博客专家、掘金/华为云等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;&#x1f3fb; 不…...

Linux初阶——线程(Part1)

一、线程概念 1、如何理解线程 说到线程&#xff0c;那么我们就要回到进程了。 1.1. 再谈进程 对一个进程来说&#xff0c;它在内存中是这样的&#xff1a; 图1.1-a 其中一个 task_struct 独享一个进程地址空间和一个页表。 而线程其实和进程差不多&#xff0c;是这样的&…...

SpringBoot后端开发常用工具详细介绍——flyway数据库版本控制工具

文章目录 什么是flyway简介为什么要使用flyway 流程介绍整合springboot添加pom文件配置flyway向resource/db/migration添加sql文件 注意事项1. 迁移报错2. 迁移顺序 参考 什么是flyway 简介 为什么要使用flyway 我们在开发时往往会有这样一种情况&#xff1a; 进行软件开发…...

CSS揭秘:7. 伪随机背景

前置知识&#xff1a;CSS 渐变&#xff0c;5. 条纹背景&#xff0c;6. 复杂的背景图案 前言 本篇主要内容依然是关于背景的&#xff0c;无限平铺的背景会显得整齐美观&#xff0c;但又有些呆板&#xff0c;如何实现背景的多样性和随机性&#xff0c;是本篇的核心。 一、四种颜…...

SAP CODE DEMO:查找AL11 指定路径下文件中的内容

有时候需要查找某个具体的内容&#xff0c;在哪个文件内。数据量大的时候可以利用程序查找 选择界面&#xff1a; 路径&#xff0c;和文件名都可以模糊搜查 search string&#xff1a;你要查找的信息。 代码参考如下&#xff1a; report z00R010 NO STANDARD PAGE HEADING…...

【华为HCIP实战课程二十四】中间到中间系统协议IS-IS配置实战,网络工程师

一、IS-IS整体架构 将Level-1路由器部署在非骨干区域,Level-2路由器和Level-1-2路由器部署在骨干区域。 每一个非骨干区域都通过Level-1-2路由器与骨干区域相连! 1、在IS-IS中,每个链路可以属于不同的区域,OSPF中每个链路属于同一个区域 2、在IS-IS中,单个区域没有物理…...

【工具】新手礼包之git相关环境包括中文的一套流程{收集和整理},gitlab的使用

【工具】新手礼包之git相关环境包括中文的一套流程{收集和整理} git Git 详细安装教程&#xff08;详解 Git 安装过程的每一个步骤&#xff09; TortoiseGit 【TortoiseGit】TortoiseGit安装和配置详细说明...

篇章十一 打包构建工具

文章目录 一、gulp1. 流2. gulp 的作用3. gulp 的安装、检测和卸载 二、webpack1. 打包样式资源2. 打包 html 资源3. 打包图片资源4. 压缩 html 代码5. 生产环境基本配置 三、vite 打包构建工具&#xff0c;都是依赖于 node 环境进行开发&#xff0c;底层封装的内容就是 node 里…...

青少年编程与数学 02-002 Sql Server 数据库应用 06课题、数据库操作

青少年编程与数学 02-002 Sql Server 数据库应用 06课题、数据库操作 课题摘要:一、数据库的文件组成二、系统数据库三、创建数据库四、数据库配置1. 修改数据库文件大小和增长设置2. 添加或移除数据文件3. 设置数据库选项4. 配置数据库的恢复模型5. 管理数据库的访问权限6. 使…...

MacOS下载安装Logisim(图文教程)

本章教程主要介绍如何在MacOS系统中安装Logisim。 一、Logisim是什么? Logisim是一个用于电子逻辑门电路模拟的教育工具软件。它允许用户通过图形界面构建和测试复杂的数字逻辑电路,如加法器、解码器、编码器、寄存器、内存等,从而帮助学生理解计算机硬件的工作原理。 二、如…...

Flink CDC系列之:调研应用Flink CDC将 ELT 从 MySQL 流式传输到 StarRocks方案

Flink CDC系列之&#xff1a;调研应用Flink CDC将 ELT 从 MySQL 流式传输到 StarRocks方案 准备准备 Flink Standalone 集群准备 docker compose为 MySQL 准备记录使用 Flink CDC CLI 提交作业 同步架构和数据更改路由变更清理 本教程将展示如何使用 Flink CDC 快速构建从 MySQ…...

一次元空间FullGC导致OOM问题分析

原文&#xff0c;作者&#xff1a;kkyeer 原文需要翻墙&#xff0c;所以转载。 现象 观测平台告警&#xff1a;FullGC次数大于阈值&#xff0c;5分钟内大于11次&#xff0c;频次大概1-2周有一次 告警后服务概率性会自动恢复&#xff0c;控制台打印 Exception: java.lang.OutOf…...

Web前端开发工具和依赖安装

各种安装&#xff1a; node.js https://nodejs.org/zh-cn/ 安装完node.js 可以使用npm&#xff0c;npm跟随nodejs一起安装 node --version 查看已安装node.js的版本&#xff0c;确认是否安装nodejs npm -v 查看npm版本npm install <Module Name> 安装模块 npm insta…...

【学习心得】远程root用户访问服务器中的MySQL8

一、Ubuntu下的MySQL8安装 在Ubuntu系统中安装MySQL 8.0可以通过以下步骤进行1. 更新包管理工具的仓库列表&#xff1a; sudo apt update 2. 安装MySQL 8.0&#xff0c;root用户默认没有密码&#xff1a; sudo apt install mysql-server sudo apt install mysql-client 【…...

lust变频器维修电梯变频器CDD34.014.W2.1LSPC1

LUST伺服在安装时须注意&#xff0c;不可有任何的铁屑、螺丝、导线等掉人驱动器内。在安装完成后应作基本的检测动作&#xff0c;如对地阻抗&#xff0c;和短路检测等。 所有的安装及使用事项需要符合安全规定&#xff0c;并且也需要符合当地的相关规定和灾害预防措施。DC BUS…...

跨越地域限制:在线原型设计软件的自由与便捷

网络原型设计软件因其便捷性和灵活性&#xff0c;在现代设计工作中扮演着至关重要的角色。与传统的桌面端软件相比&#xff0c;网络原型设计工具无需安装&#xff0c;不受地域限制&#xff0c;且兼容各种操作系统&#xff0c;无论是Linux、Solaris、Mac还是Windows&#xff0c;…...

flash-waimai:高仿饿了么外卖平台,使用他轻松打造自己的外卖平台

嗨&#xff0c;大家好&#xff0c;我是小华同学&#xff0c;关注我们获得“最新、最全、最优质”开源项目和工作学习方法 flash-waimai 是一个完整的外卖平台解决方案&#xff0c;包括手机端、后台管理端和 API 服务。该项目仿照了饿了么的外卖服务&#xff0c;为用户提供了一个…...

2.5 塑性力学—应变状态

个人专栏—塑性力学 1.1 塑性力学基本概念 塑性力学基本概念 1.2 弹塑性材料的三杆桁架分析 弹塑性材料的三杆桁架分析 1.3 加载路径对桁架的影响 加载路径对桁架的影响 2.1 塑性力学——应力分析基本概念 应力分析基本概念 2.2 塑性力学——主应力、主方向、不变量 主应力、主…...

1.机器人抓取与操作介绍-深蓝学院

介绍 操作任务 操作 • Insertion • Pushing and sliding • 其它操作任务 抓取 • 两指&#xff08;平行夹爪&#xff09;抓取 • 灵巧手抓取 7轴 Franka 对应人的手臂 6轴 UR构型去掉一个自由度 课程大纲 Robotic Manipulation 操作 • Robotic manipulation refers…...

六,Linux基础环境搭建(CentOS7)- 安装HBase

Linux基础环境搭建&#xff08;CentOS7&#xff09;- 安装HBase 大家注意以下的环境搭建版本号&#xff0c;如果版本不匹配有可能出现问题&#xff01; 一、HBase下载及安装 HBase是一个分布式的、面向列的开源数据库&#xff0c;该技术来源于 Fay Chang 所撰写的Google论文“…...

《计算机网络网络层:连接虚拟世界的关键桥梁》

一、网络层概述 网络层在计算机网络中占据着至关重要的地位&#xff0c;它作为连接不同网络的关键层次&#xff0c;起着承上启下的作用。网络层的主要任务是实现网络互连&#xff0c;将数据设法从源端经过若干个中间节点传送到目的端&#xff0c;为分组交换网上的不同主机提供通…...

【AIGC】2024-arXiv-CtrLoRA:一种可扩展且高效的可控图像生成框架

2024-arXiv-CtrLoRA: An Extensible and Efficient Framework for Controllable Image Generation CtrLoRA&#xff1a;一种可扩展且高效的可控图像生成框架摘要1. 引言相关工作3. 方法3.1 准备工作3.3 有效适应新条件3.4 条件嵌入网络的设计 4. 实验4.1 实验设置4.2 与现有方法…...

立仪光谱共焦在玻璃上奥秘与应用

在现代工业和科学研究中&#xff0c;玻璃因其透明、坚硬和易加工的特性被广泛应用于各个领域。然而&#xff0c;玻璃的厚度测量一直是困扰业界的一大难题。传统的千分尺或电容式传感器虽然在一定程度上能满足生产需求&#xff0c;但在精度、效率以及适用范围上存在明显的局限。…...

【天气识别系统】Python+卷积神经网络算法+人工智能+深度学习+TensorFlow+算法模型训练+Django网页界面

一、介绍 天气识别系统&#xff0c;以Python作为主要编程语言&#xff0c;通过收集了4种常见的天气图像数据集&#xff08;多云、雨天、晴天、日出&#xff09;&#xff0c;然后基于TensorFlow搭建卷积神经网络算法模型&#xff0c;通过多轮迭代训练&#xff0c;最后得到一个识…...

MiniCTX:面向大语言模型定理证明的上下文相关基准测试系统

卡内基梅隆大学的研究人员推出MiniCTX&#xff0c;这是一个强大的基准测试系统&#xff0c;旨在通过整合前所未有的多重上下文元素&#xff08;包括前提、先前证明、注释、符号以及导入和声明等结构组件&#xff09;来彻底改变大型语言模型中定理证明能力的评估方式&#xff0c…...

上海企业网站推广方法/三只松鼠网络营销案例分析

1. 安装webstorm 2.安装nodejs http://nodejs.cn/download/ 查看安装的版本 3. cnpm https://npm.taobao.org/ cmd 里执行 npm install -g cnpm --registryhttps://registry.npm.taobao.org 下载老师的源码&#xff0c;解压 在D盘新建 D:\VueShop\ 把online-store 拷贝过来…...

万户网络做网站很垃圾/it行业培训机构一般多少钱

//释放PersonA 对象 那么我需要先把DogB release&#xff0c;然后在释放 [personA release];//清空指针personA nil; //------ 关于retainCount为1 、 -1 、 0 、 无穷大的条件 //1&#xff1a;为对象计数&#xff0c;当创建对象时或者对象即将释放时为1&#xff0c;即对象计…...

洛阳网站开发/seo关键词优化技术

xpath 省略中间路径在我的职业生涯的大部分时间里&#xff0c;我一直在从事软件开发工作&#xff0c;因此&#xff0c;即使我不止一次涉足解决方案工程&#xff0c;我还是把自己视为软件开发人员&#xff08;或软件架构师&#xff09;。 这肯定会对我如何看待架构景观产生影响&…...

内容不相关的网站做301重定向/免费的短视频app大全

网络协议的定义&#xff1a;为计算机网络中进行数据交换而建立的规则、标准或约定的集合。例如&#xff0c;网络中一个微机用户和一个大型主机的操作员进行通信&#xff0c;由于这两个数据终端所用字符集不同&#xff0c;因此操作员所输入的命令彼此不认识。为了能进行通信&…...

农村室内设计效果图/宁波seo关键词排名

苹果公布的业绩显示三季度它在大中华区的销售额同比下滑了28.5%&#xff0c;有分析认为这主要是因为中国手机企业抢走了它的市场&#xff0c;实际情况真的如此么&#xff1f;据市调机构Canalys公布的今年三季度中国智能手机市场的数据&#xff0c;苹果的出货量同比下滑1%&#…...

湛江电气建站软件/百度入口网页版

默认情况下&#xff0c;Graphics 绘图类使用的笔画属性是粗细为1个像素的正方形&#xff0c;而Java2D的Graphics2D类可以调用setStroke()方法设置笔画的属性&#xff0c;如改变线条的粗细、虚实和定义线段端点的形状、风格等。语法如下&#xff1a;setStroke(Stroke stroke)其中…...