Spring Boot+ redis执行lua脚本的5种方式

Spring Boot+ redis执行lua脚本示例

文章目录

  • Spring Boot+ redis执行lua脚本示例
  • Redis从入门到精通系列文章
  • 0.前言
  • 1.基础介绍
  • 2.步骤
    • 2.1. 引入依赖
        • 1. 使用Jedis作为Redis客户端:
        • 2. 使用Lettuce作为Redis客户端:
    • 2.2. 配置文件
        • 使用Jedis作为Redis客户端的配置文件(`application.properties`):
        • 使用Lettuce作为Redis客户端的配置文件(`application.properties`):
    • 2.3. 使用示例
      • 1. RedisTemplate.execute(RedisScript script, List<K> keys, Object... args):
      • 2. RedisTemplate.execute(RedisCallback<T> action):
      • 3. RedisScriptingCommands.eval(String script, ReturnType returnType, int numKeys, byte\[\]... keysAndArgs):
      • 4. 使用Lettuce的Reactive Redis API:
      • 5. 使用Lettuce的StatefulRedisConnection.sync():
  • 3.示例项目
  • 4.参考文档

在这里插入图片描述

Redis从入门到精通系列文章

  1. 《Redis 从入门到精通【进阶篇】之Lua脚本详解》
  2. 《Redis 从入门到精通【实践篇】SpringBoot Redis 配置多数据源》
  3. 《Redis 从入门到精通【进阶篇】三分钟了解Redis地理位置数据结构GeoHash》
  4. 《Redis 从入门到精通【进阶篇】一文学会Lua脚本》
  5. 《Redis使用Lua脚本和Redisson来保证库存扣减中的原子性和一致性》
  6. 《SpringBoot Redis 使用Lettuce和Jedis配置哨兵模式》
  7. 《Redis【应用篇】之RedisTemplate基本操作》
  8. 《Redis 从入门到精通【实践篇】之SpringBoot配置Redis多数据源》
  9. 《Redis 从入门到精通【进阶篇】之三分钟了解Redis HyperLogLog 数据结构》
  10. 《Redis 从入门到精通【进阶篇】之三分钟了解Redis地理位置数据结构GeoHash》
  11. 《Redis 从入门到精通【进阶篇】之高可用哨兵机制(Redis Sentinel)详解》
  12. 《Redis 从入门到精通【进阶篇】之redis主从复制详解》
  13. 《Redis 从入门到精通【进阶篇】之Redis事务详解》
  14. 《Redis从入门到精通【进阶篇】之对象机制详解》
  15. 《Redis从入门到精通【进阶篇】之消息传递发布订阅模式详解》
  16. 《Redis从入门到精通【进阶篇】之持久化 AOF详解》
  17. 《Redis从入门到精通【进阶篇】之持久化RDB详解》
  18. 《Redis从入门到精通【高阶篇】之底层数据结构字典(Dictionary)详解》
  19. 《Redis从入门到精通【高阶篇】之底层数据结构快表QuickList详解》
  20. 《Redis从入门到精通【高阶篇】之底层数据结构简单动态字符串(SDS)详解》
  21. 《Redis从入门到精通【高阶篇】之底层数据结构压缩列表(ZipList)详解》
  22. 《Redis从入门到精通【进阶篇】之数据类型Stream详解和使用示例》

0.前言

在使用Spring Boot与Redis执行Lua脚本之前,让我们先了解一下Lua脚本在Redis中的作用和优势。

在使用Spring Boot与Redis执行Lua脚本之前,让我们先了解一下Lua脚本在Redis中的作用和优势。

Lua是一种快速、轻量级的脚本语言,广泛应用于各种领域,包括数据库。Redis作为一个内嵌Lua解释器的NoSQL数据库,允许通过Lua脚本在服务器端执行一些复杂的操作。

