前言

众所周知,redis可以执行lua脚本,至于为什么要用lua脚本来操作redis,自行百度咯

开始

Bean类

package cn.daenx.myadmin.common.config.redis;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.core.script.DefaultRedisScript; /**
* Redis LUA脚本
*
* @author DaenMax
*/
@Configuration
public class RedisScript { /**
* 限流脚本
*
* @return
*/
@Bean
public DefaultRedisScript<Long> limitScript() {
DefaultRedisScript<Long> redisScript = new DefaultRedisScript<>();
redisScript.setScriptText(limitScriptText());
redisScript.setResultType(Long.class);
return redisScript;
} private String limitScriptText() {
return "local key = KEYS[1]\n" +
"local count = tonumber(ARGV[1])\n" +
"local time = tonumber(ARGV[2])\n" +
"local current = redis.call('get', key);\n" +
"if current and tonumber(current) > count then\n" +
" return tonumber(current);\n" +
"end\n" +
"current = redis.call('incr', key)\n" +
"if tonumber(current) == 1 then\n" +
" redis.call('expire', key, time)\n" +
"end\n" +
"return tonumber(current);";
} /**
* 邮箱轮询队列脚本
*
* @return
*/
@Bean
public DefaultRedisScript<String> nextEmailScript() {
DefaultRedisScript<String> redisScript = new DefaultRedisScript<>();
redisScript.setScriptText(nextEmailScriptText());
redisScript.setResultType(String.class);
return redisScript;
} private String nextEmailScriptText() {
return "local key = KEYS[1];\n" +
"local email= redis.call('rpop',key);\n" +
"redis.call('lpush',key,email);\n" +
"return email;";
}
}

使用

    @Resource
private RedisTemplate<String, Object> redisTemplate;
//限流脚本
@Resource
private RedisScript<Long> limitScript;
//邮箱轮询队列脚本
@Resource
private RedisScript<String> nextEmailScript; /**
* 测试
*
* @return
*/
@GetMapping("/test")
public void test() {
String data1 = redisTemplate.execute(nextEmailScript, CollUtil.newArrayList(SystemConstant.EMAIL_POLL_KEY), "");
Long data2 = redisTemplate.execute(limitScript, CollUtil.newArrayList("1"), 2, 3); }

