Redis结合Lua脚本的简单使用

我们就拿购物车举例子

现在有5个东西免费送,我们只能选择1个

例如 可乐 美年达 香蕉 苹果 薯片

我们选择后就放进redis里面

然后我们不能选重复,只能选不同

Lua脚本

我们redis使用lua脚本的时候,会传两个参数进去

一个是List<String>类型,一个是Object【】类型

KEYS【】对应的是List类型       ARGV【】对应的是Object【】类型

-- 购物车的东西是一样的,不需要修改
if (redis.call('get', KEYS[1]) == ARGV[1]) thenreturn 0
elseif (redis.call('get', KEYS[1]) ~= '') then-- 购物车的东西是不一样的,需要修改-- 先删除redis.call('del', KEYS[1])--然后重新设置购物车redis.call('set', KEYS[1], ARGV[1])
elseif (redis.call('get', KEYS[1]) == '') then--购物车为空,直接添加redis.call('set', KEYS[1], ARGV[1])
endreturn 0

静态代码块读取Lua脚本,减少IO流

案例

我们首先往购物车里面添加苹果

然后使用execute()方法调用Lua脚本

然后传参数进去

此时我们的lua脚本用的是ARGV【1】

对应的是香蕉

我们使用后,发现redis里面变成香蕉了

如果我们像变成其他,那么在lua脚本中的ARGV【】参数里面改数字就好了

测试类代码