使用Lua脚本在Redis中执行操作有以下几个优势:

  1. 减少网络开销:通过将多个操作封装在一个Lua脚本中,可以减少每次操作的网络开销。脚本在服务器端一次执行,减少了客户端与服务器之间的通信次数。

  2. 原子性操作:Redis将整个Lua脚本作为一个原子性操作执行,保证了多个操作的原子性。这对于需要执行多个Redis命令来保持数据一致性的情况非常有用。

  3. 原生支持事务:Redis的Lua脚本支持原生的事务操作,可以在脚本中使用redis.callredis.pcall来执行Redis命令,保证了事务的一致性。

在Spring Boot中使用Lua脚本执行Redis操作非常简单。您可以使用RedisTemplate或者Lettuce连接库来执行Lua脚本。这些库提供了相应的方法来执行Lua脚本并获取执行结果。

1.基础介绍

接下来,我们将提供一个示例来说明如何在Spring Boot中执行Lua脚本。示例将使用RedisTemplate来执行脚本。

2.步骤

2.1. 引入依赖

当使用Spring Boot和Redis执行Lua脚本时

1. 使用Jedis作为Redis客户端:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
</dependency>

这些依赖将引入Spring Boot的Redis支持和Jedis作为Redis客户端。

2. 使用Lettuce作为Redis客户端:

默认使用Lettuce所以不需要引入依赖。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

注意:确保使用的依赖版本与您的项目和其他依赖的版本兼容。您可以根据需要调整依赖的版本号。

2.2. 配置文件

配置文件

使用Jedis作为Redis客户端的配置文件(application.properties):

# Redis连接配置
spring.redis.host=your-redis-host
spring.redis.port=your-redis-port
spring.redis.password=your-redis-password

# Jedis相关配置(可选)
# spring.redis.jedis.pool.max-active=10
# spring.redis.jedis.pool.max-idle=5
# spring.redis.jedis.pool.min-idle=1
# spring.redis.jedis.pool.max-wait=-1

使用Lettuce作为Redis客户端的配置文件(application.properties):

# Redis连接配置
spring.redis.host=your-redis-host
spring.redis.port=your-redis-port
spring.redis.password=your-redis-password

# Lettuce相关配置(可选)
# spring.redis.lettuce.pool.max-active=10
# spring.redis.lettuce.pool.max-idle=5
# spring.redis.lettuce.pool.min-idle=1
# spring.redis.lettuce.pool.max-wait=-1

上述配置文件中的your-redis-hostyour-redis-portyour-redis-password应该替换为实际的Redis连接信息。如果Redis服务器没有密码,则可以省略spring.redis.password配置。

对于Jedis和Lettuce客户端,您还可以根据需要配置连接池的相关属性。在示例配置中,我已经提供了一些可选的连接池属性,您可以根据应用程序的需求进行调整。

2.3. 使用示例

每种方式都适用于不同的使用场景和偏好,您可以根据自己的需求选择适合的方式来执行Lua脚本。

1. RedisTemplate.execute(RedisScript script, List keys, Object… args):

@Autowired
private RedisTemplate<String, String> redisTemplate;

public void executeLuaScript() {
    String luaScript = "return redis.call('GET', KEYS[1])";
    RedisScript<String> redisScript = new DefaultRedisScript<>(luaScript, String.class);
    
    List<String> keys = Arrays.asList("key1");
    String result = redisTemplate.execute(redisScript, keys);
    
    System.out.println(result);
}

这种方式使用RedisTemplateexecute方法执行Lua脚本。首先,我们创建一个RedisScript对象,将Lua脚本作为字符串传递给它。然后,我们提供一个包含键的列表和其他参数(如果有的话)作为execute方法的参数。在本示例中,我们使用Lua脚本调用Redis的GET命令来获取名为"key1"的键的值。

2. RedisTemplate.execute(RedisCallback action):

@Autowired
private RedisTemplate<String, String> redisTemplate;

