redisson实现分布式锁(支持redis单例/集群)

redisson实现分布式锁

  • 前言
  • 一、引入redisson依赖
  • 二、redis 配置
  • 三、redisson 配置
    • 1.集群配置
    • 2.单例配置
  • 四、分布式锁使用-业务层demo


前言

还是在工作中遇到的问题:
1:新增商铺信息时,同一个商铺有多条信息。
异步的情况,根据商铺名和商铺地址作为唯一条件,不加分布式锁就会有重复的商铺信息。

2:代码要发布到云化环境(redis集群) & 一体机环境(redis单例)
使用ConditionalOnProperty注解


一、引入redisson依赖

        <dependency><groupId>org.redisson</groupId><artifactId>redisson</artifactId><version>3.16.2</version></dependency>

二、redis 配置

spring:# redis单例配置
#  redis:
#    host: 127.0.0.1
#    port: 6379
#    password: 123456
#    serializer: json
#    jedis:
#      pool:
#        max-active: 20
#        max-idle: 20
#        max-wait: 2000ms
#        time-between-eviction-runs: 3000# redis集群配置redis:cluster:nodes: xxx.xxx.xxx.xxx:pppp,xxx.xxx.xxx.xxx:pppp,xxx.xxx.xxx.xxx:pppp,xxx.xxx.xxx.xxx:pppppassword: 123456serializer: jsonjedis:pool:max-active: 20max-idle: 20max-wait: 2000mstime-between-eviction-runs: 30000

三、redisson 配置

1.集群配置

代码如下(示例):

