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,"香蕉","苹果","可乐","美年达","薯片");}}
相关文章:
Redis结合Lua脚本的简单使用
我们就拿购物车举例子 现在有5个东西免费送,我们只能选择1个 例如 可乐 美年达 香蕉 苹果 薯片 我们选择后就放进redis里面 然后我们不能选重复,只能选不同 Lua脚本 我们redis使用lua脚本的时候,会传两个参数进去 一个是List<Strin…...
Java使用zip4j加密压缩和解压文件与文件夹
最近项目中有个需求需要对文件夹进行压缩后传输,考虑数据泄露安全性问题,需要对压缩包进行加密,特地查找了下开源压缩加密类库,找到了Java语言开发的zip4j库,觉得挺好用的,在这分享给大家! Jav…...
一款好用的开源网站内容管理系统
今天给大家介绍的是一款开源网站内容管理系统(灵活、易用,性能良好、运行稳定,轻松管理建设网站) 官网:https://www.ujcms.com/ 介绍 客户端兼容Edge(Chromium版)、谷歌浏览器(Chro…...
Qt Modbus 寄存器读写实例
一.线圈状态寄存器读写 项目效果如下 1. 写单个寄存器 MODBUS_API int modbus_write_bit(modbus_t *ctx, int coil_addr, int status); int addrui->spinBoxwirte_addr->value();int dataui->spinBoxwirte_data->value();int ret modbus_write_bit(mb,addr,d…...
centos安装es、kibana、ik
这里es使用的是7.10.2版本的es,物料包下载地址如下 #注意安装的插件需和es版本保持一致 #es https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.10.2-linux-x86_64.tar.gz #kibana https://artifacts.elastic.co/downloads/kibana/kibana-7.10…...
调试工具之GDB的基本使用
GDB基本使用 GDB是Linux下一款非常强大的调试软件,其实就是GNU Debugger的缩写。接下来我们学习一下他的基本使用。 例子函数,其中只有一个ds18b20的采集温度函数和一个主函数: #include <stdio.h> #include <errno.h> #includ…...
C++ //练习 16.14 编写Screen类模板,用非类型参数定义Screen的高和宽。
C Primer(第5版) 练习 16.14 练习 16.14 编写Screen类模板,用非类型参数定义Screen的高和宽。 环境:Linux Ubuntu(云服务器) 工具:vim 代码块 template <int H, int W> class Screen{…...
【Java】深度解析监视器的组成原理
目录 一、什么是监视器(Monitor)二、监视器的组成部分三、线程的状态转换四、总结 一、什么是监视器(Monitor) 在Java中,监视器(Monitor)是用来实现线程同步的一种机制。每个Java对象都有一个与…...
Day14-Servlet后端验证码的实现
图片验证码的生成采用的是Kaptcha; Kaptcha是一个高度可配置的验证码生成工具,由Google开源。它通过一系列配置文件和插件,实现了将验证码字符串自动转换成图片流,并可以与session进行关联,从而在验证过程中使用&#…...
MySQL:数据库权限与角色
权限 MySQL 的权限管理系统是保障数据库安全性的关键组件之一。它允许数据库管理员精确控制哪些用户可以对哪些数据库对象执行哪些操作。 自主存取控制 DAC(DiscretionaryAccess Control):用户对于不同的数据库对象有不同的存取权限,不同的…...
等保测评练习卷25
等级保护初级测评师试题25 姓名: 成绩: 一、判断题(10110分) 1.安全区域边界对象主要根据系统中网络访问控制设备的部署情况来确定()不是网络访问控制设备而…...
《python语言程序设计》2018第6章第28题 掷骰子 两个色子,分别是1到6
2、3、12 玩家输 7、11玩家赢 4、5、6、8、9、10算1点,之后出7玩家输或者和上一次相同。def rolled(num_t):count 0still_win 0second_win 0still_lose 0second_lose 0while count < num_t:a_1 random.randint(1, 6)b_1 random.randint(1, 6)tTen a_1 b…...
Java方法递归
目录 1.方法递归调用 基本介绍 递归能解决什么问题? 八皇后问题 递归举例 递归重要规则 练习 2.递归调用应用实例-迷宫问题 3.递归调用实例-汉诺塔 4.递归调用实例-八皇后问题 1.方法递归调用 基本介绍 简单来说,递归就是自己调用自己。 …...
目标跟踪那些事
目标跟踪那些事 跟踪与检测的区别 目标跟踪和目标检测是计算机视觉中的两个重要概念,但它们的目的和方法是不同的。 目标检测(object Detection):是指在图像或视频帧中识别并定位一个或多个感兴趣的目标对象的过程 。 目标跟踪(object Tracking)&…...
【Git】 如何将一个分支的某个提交合并到另一个分支
【Git】 如何将一个分支的某个提交合并到另一个分支 在使用 Git 进行版本控制时,常常会遇到这样的需求:将某个分支的特定提交合并到另一个分支中。这种情况下,我们可以使用 cherry-pick 命令来实现。本文将详细介绍 cherry-pick 命令的使用方…...
【嵌入式之RTOS】什么是消息队列
目录 一、FreeRTOS消息队列的基本概念 二、FreeRTOS消息队列的工作原理 三、FreeRTOS消息队列的特点 四、FreeRTOS消息队列的应用 五、示例 消息队列是一种用于任务间通信的机制,它允许一个任务(生产者)向消息队列发送消息,而…...
9-springCloud集成nacos config
本文介绍spring cloud集成nacos config的过程。 0、环境 jdk 1.8maven 3.8.1Idea 2021.1nacos 2.0.3 1、项目结构 根项目nacos-config-sample下有两个module,这两个module分别是两个springboot项目,都从nacos中获取连接mysql的连接参数。我们开工。 …...
市场主流 AI 视频生成技术的迭代路径
AI视频生成技术的迭代路径经历了从GANVAE、Transformer、Diffusion Model到Sora采用的DiT架构(TransformerDiffusion)等多个阶段,每个阶段的技术升级都在视频处理质量上带来了飞跃性的提升。这些技术进步不仅推动了AI视频生成领域的快速发展&…...
移情别恋c++ ദ്ദി˶ー̀֊ー́ ) ——1.c++入门(2)
1. 函数重载 C⽀持在同⼀作⽤域中出现同名函数,但是要求这些同名函数的形参不同,可以是参数个数不同或者 类型不同。这样C函数调⽤就表现出了多态⾏为,使⽤更灵活。C语⾔是不⽀持同⼀作⽤域中出现同 名函数的。 #include<iostream> u…...
【Python系列】深入理解 Python 中的 `nonlocal` 关键字
💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...
Flask目录结构路由重定向简单实例讲解——轻量级的 Python Web 框架
假设一个flask目录结构如下: my_flask_app/ │ ├── app.py ├── routes/ │ ├── __init__.py │ ├── ZhejiangProvince/ │ │ ├── __init__.py │ │ ├── la.py │ │ └── el.py │ ├── GuangdongProvince/ │ │ ├…...
破解PyCharm插件更新难题:让IDE焕发新生
破解PyCharm插件更新难题:让IDE焕发新生 PyCharm作为业界领先的集成开发环境(IDE),其丰富的插件生态是其强大功能的重要来源。然而,插件无法更新的问题可能会困扰许多用户,影响开发体验。本文将详细介绍如…...
cmake常用命令学习
1.include https://blog.csdn.net/qq_38410730/article/details/102677143 CmakeLists.txt才是cmake的正统文件,而.cmake文件是一个模块文件,可以被include到CMakeLists.txt中。 include指令一般用于语句的复用,也就是说,如果有…...
K8S可视化管理平台KubeSphere
什么是 KubeSphere ? KubeSphere 是一款开源项目,在目前主流容器调度平台 Kubernetes 之上构建的企业级分布式多租户容器管理平台,提供简单易用的操作界面以及向导式操作方式,在降低用户使用容器调度平台学习成本的同时ÿ…...
Bugku-CTF-聪明的php
pass a parameter and maybe the flag files filename is random :> 传递一个参数,可能标记文件的文件名是随机的: 于是传一下参,在原网页后面加上/?a1,发现网页出现了变化 3.传入参数,一般情况下是文件包含,或者命令执行&…...
【MySQL进阶】MySQL主从复制
目录 MySQL主从复制 概念 主从形式 一主多从 多主一从 双主复制 主从级联复制 主从复制原理 三个线程 两个日志文件 主从复制的主要工作模式 异步复制 半同步复制 全同步复制 MySQL主从复制 概念 MySQL主从复制是一种数据分布机制,允许从一个数据库服…...
本地部署文生图模型 Flux
本地部署文生图模型 Flux 0. 引言1. 本地部署1-1. 创建虚拟环境1-2. 安装依赖模块1-3. 创建 Web UI1-4. 启动 Web UI1-5. 访问 Web UI 0. 引言 2024年8月1日,blackforestlabs.ai发布了 FLUX.1 模型套件。 FLUX.1 文本到图像模型套件,该套件定义了文本到…...
谷粒商城实战笔记-127-全文检索-ElasticSearch-整合-测试复杂检索
文章目录 一,使用Elasticsearch的Java RESTHighLevel Client完成复杂的查询请求1. 创建检索请求 (SearchRequest)2. 构造检索条件 (SearchSourceBuilder)3. 执行检索 (SearchResponse)4. 处理解析结果5. 获取聚合信息 二,AI时代的效率提升 一,…...
解锁PyCharm:破解依赖库导入之谜
解锁PyCharm:破解依赖库导入之谜 PyCharm作为Python开发者的强大IDE,提供了丰富的功能来简化开发流程。然而,在使用过程中,开发者可能会遇到导入依赖库时出现的错误。本文将深入探讨PyCharm中导入依赖库报错的问题,并…...
JSON-Viewer插件:json格式查看器
npm install vue-json-viewer 2,main.js 引入 import JsonViewer from vue-json-viewer Vue.use(JsonViewer) 3,组件里写入这个组件 <json-viewer:value"textSecond":expand-depth"5"copyableboxedsort></json-viewer…...
周村网站制作首选公司/互联网营销师证书含金量
1 简介这是我的新系列教程PythonDash快速web应用开发的第一期,我们都清楚学习一个新工具需要一定的动力,那么为什么我要专门为Dash制作一个系列教程呢?图1Dash是一个高效简洁的Python框架,建立在Flask、Poltly.js以及React.js的基…...
刚察县公司网站建设/seo整站优化哪家专业
原文:Introduction to Android Fragments Tutorial 作者:Huyen Tue Dao 译者:kmyhy 一个 fragment 可以是任何东西,但在本文中,它是一个代码模块,保存有一个 activity 的部分 UI 和行为。正如其名所指&am…...
封面设计网站/买卖交易平台
游戏中的内容总是在不断的优化,不断地给玩家们提供一些更加便利的系统,可以让玩家在游戏中更加轻松一些,初代老玩家们看到这些系统都表示既非常羡慕,开荒时的困难是新玩家们无法想象到的。在本周的维护更新之后,游戏中…...
dw可以做有后台的网站么?/真正免费建站
题目链接: B君的圆锥 基准时间限制:1 秒 空间限制:131072 KB B君要用一个表面积为S的圆锥将白山云包起来。 B君希望包住的白山云体积尽量大,B君想知道体积最大可以是多少。注意圆锥的表面积包括底面和侧面。Input一行一个整数&…...
哪个网站专业做安防/百度极速版推广
爬虫项目介绍 有一定的复杂性可以灵活调整项目的复杂性平衡语言/爬虫之间的比重通用爬虫,如baidu,google聚焦爬虫,从互联网获取结构化数据 把网页转换成数据 go语言的爬虫库/框架 henrylee2cn/pholcusgocrawlcollyhu17889/go_spider 不使用现成爬虫库/框架来写一个…...
建设银行网站的目的是什么/关键词词库
数据结构中的栈不要与 Java 中的栈混淆,他们俩不是一回事,数据结构中的栈是一种受限制的线性表,栈具有先进后出、后进先出的特点,因为栈只允许访问最后一个数据项,即最后插入的数据项。也许你会有疑问,栈既…...