public void executeLuaScript() {
    String luaScript = "return redis.call('GET', KEYS[1])";
    
    String result = redisTemplate.execute(new RedisCallback<String>() {
        @Override
        public String doInRedis(RedisConnection connection) throws DataAccessException {
            Object nativeConnection = connection.getNativeConnection();
            if (nativeConnection instanceof Jedis) {
                // Jedis specific code
                Jedis jedis = (Jedis) nativeConnection;
                return jedis.eval(luaScript, 1, "key1");
            } else if (nativeConnection instanceof LettuceConnection) {
                // Lettuce specific code
                LettuceConnection lettuceConnection = (LettuceConnection) nativeConnection;
                RedisCommands<String, String> commands = lettuceConnection.sync();
                return commands.eval(luaScript, ScriptOutputType.VALUE, new String[]{"key1"});
            }
            
            // Handle other Redis clients if needed
            
            return null;
        }
    });
    
    System.out.println(result);
}

这种方式使用RedisTemplateexecute方法,并传递一个RedisCallback对象。在doInRedis方法中,我们可以使用RedisConnection对象与底层Redis进行交互。根据底层Redis客户端的不同(例如Jedis或Lettuce),我们可以执行相应的Lua脚本。在本示例中,我们使用Jedis和Lettuce分别执行Lua脚本。

3. RedisScriptingCommands.eval(String script, ReturnType returnType, int numKeys, byte[]… keysAndArgs):

@Autowired
private RedisConnectionFactory redisConnectionFactory;

public void executeLuaScript() {
    RedisConnection connection = redisConnectionFactory.getConnection();
    String luaScript = "return redis.call('GET', KEYS[1])";
    
    Object result = connection.eval(luaScript.getBytes(), ReturnType.VALUE, 1, "key1".getBytes());
    
    System.out.println(result);
    
    connection.close();
}

这种方式使用RedisConnection对象的eval方法直接执行Lua脚本。我们获取RedisConnection对象,并传递Lua脚本的字节数组、返回类型、键的数量和键及其参数的字节数组。在本示例中,我们执行了一个简单的Lua脚本,调用Redis的GET命令来获取名为"key1"的键的值。

4. 使用Lettuce的Reactive Redis API:

@Autowired
private ReactiveRedisTemplate<String, String> reactiveRedisTemplate;

public Mono<String> executeLuaScript() {
    String luaScript = "return redis.call('GET', KEYS[1])";
    RedisScript<String> redisScript = new DefaultRedisScript<>(luaScript, String.class);
    
    List<String> keys = Arrays.asList("key1");
    return reactiveRedisTemplate.execute(redisScript, keys);
}

这种方式适用于响应式编程风格的应用程序,使用Lettuce的Reactive Redis API执行Lua脚本。我们创建一个ReactiveRedisTemplate对象,并使用execute方法执行Lua脚本。在本示例中,我们调用Redis的GET命令来获取名为"key1"的键的值,并返回一个Mono对象。

5. 使用Lettuce的StatefulRedisConnection.sync():

@Autowired
private RedisClient redisClient;

public void executeLuaScript() {
    StatefulRedisConnection<String, String> connection = redisClient.connect();
    RedisCommands<String, String> commands = connection.sync();
    
    String luaScript = "return redis.call('GET', KEYS[1])";
    String result = commands.eval(luaScript, ScriptOutputType.VALUE, "key1");
    
    System.out.println(result);
    
    connection.close();
}

这种方式使用Lettuce的RedisClient创建一个StatefulRedisConnection对象,并使用sync()方法获取同步执行的RedisCommands。然后,我们可以使用eval方法执行Lua脚本。在本示例中,我们执行一个简单的Lua脚本,调用Redis的GET命令来获取名为"key1"的键的值。

3.示例项目

4.参考文档

  1. Spring Boot官方文档 ↗: Spring Boot官方文档提供了关于使用Spring Boot构建应用程序的详细指南和参考文档。

  2. Spring Data Redis官方文档 ↗: Spring Data Redis官方文档提供了关于在Spring应用程序中使用Redis的详细信息,包括数据访问、事务管理、缓存等方面的内容。

  3. Redis官方文档 ↗: Redis官方文档是Redis数据库的官方指南,提供了全面的文档和示例,涵盖了Redis的各个方面,包括数据类型、命令、持久化、复制等。