在java中使用lua脚本操作redis的更多相关文章

  1. Java中使用Lua脚本语言(转)

    Lua是一个实用的脚本语言,相对于Python来说,比较小巧,但它功能并不逊色,特别是在游戏开发中非常实用(WoW采用的就是Lua作为脚本的).Lua在C\C++的实现我就不多说了,网上随便一搜,到处 ...

  2. 在JAVA中使用LUA脚本记,javaj调用lua脚本的函数(转)

    最近在做一些奇怪的东西,需要Java应用能够接受用户提交的脚本并执行,网络部分我选择了NanoHTTPD提供基本的HTTP服务器支持,并在Java能承载的许多脚本语言中选择了很久,比如Rhino,Jy ...

  3. 新姿势!Redis中调用Lua脚本以实现原子性操作

    背景:有一服务提供者Leader,有多个消息订阅者Workers.Leader是一个排队程序,维护了一个用户队列,当某个资源空闲下来并被分配至队列中的用户时,Leader会向订阅者推送消息(消息带有唯 ...

  4. 在redis中使用lua脚本

    在实际工作过程中,可以使用lua脚本来解决一些需要保证原子性的问题,而且lua脚本可以缓存在redis服务器上,势必会增加性能. 不过lua也会有很多限制,在使用的时候要注意. 在Redis中执行Lu ...

  5. Redis中的原子操作(2)-redis中使用Lua脚本保证命令原子性

    Redis 如何应对并发访问 使用 Lua 脚本 Redis 中如何使用 Lua 脚本 EVAL EVALSHA SCRIPT 命令 SCRIPT LOAD SCRIPT EXISTS SCRIPT ...

  6. Lua脚本在Redis事务中的应用实践

    使用过Redis事务的应该清楚,Redis事务实现是通过打包多条命令,单独的隔离操作,事务中的所有命令都会按顺序地执行.事务在执行的过程中,不会被其他客户端发送来的命令请求所打断.事务中的命令要么全部 ...

  7. redis中使用lua脚本

    lua脚本 Lua是一个高效的轻量级脚本语言,用标准C语言编写并以源代码形式开放, 其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能 使用脚本的好处 1.减少网络开销,在Lua脚 ...

  8. CentOS6.4 安装OpenResty和Redis 并在Nginx中利用lua简单读取Redis数据

    1.下载OpenResty和Redis OpenResty下载地址:wget http://openresty.org/download/ngx_openresty-1.4.3.6.tar.gz Re ...

  9. Lua脚本在redis分布式锁场景的运用

    目录 锁和分布式锁 锁是什么? 为什么需要锁? Java中的锁 分布式锁 redis 如何实现加锁 锁超时 retry redis 如何释放锁 不该释放的锁 通过Lua脚本实现锁释放 用redis做分 ...

  10. java、python及jmeter操作redis(接口自动化必备)

    redis是nosql数据库之一,其存储结构简单,提供高性能服务,所以在架构中是很常用的. 在做接口自动化测试过程中,有时也会涉及到redis,比如:发送短信验证码,我们做接口自动化测试,如何模拟发送 ...

随机推荐

  1. Selenium KPI接口 附件上传

    实现功能 拖拽图片到百度上传图片搜索功能区域. 定位.send_keys(r'图片路径') 导入相关包 from selenium import webdriver from time import ...

  2. Pydantic多态模型:用鉴别器构建类型安全的API接口

    title: Pydantic多态模型:用鉴别器构建类型安全的API接口 date: 2025/3/20 updated: 2025/3/20 author: cmdragon excerpt: Py ...

  3. BUUCTF---RSA1

    RSA基础概念 rsa原理: RSA公开密钥密码体制的原理是:根据数论,寻求两个大素数比较简单,而将它们的乘积进行因式分解却极其困难,因此可以将乘积公开作为加密密钥 RSA算法的具体描述如下: (1) ...

  4. Linux 离线升级 RSYNC

    前言:本文操作是在 CentOS-7 下执行的,不确定在其他 Linux 发布版是否能同样正常执行. 1.检查前置依赖组件 在安装 rsync 之前,需要确认已安装了相关依赖组件: gcc .open ...

  5. HTML5 定时通知

    通过setInterval()和Notification来实现定时通知功能. demo <script> window.onload = function () { //每10秒弹出一个桌 ...

  6. MySQL 修复损坏表

    修复MySQL损坏表的简单步骤,不一定适用任意情况下的表损坏的问题,留爪. 简单3步曲: # 用`root`用户登录MySQL # 这里可能需要输入密码 mysql -uroot -p # 使用指定数 ...

  7. Codeforces Round 944 (Div. 4)

    知识点模块 1. ai xor aj<=4 意味着两个数字的二进制位,只能有后两位的二进制位不同,因为如果第三位二进制位不同,就会出现异或的结果大于4 2.要有化曲为直的思想 学会把曲线上的坐标 ...

  8. 微软正式发布 .NET 10 Preview 3

    2025年4月11日,.NET团队在博客上宣布了.NET 10 Preview 3的正式发布,文章参见:https://devblogs.microsoft.com/dotnet/dotnet-10- ...

  9. DAY1--ROS基本认知

    1.ROS基本框架 ROS架构如下图所示,可以将其分为三个层次:OS层.中间层和应用层. 1.1 应用层 应用层是用户直接交互的部分,包含以下核心组件: Master: ROS的核心协调者,负责节点( ...

  10. eolink对数据进行四舍五入处理

    下图"BalanceAmount"返回值显示小数点2位以后的值,这样就与预计匹配值不等导致脚本错误 对这个值进行四舍五入处理,比如返回值变成整数 var num = eo.env. ...