import lombok.extern.slf4j.Slf4j;
import org.redisson.Redisson;
import org.redisson.api.RedissonClient;
import org.redisson.config.Config;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Slf4j
@Configuration
@ConditionalOnProperty(name = "spring.redis.cluster.nodes")
public class MyRedissonClusterConfig {private static final String REDIS_SSH_URL = "redis://";@Value(value = "${spring.redis.cluster.nodes}")private String host;@Value(value = "${spring.redis.password}")private String password;/*** 所有对redisson的使用都是通过RedissonClient来操作的*/@Bean(destroyMethod = "shutdown")public RedissonClient redisson() {log.info("redisson启动,加载集群");// 1. 创建配置Config config = new Config();// 一定要加redis://String[] hostArr = host.split(",");String[] newHostArr = new String[hostArr.length];for (int i = 0; i < hostArr.length; i++) {newHostArr[i] = REDIS_SSH_URL + hostArr[i];}config.useClusterServers().addNodeAddress(newHostArr);config.useClusterServers().setPassword(password);// 2. 根据config创建出redissonClient实例return Redisson.create(config);}
}

2.单例配置

代码如下(示例):

import lombok.extern.slf4j.Slf4j;
import org.redisson.Redisson;
import org.redisson.api.RedissonClient;
import org.redisson.config.Config;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Slf4j
@Configuration
@ConditionalOnProperty(name = "spring.redis.host")
public class MyRedissonSingleConfig {private static final String REDIS_SSH_URL = "redis://";@Value(value = "${spring.redis.host}")private String host;@Value(value = "${spring.redis.port}")private String port;@Value(value = "${spring.redis.password}")private String password;/*** 所有对redisson的使用都是通过RedissonClient来操作的**/@Bean(destroyMethod = "shutdown")public RedissonClient redisson() {log.info("redisson启动,加载单例");// 1. 创建配置Config config = new Config();// 一定要加redis://config.useSingleServer().setAddress(REDIS_SSH_URL+ host + ":" + port);config.useSingleServer().setPassword(password);// 2. 根据config创建出redissonClient实例return Redisson.create(config);}
}

该处使用的url网络请求的数据。

四、分布式锁使用-业务层demo

import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;

@Autowiredprivate RedissonClient redissonClient;@GetMapping("test/lock")public String testLock() {RLock lock = redissonClient.getLock("123");try {//加锁10s,不设置加密狗,不搞死锁。boolean b = lock.tryLock(10, TimeUnit.SECONDS);if (b) {//todo 这里写业务逻辑return "123";}} catch (InterruptedException e) {e.printStackTrace();log.error("分布式锁异常了," + e.getMessage());} finally {lock.unlock();}return null;}

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

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

相关文章

NX二次开发UF_CURVE_ask_parameterization 函数介绍

文章作者&#xff1a;里海 来源网站&#xff1a;https://blog.csdn.net/WangPaiFeiXingYuan UF_CURVE_ask_parameterization Defined in: uf_curve.h int UF_CURVE_ask_parameterization(tag_t object, double param_range [ 2 ] , int * periodicity ) overview 概述 Retu…

国产Ai大模型和chtgpt3.5的比较

下面是针对国产大模型&#xff0c;腾讯混元&#xff0c;百度文心一言&#xff0c;阿里通义千问和chatgpt的比较&#xff0c;最基础的对一篇文章的单词书进行统计&#xff0c;只有文心一言和chatgpt回答差不多&#xff0c;阿里和腾讯差太多了

深度学习中的注意力机制:原理、应用与实践

深度学习中的注意力机制&#xff1a;原理、应用与实践 摘要&#xff1a; 本文将深入探讨深度学习中的注意力机制&#xff0c;包括其原理、应用领域和实践方法。我们将通过详细的解析和代码示例&#xff0c;帮助读者更好地理解和应用注意力机制&#xff0c;从而提升深度学习模…

Vue快速实践总结 · 下篇

文章目录 组件间通信方式父 --> 子通信props插槽 子 --> 父通信&#xff08;自定义事件&#xff09;任意组件通信全局事件总线消息订阅与发布 Vuex工作原理运行环境简单使用GettersmapState与mapGettersmapActions与mapMutations模块化 命名空间 VueRouter路由的作用与分…

OpenWrt Lan口上网设置

LAN口上网设置 连接上openwrt&#xff0c;我用的 倍控N5105&#xff0c;eth0&#xff0c;看到Openwrt的IP是10.0.0.1 在 网络 -> 网口配置 -> 设置好 WAN 口和 LAN 口 初次使用经常重置 openwrt 所以我设置的是 静态IP模式 - 网络 -> 防火墙 -> 常规设置 ->…

7.私信列表 + 发送列表

目录 1.私信列表 1.1 数据访问层 1.2 业务层 1.3 表现层 1.4 私信详情 2.发送列表 2.1 数据访问层 2.2 业务层 2.3 表现层 2.4 设置已读状态 1.私信列表 私信列表&#xff1a;查询当前用户的会话列表&#xff0c;每个会话只显示一条最新的私信、支持分页列表私信详情…

苹果cms搭建教程附带免费模板

准备工作: 一台服务器域名源码安装好NGINX+PHP7.0+MYSQL5.5 安装php7.0的扩展,fileinfo和 sg11,不安装网站会搭建失败。 两个扩展都全部安装好了之后 点击-服务-重载配置 这样我们的网站环境就配置完成啦 下载苹果cms 苹果cms程序github链接:选择mac10!下载即可 http…

部署Jenkins

一、介绍 Jenkins 、Jenkins概念 Jenkins是一个功能强大的应用程序&#xff0c;允许持续集成和持续交付项目&#xff0c;无论用的是什么平台。这是一个免费的源代码&#xff0c;可以处理任何类型的构建或持续集成。集成Jenkins可以用于一些测试和部署技术。Jenkins是一种软件允…

自建CA实战之 《0x02 Nginx 配置 https双向认证》

自建CA实战之 《0x02 Nginx 配置 https双向认证》 上一章节我们已经实现了Nginx上配置https单向认证&#xff0c;主要场景为客户端验证服务端的身份&#xff0c;但是服务端不验证客户端的身份。 本章节我们将实现Nginx上配置https双向认证&#xff0c;主要场景为客户端验证服…

基于单片机仿指针显示的电子时钟设计

**单片机设计介绍&#xff0c; 基于51单片机超声波测距汽车避障系统 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机仿指针显示的电子时钟是一种利用单片机控制器和LED或LCD显示屏幕来模拟传统时钟指针的显示效果的设计…

PubMedBERT:生物医学自然语言处理领域的特定预训练模型

今年大语言模型的快速发展导致像BERT这样的模型都可以称作“小”模型了。Kaggle LLM比赛LLM Science Exam 的第四名就只用了deberta&#xff0c;这可以说是一个非常好的成绩了。所以说在特定的领域或者需求中&#xff0c;大语言模型并不一定就是最优的解决方案&#xff0c;“小…

01:编译lua及C调用

我们今天在windows平台编译lua&#xff0c;生成 lua动态库,lua.exe&#xff0c;luac.exe 我把这个目录上传到giee&#xff0c;使用下面命令获取它: git clone gitgitee.com:jameschenbo/lua_c_application.git 或者直接访问:访问网页 目录结构如下&#xff1a; build.cmd 是…

【离散数学】——期末刷题题库(一阶逻辑基本概念)

&#x1f383;个人专栏&#xff1a; &#x1f42c; 算法设计与分析&#xff1a;算法设计与分析_IT闫的博客-CSDN博客 &#x1f433;Java基础&#xff1a;Java基础_IT闫的博客-CSDN博客 &#x1f40b;c语言&#xff1a;c语言_IT闫的博客-CSDN博客 &#x1f41f;MySQL&#xff1a…

开发测试利器之Fiddler网络调试工具详细安装使用教程(包含汉化脚本)

一、Fiddler简介 Fiddler 是一款功能强大的网络调试工具&#xff0c;可以帮助开发人员和测试人员分析和调试网络流量。它通过截取计算机和服务器之间的HTTP/HTTPS请求&#xff0c;并提供详细的请求和响应信息来帮助我们理解和诊断网络通信。 Fiddler 可以用于各种用途&#x…

k8s环境排查nginx转发nacos请求失败问题

一、问题背景 k8s部署两个服务,一个nginx&#xff0c;一个nacos, 服务信息如下(nacos有两个端口): 服务 serviceNameservice类型porttargetPort nodePortnginxmonitor-cp-nginxNodePort808031082nacosmonitor-cp-nacosClusterIP88488848-98489848- ng的default.conf配置文件…

给定一个n×n的方阵,本题要求计算该矩阵除副对角线、最后一列和最后一行以外的所有元素之和。

7-5 矩阵运算 分数 20 全屏浏览题目 切换布局 作者 C课程组 单位 浙江大学 给定一个nn的方阵&#xff0c;本题要求计算该矩阵除副对角线、最后一列和最后一行以外的所有元素之和。副对角线为从矩阵的右上角至左下角的连线。 输入格式: 输入第一行给出正整数n&#xff08;…

获得文件MD5——校验完整性 window 和 Linux下操作

目录 引出window下获得文件MD5Linux下获得文件MD5单个文件整个目录下所有文件检查MD5 总结 引出 1.Windows 10 自带了一个命令行程序 certutil可以 获取文件的 MD5 值&#xff1b; 2.Linux下md5sum命令获得文件MD5值&#xff1b; window下获得文件MD5 Windows 10 自带了一个命…

针对Arrays.asList的坑,可以有哪些处理措施

上文讲述&#xff1a;Error querying database. Cause: java.lang.reflect.InaccessibleObjectException: 那么如果真的只习惯用Arrays.asList&#xff0c;那也是有对应的解决办法的。 一、解决办法大方向 不管做什么事情&#xff0c;都是先判定一个大方向&#xff0c;不管是…

性价比高的护眼灯,好用护眼的护眼台灯推荐

7月27日&#xff0c;2023第七届家居品牌大会在北京启幕&#xff0c;现场发布了“2022—2023家居十大质量事件”&#xff0c;其中“护童、爱果乐齐曝抽检不合格”事件上榜。 在“读写台灯”品类上&#xff0c;本次抽查检验11个省&#xff08;区、市&#xff09;84家企业生产的11…

【开源】基于JAVA的天然气工程运维系统

项目编号&#xff1a; S 022 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S022&#xff0c;文末获取源码。} 项目编号&#xff1a;S022&#xff0c;文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 系统角色分类2.2 核心功能2.2.1 流程…