在这里插入图片描述大家好,我是冰点,今天的Spring Boot+Redis 实现一个简单的限流器,全部内容就是这些。如果你有疑问或见解可以在评论区留言。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

登陆接口的的Filter过滤

目录 一、概述 二、基本操作 三、登陆检查接口 一、概述 什么是Filter&#xff1f; Filter表示过滤器&#xff0c;是 JavaWeb三大组件(Servlet、Filter、Listener)之一。 过滤器可以把对资源的请求拦截下来&#xff0c;从而实现一些特殊的功能 使用了过滤器之后&#xff0…

工业生产全面感知!工业感知云来了

面向工业企业数字化转型需求&#xff0c;天翼物联基于感知云平台创新能力和5G工业物联数采能力&#xff0c;为客户提供工业感知云服务&#xff0c;包括工业泛协议接入、感知云工业超轻数采平台、工业感知数据治理、工业数据看板四大服务&#xff0c;构建工业感知神经系统新型数…

高性能服务器Nodejs快速入门

目录 1 初识 Nodejs2 Buffer 缓冲区3 fs 文件系统模块3.1 读取文件3.2 写入文件3.3 路径动态拼接问题 __dirname3.4 其它操作 4 path 路径模块4.1 路径拼接 path.join()4.2 获取路径中文件名 path.basename()4.3 获取路径中文件扩展名 path.extname() 5 http 模块5.1 创建基本 …

PHP自己的框架实现debug调试模式和时区(完善篇三)