package com.example.admin;import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.core.io.ClassPathResource;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.core.script.DefaultRedisScript;import java.util.ArrayList;
import java.util.List;@SpringBootTest
public class RedisTest {//为了防止每次加载都读取lua文件产生大量IO流,所以我们弄成静态代码块直接就读取好
private static final DefaultRedisScript UNLOCK_SCKIP;
static {UNLOCK_SCKIP=new DefaultRedisScript<>();UNLOCK_SCKIP.setLocation(new ClassPathResource("unlock.lua"));
}@AutowiredStringRedisTemplate stringRedisTemplate;@Test
void add(){stringRedisTemplate.opsForValue().set("购物车", "苹果");}@Testvoid change(){//苹果,香蕉,可乐,美年达,薯片List<String> list=new ArrayList<>();list.add("购物车");
//调用LUA脚本stringRedisTemplate.execute(UNLOCK_SCKIP,list,"香蕉","苹果","可乐","美年达","薯片");}}

Lua脚本实现限流操作

这个是lua脚本


-- 设置用户访问频率限制的参数
local username = KEYS[1]
local timeWindow = tonumber(ARGV[1]) -- 时间窗口,单位:秒-- 构造 Redis 中存储用户访问次数的键名
local accessKey = "short-link:user-flow-risk-control:" .. username-- 原子递增访问次数,并获取递增后的值
local currentAccessCount = redis.call("INCR", accessKey)-- 设置键的过期时间
redis.call("EXPIRE", accessKey, timeWindow)--返回当前次数
return currentAccessCount

因为我们要使用到lua脚本的返回值

所以我们要setResultType()来设置我们的返回值是String类型

这样子才能成功拿到返回值,亲测如果不设置,那么我们拿到的返回值就是为null

测试

测试类代码

package com.example.admin;import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.core.io.ClassPathResource;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.core.script.DefaultRedisScript;import java.util.ArrayList;
import java.util.List;@SpringBootTest
public class RedisTest {//为了防止每次加载都读取lua文件产生大量IO流,所以我们弄成静态代码块直接就读取好
private static final DefaultRedisScript UNLOCK_SCKIP;private static final DefaultRedisScript INCREMENT;
static {UNLOCK_SCKIP=new DefaultRedisScript<>();UNLOCK_SCKIP.setLocation(new ClassPathResource("unlock.lua"));INCREMENT=new DefaultRedisScript<>();INCREMENT.setLocation(new ClassPathResource("Increment.lua"));//要加上这个,因为lua脚本的返回值是String类型INCREMENT.setResultType(String.class);}@AutowiredStringRedisTemplate stringRedisTemplate;@Testvoid increment(){List<String> list =new ArrayList<>();list.add("KIRA");for (int i = 0; i < 15; i++) {Object result = stringRedisTemplate.execute(INCREMENT,list,"10");System.out.println(result);if((Long)result>10L)System.out.println("超出阈值,暂停一会然后重试");}}@Test
void add(){stringRedisTemplate.opsForValue().set("购物车", "苹果");}@Testvoid change(){//苹果,香蕉,可乐,美年达,薯片List<String> list=new ArrayList<>();list.add("购物车");
//调用LUA脚本stringRedisTemplate.execute(UNLOCK_SCKIP,list,"香蕉","苹果","可乐","美年达","薯片");}}

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL:数据库权限与角色

权限 MySQL 的权限管理系统是保障数据库安全性的关键组件之一。它允许数据库管理员精确控制哪些用户可以对哪些数据库对象执行哪些操作。 自主存取控制 DAC&#xff08;DiscretionaryAccess Control)&#xff1a;用户对于不同的数据库对象有不同的存取权限&#xff0c;不同的…

fatal: Could not read from remote repository. 解决方法

问题描述&#xff1a; Git : fatal: Could not read from remote repository. Please make sure you have the correct access rights and the repository exists。 解决方法&#xff1a; 当在网上尝试大量方法仍然失败的时候&#xff0c;不妨试试这个方法。 在 github 上&…

thinkphp框架远程代码执行

一、环境 vulfocus网上自行下载 启动命令&#xff1a; docker run -d --privileged -p 8081:80 -v /var/run/docker.sock:/var/run/docker.sock -e VUL_IP192.168.131.144 8e55f85571c8 一定添加--privileged不然只能拉取环境首页不显示 二、thinkphp远程代码执行 首页&a…

鸿蒙媒体开发【拼图】拍照和图片

拼图 介绍 该示例通过ohos.multimedia.image和ohos.file.photoAccessHelper接口实现获取图片&#xff0c;以及图片裁剪分割的功能。 效果预览 使用说明&#xff1a; 使用预置相机拍照后启动应用&#xff0c;应用首页会读取设备内的图片文件并展示获取到的第一个图片&#x…

2024关于日本AI 领域TOP12 的大学介绍

1.东京大学 &#xff08;The University of Tokyo&#xff09; 位于&#xff1a;日本东京都文京区本郷七丁目3 番1 号 网址&#xff1a;東京大学 东京大学也被称为UTokyo 或东大&#xff0c;是日本第一所国立大学。作为领先的研究型 大学&#xff0c;东京大学提供基本所有…

8月17日|广州|Cocos开发者沙龙不见不散!

6月底举行的Cocos成都沙龙吸引了近200位开发者和10多家发行&#xff0c;得到了大家的一致好评。 Cocos广州沙龙即将到来&#xff0c;会邀请更多KOL和头部发行、渠道嘉宾分享行业经验&#xff0c;让大家实现技术干货、游戏合作、行业信息多丰收。 活动主题&#xff1a;小游戏与出…

vscode+git解决远程分支合并冲突

1&#xff09;远程分支和远程分支不复杂情况合并 例如readme的冲突 可直接在github上解决 删到只剩下 #supergenius002 合并冲突测试1/合并测试冲突1合并测试冲突2/合并测试冲突2就行 《《《/》》》也要删掉 2&#xff09;但如果是复杂的冲突&#xff0c;让我们回到vscod…

C++进阶:设计模式___适配器模式

前言 在C的基础语法的学习后,更进一步为应用场景多写代码.其中设计模式是有较大应用空间. 引入 原本在写容器中适配器类有关的帖子,发现适配模式需要先了解,于是试着先写篇和适配器模式相关的帖子 理解什么是适配器类,需要知道什么是适配器模式.适配器模式是设计模式的一种.笔…

剪画小程序:致敬奥运举重冠军:照片变成动漫风格!

在巴黎奥运会的赛场上&#xff0c;那些奥运冠军们的身影如同璀璨星辰&#xff0c;闪耀着无尽的光芒&#xff01; 看&#xff0c;举重冠军力拔山兮气盖世&#xff0c;那坚定的眼神中透露出无畏的勇气&#xff0c;爆发的力量更是震撼人心。 借助剪画&#xff0c;将这令人心潮澎湃…

LabVIEW激光主动探测系统

开发了一种基于LabVIEW的高性能激光主动探测控制与处理系统的设计与实现。该系统充分利用了LabVIEW的多线程和模块化设计优势&#xff0c;提供了一套功能完整、运行高效且稳定的解决方案&#xff0c;适用于高精度激光探测领域。 项目背景 激光主动探测技术利用激光作为主动光源…

基于SpringBoot+Vue的汽车服务管理系统(带1w+文档)

基于SpringBootVue的汽车服务管理系统(带1w文档) 基于SpringBootVue的汽车服务管理系统(带1w文档) 在开发系统过程中采用Java语言、MySQL数据库存储数据。系统以B/S为基础&#xff0c;实现管理一体化、规范化&#xff0c;为用户提供一个高效快捷的交流系统[5]。利用springboot架…

JSONP跨域

1 概述 定义 json存在的意义&#xff1a; 不同类型的语言&#xff0c;都能识别json JSONP(JSON with Padding)是JSON的一种“使用模式”&#xff0c;可用于解决主流浏览器的跨域数据访问的问题。由于同源策略&#xff0c;一般来说位于 server1.example.com 的网页无法与不是 s…

深度学习(1)--机器学习、人工智能、深度学习的关系

1956 年提出 AI 概念&#xff0c;短短3年后&#xff08;1959&#xff09; Arthur Samuel 就提出了机器学习的概念&#xff1a; Field of study that gives computers the ability to learn without being explicitly programmed. 机器学习研究和构建的是一种特殊算法&#xff0…

谷粒商城实战笔记-122~124-全文检索-ElasticSearch-分词

文章目录 一&#xff0c;122-全文检索-ElasticSearch-分词-分词&安装ik分词二&#xff0c;124-全文检索-ElasticSearch-分词-自定义扩展词库1&#xff0c;创建nginx容器1.1 创建nginx文件夹1.2 创建nginx容器获取nginx配置1.3 复制nginx容器配置文件1.4 删除临时的nginx容器…

力扣-200.岛屿数量

刷力扣热题–第二十四天:200.岛屿数量 新手第二十四天 奋战敲代码&#xff0c;持之以恒&#xff0c;见证成长 1.题目描述 2.题目解答 这道题刚开始想的确实想的绞尽脑汁的&#xff0c;看了相关解答才明白的&#xff0c;三种方法&#xff0c;这里想先用两种方法进行实现&#…

【课程总结】Day17(上):NLP自然语言处理及RNN网络

前言 在机器学习章节【课程总结】Day6&#xff08;上&#xff09;&#xff1a;机器学习项目实战–外卖点评情感分析预测中&#xff0c;我们曾借助sklearn进行了外卖点评的情感分析预测&#xff1b;接下来&#xff0c;我们将深入了解自然语言处理的基本概念、RNN模型以及借助RN…

法制史学习笔记(个人向) Part.7

法制史学习笔记(个人向) Part.7 11. 清朝法律制度 11.1 立法概述 11.1.1 立法指导思想 简单来说是&#xff1a;详译明律&#xff0c;参以国制&#xff1b; 努尔哈赤时期&#xff0c;后金政权处于由习惯法到成文法的过渡过程中&#xff1b;皇太极统治时期&#xff0c;奉行“参…

细说文件操作

你好&#xff01;感谢支持孔乙己的新作&#xff0c;本文就结构体与大家分析我的思路。 希望能大佬们多多纠正及支持 &#xff01;&#xff01;&#xff01; 个人主页&#xff1a;爱摸鱼的孔乙己-CSDN博客 目录 1.什么是文件 1.1.程序设计文件 1.1.1.程序文件 1.1.2.数据文件…

【网络】TCP协议——TCP连接相关、TCP连接状态相关、TCP数据传输与控制相关、TCP数据处理和异常、基于TCP应用层协议

文章目录 Linux网络1. TCP协议1.1 TCP连接相关1.1.1 TCP协议段格式1.1.2 确定应答(ACK)机制1.1.3 超时重传机制 1.2 TCP连接状态相关1.2.1 TIME_WAIT状态1.2.2 CLOSE_WAIT 状态 1.3 TCP数据传输与控制相关1.3.1 滑动窗口1.3.2 流量控制1.3.3 拥塞控制1.3.4 延迟应答1.3.5 捎带应…

【C语言】结构体内存布局解析——字节对齐

&#x1f984;个人主页:小米里的大麦-CSDN博客 &#x1f38f;所属专栏:https://blog.csdn.net/huangcancan666/category_12718530.html &#x1f381;代码托管:黄灿灿 (huang-cancan-xbc) - Gitee.com ⚙️操作环境:Visual Studio 2022 目录 一、引言 二、什么是字节对齐&…