1、实现效果通过config设置开关debug调试模式 2、debug调试模式设置和时区设置 error_reporting和display_errors点击查看详细讲解 public static function run(){//定义常量self::_set_const();//创建模块目录self::_mk_module();//加载文件self::_import_file();self::_set_…

IPEmotion交流电功率分析计算

一 应用背景 随着国内电动汽车行业的快速发展&#xff0c;在相同的道路环境和行驶状态下&#xff0c;增加电动车的整体续航里程和提升乘员对于行驶途中用电需求的满意度尤为重要。对此&#xff0c;需要采集试验过程中交直流电压电流信号&#xff0c;以计算出车辆各种部件输出和…

数据库知识

怎么做 常见的数据库 Oracle Mysql SOLSever Navicat &#xff08;新版可以链接mysql oracle&#xff09; http://sqlfiddle.com/ 数据库操作在线练习 mysql自带四个数据库 数据库语言的使用 显示数据库&#xff1a;show databases&#xff1b; 创建数据库&#xff1a;…

opencv-python使用鼠标点击图片显示该点坐标和像素值IPM逆透视变换车道线二值化处理

OpenCV的鼠标操作 实现获取像素点的功能主要基于OpenCV的内置函数cv2.setMouseCallback()&#xff0c;即鼠标事件回调 setMouseCallback(winname, onMouse,userdata0) winname: 接收鼠标事件的窗口名称 onMouse: 处理鼠标事件的回调函数指针 userdata: 传给回调函数的用户数据…

html动态爱心代码【二】(附源码)

目录 前言 效果演示 内容修改 完整代码 总结 前言 七夕马上就要到了&#xff0c;为了帮助大家高效表白&#xff0c;下面再给大家带来了实用的HTML浪漫表白代码(附源码)背景音乐&#xff0c;可用于520&#xff0c;情人节&#xff0c;生日&#xff0c;表白等场景&#xff0c…

Qt与电脑管家4

折线图&#xff1a; #ifndef LINE_CHART_H #define LINE_CHART_H#include <QWidget> #include <QPainter> #include "circle.h" class line_chart : public QWidget {Q_OBJECT public:explicit line_chart(QWidget *parent nullptr); protected:void pa…

搭建开发环境-操作系统篇(一键搭建开发环境)

概述 所谓工欲善其事必先利其器&#xff0c;搭环境往往是开发过程中卡出很多初学者的拦路虎。 对于很多老鸟来说&#xff0c;很多东西都已经习惯成自然&#xff0c;也就没有刻意和初学者说。但对于很多初学者&#xff0c;却是受益良多。 这个系列&#xff0c;先从操作系统开始…

两个字符串的删除操作——力扣583

class Solution {public:int minDistance(string word1, string word2) {int m = word1.length(), n=word2

线程面试题-2

1、一般用什么作为HashMap的key? 一般用Integer、String 这种不可变类当 HashMap 当 key&#xff0c;而且 String 最为常用。 因为字符串是不可变的&#xff0c;所以在它创建的时候 hashcode 就被缓存了&#xff0c;不需要重新计算。这就是HashMap 中的键往往都使用字符串的原…

3D与沉浸式技术,如何助力企业数字化转型?

说起3D&#xff0c;估计许多读者朋友会在第一时间想起《阿凡达》系列和《侏罗纪公园》系列电影大作。每一帧细节纤毫毕现的逼真画面&#xff0c;让观众几乎分不清虚拟与现实&#xff0c;完全沉浸在导演打造的视觉盛宴中。 事实上&#xff0c;除了大家所熟知的3D影视动画之外&am…

Nacos简述

介绍 ​ Nacos主要在微服务生态中可以发现、配置和管理微服务&#xff0c;实现动态服务发现和注册、服务配置、DNS服务、服务元数据及流量管理。 ​ 目前Nacos支持多种生态&#xff0c;比如SpringCloud、Dubbo、云原生Cloud Native等。 Nacos关键特性 1、服务发现和服务健康…

Docker容器:docker consul的注册与发现及consul-template守护进程

文章目录 一.docker consul的注册与发现介绍1.什么是服务注册与发现2.什么是consul3.consul提供的一些关键特性4.数据流向 二.consul部署1.consul服务器&#xff08;192.168.198.12&#xff09;&#xff08;1&#xff09;建立 Consul 服务&#xff08;2&#xff09;查看集群信息…

探究HTTP API接口测试:工具、方法与自动化

本文将深入探讨HTTP API接口测试的重要性&#xff0c;并介绍了相关工具、方法以及自动化测试的实施&#xff0c;同时比较了HTTP和API接口测试的区别。从不同角度解析这一关键测试领域&#xff0c;帮助读者更好地理解和应用于实际项目中。 在如今数字化的世界中&#xff0c;软件…

并查集及其简单应用

文章目录 一.并查集二.并查集的实现三.并查集的基本应用 一.并查集 并查集的逻辑结构:由多颗不相连通的多叉树构成的森林(一个这样的多叉树就是森林的一个连通分量) 并查集的元素(树节点)用0~9的整数表示,并查集可以表示如下: 并查集的物理存储结构:并查集一般采用顺序结构实…

【OpenVINOSharp】在英特尔® 开发者套件爱克斯开发板使用OpenVinoSharp部署Yolov8模型

在英特尔 开发者套件爱克斯开发板使用OpenVinoSharp部署Yolov8模型 一、英特尔开发套件 AIxBoard 介绍1. 产品定位2. 产品参数3. AI推理单元 二、配置 .NET 环境1. 添加 Microsoft 包存储库2. 安装 SDK3. 测试安装4. 测试控制台项目 三、安装 OpenVINO Runtime1. 下载 OpenVINO…

【计算机网络】13、ARP 包:广播自己的 mac 地址和 ip

机器启动时&#xff0c;会向外广播自己的 mac 地址和 ip 地址&#xff0c;这个即称为 arp 协议。范围是未经过路由器的部分&#xff0c;如下图的蓝色部分&#xff0c;范围内的设备都会在本地记录 mac 和 ip 的绑定信息&#xff0c;若有重复则覆盖更新&#xff08;例如先收到 ma…

[Docker] Portainer + nginx + AList 打造Docker操作三板斧

Portainer : Docker容器图形化管理系统 nginx: 反向代理利器 AList: 文件管理系统 目的: 依托Portainer 的图形管理界面,可视化的配置docker容器. AList再关联Docker各容器内部的配置文件,可视化配置,再配合Portainer重启,日志查看,命令行操作等.对于中小企业对容器化操作简…