Java使用分布式锁来防止重复提交

1.分布式锁使用场景

分布式锁的使用场景包括以下几个方面:

1)防止重复操作:在某些业务场景下,可能会出现多个客户端同时对同一资源进行修改或者访问的情况。为了避免这种情况发生,可以采用分布式锁来保证只有一个客户端能够成功获取到资源并执行相应操作。

2)控制并发流量:在高并发环境中,如果所有请求都直接访问后台服务,则很容易造成系统崩溃或者性能下降等问题。因此可以通过引入分布式锁机制来控制并发流量,并确保系统稳定运行。

3)任务调度与协作:在大规模分布式系统中,可能需要对各个节点上的任务进行统一管理和协调。此时可以利用分布式锁机制实现任务调度、负载均衡和故障恢复等功能。

4)数据库事务控制:在数据库事务处理过程中,为了防止数据不一致或者死锁等问题,通常需要采用分布式锁机制来保证事务正确执行。

总之,在任何需要对共享资源进行互斥访问、控制流量或者协作处理的场景下都可以考虑使用分布式锁技术。

2.使用Redisson实现分布式锁防止重复提交

步骤如下:

选择合适的分布式锁实现:常见的分布式锁实现包括ZooKeeper、Redis和基于数据库等。根据具体情况选择最佳方案。

获取分布式锁:在需要进行操作时,首先尝试获取分布式锁。如果成功获取到,则可以执行相应操作;否则说明已经有其他客户端正在处理该请求,此时可以直接返回或者等待一段时间后再次尝试。

执行业务逻辑:在获得了分布式锁之后,即可执行相应业务逻辑。例如,在Web应用中可以将表单数据保存到数据库中,并标记为已处理状态。

释放分布式锁:在完成所有操作之后,必须及时释放占用的资源(包括数据库连接、文件句柄等)以及释放所持有的分布式锁。

以下是一个简单示例代码演示如何使用Java实现基本的防止重复提交功能:

public class SubmitController {private static final String LOCK_KEY = "submit_lock";// Redisson客户端private RedissonClient redisson;// 初始化方法,在系统启动时执行public void init() throws Exception {Config config = new Config();
        config.useSingleServer().setAddress("redis://localhost:6379");
        redisson = Redisson.create(config);System.out.println("SubmitController initialized.");}// 处理POST请求@PostMapping("/submit")public String submit(@RequestParam("data") String data) {RLock lock = redisson.getLock(LOCK_KEY);try{if(lock.tryLock()){// 获得了排他性质的全局互斥访问权, 可以开始对共享资源进行修改。saveDataToDatabase(data); }else{throw new RuntimeException("请勿重复提交!");}}finally{
            lock.unlock();}}// 将数据保存到数据库中并标记为已处理状态private void saveDataToDatabase(String data){Connection conn = null;PreparedStatement stmt = null;try{
              conn = getConnectionFromPool();  //从连接池中获取连接对象
              stmt=conn.prepareStatement("INSERT INTO my_table (data, is_processed) VALUES (?, ?)");
              stmt.setString(1,data);
              stmt.setBoolean(2,true);int rowsAffected=stmt.executeUpdate();}catch(SQLException ex){throw new RuntimeException(ex.getMessage(),ex);}finally{closeStatement(stmt);   //关闭语句对象  releaseConnection(conn);   //归还连接对象给连接池 }}
}

3.使用ZooKeeper实现分布式锁防止重复提交

以下步骤:

创建一个ZooKeeper客户端连接。

在ZooKeeper上创建一个持久节点作为锁的根节点,例如“/locks”。

当需要获取锁时,在“/locks”下创建一个临时顺序节点,并记录该节点的名称。例如,“/locks/lock-000001”。

获取所有子节点并按照顺序排序。

如果当前创建的临时顺序节点是第一个,则表示获得了锁;否则,监听前面一个子节点的删除事件,并等待通知。

释放锁时,删除自己创建的临时顺序节点即可。

代码示例:

public class DistributedLock {private final ZooKeeper zookeeper;private final String lockPath;public DistributedLock(ZooKeeper zookeeper, String lockPath) {this.zookeeper = zookeeper;this.lockPath = lockPath;}public void acquire() throws KeeperException, InterruptedException {// 创建临时顺序节点String path = zookeeper.create(lockPath + "/lock-", new byte[0], ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL_SEQUENTIAL);// 获取所有子节点并按照顺序排序List<String> children = zookeeper.getChildren(lockPath, false);Collections.sort(children);if (!path.equals(lockPath + "/" + children.get(0))) {// 如果当前不是最小编号,则监听前面一个子节点的删除事件int index = Collections.binarySearch(children, path.substring(path.lastIndexOf('/') + 1));String prevNodeName = children.get(index - 1);CountDownLatch latch = new CountDownLatch(1);Stat stat = zookeeper.exists(lockPath + "/" + prevNodeName,
                event -> { if (event.getType() == EventType.NodeDeleted) latch.countDown(); });if (stat != null) latch.await();acquire();}}public void release() throws KeeperException, InterruptedException {// 删除自己创建的临时顺序节
         zookeeper.delete(path, -1);    }
}

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

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

相关文章

版本控制系统:Git 纯应用(持续更新)

基本操作 ctrl上行键&#xff1a;上次代码 本地仓库&#xff1a;Git init 新建文件&#xff1a;touch xxxx.xxx 查看状态&#xff1a;Git status 文件从工作区——暂存区&#xff1a;Git add ./文件名(.是通配符代表所有) 暂存区——仓库&#xff1a;Git commit -m &…

PLC边缘网关在实际应用中的作用-天拓四方

随着工业自动化的快速发展&#xff0c;PLC已成为工业自动化领域中不可或缺的核心设备。然而&#xff0c;随着工业物联网的兴起&#xff0c;PLC设备面临着数据集成、远程监控以及安全性等方面的挑战。为了解决这些问题&#xff0c;PLC边缘网关应运而生&#xff0c;它作为连接PLC…

极简通俗VAE

一、VAE 背景&#xff1a;VAE什么变分自编码器&#xff0c;听起来起名都头大&#xff0c;用大白话告诉你。 把一个复杂图片压缩成两个参数&#xff0c;用这个参数采样再复原。 这个简单的东西是两个参数&#xff0c;均值和方差&#xff0c;用&#xff08;0&#xff0c;1&…

Idea-Idea配置gitIgnore忽略文件

背景 在项目提交到Git过程中&#xff0c;总有一些文件&#xff0c;例如.idea和.iml等这些我们不想提交的&#xff0c;直接添加进入gitIgnore文件中自动忽略掉。 Idea安装插件 1、在File->Setting->Plugins中搜索gitIgnore并安装插件 2、项目右键new->.ignore File-…

【mybatis】mybatis-plus简单使用

1、简介 MyBatis-Plus&#xff08;简称MP&#xff09;是MyBatis的增强工具&#xff0c;它在MyBatis的基础上进行了扩展&#xff0c;以简化开发、提高效率。本案例是一个MyBatis-Plus的简单使用案例&#xff0c;包括项目的初始化、配置、实体类、Mapper接口以及基本的CRUD操作。…

企业LoRA模型定制服务

&#x1f308; 最强AI绘画模型训练、定制服务公司出炉 —— 触站AI&#xff0c;设计界的智能魔法师 &#x1f9d9;‍♂️ &#x1f3a8; 触站AI&#xff0c;用智能技术解锁设计的无限可能 &#x1f3a8;在创意与科技交织的今天&#xff0c;触站AI以其AI绘画模型训练和定制服务…

交易时你是否会考虑多种观点呢?

在交易过程中&#xff0c;考虑多种观点并融入多元化分析&#xff0c;是提升交易决策质量和最终交易结果的关键因素之一。 单一观点或分析方法往往容易受到个人偏见、情绪或信息局限性的影响。通过引入多元化分析&#xff0c;我们可以从不同角度审视市场&#xff0c;减少因主观…

iPhone苹果手机怎么取消腾讯视频VIP会员自动续费?

腾讯视频会员分为VIP&#xff08;同时在线设备5台、同时播放设备2台&#xff1b;&#xff09;和SVIP&#xff08;同时在线设备8台、同时播放设备3台&#xff1b;&#xff09;&#xff0c;在iPhone苹果手机上开通腾讯视频连续包月、包季、包年后&#xff0c;需要手动取消才能关闭…

linux centos tomcat 不安全的HTTP请求方法

1、页面查看 2、在linux主机可使用此命令查看 curl -v -X OPTIONS http://实际地址 3、进入tomcat conf目录vim web.xml&#xff0c;增加以下内容 <!-- close insecure http methods --> <security-constraint><web-resource-collection><web-resource…

从零到一:全面掌握模板机部署与虚拟机克隆的实训指南【实训Day01】

一、模板机的部署 1.设置好子网ip和子网掩码以及网关 保证有NAT模式 子网IP着重记住前三段&#xff1a;192.168.222.xxx 2.开始建立虚拟机 注意&#xff1a;路径中不要有中文 3.安排8个内核 4.安排2GB内存 创建初步成功&#xff0c;接着 5.开启此虚拟机 6.选择中文 7.日期&…

Java中的面向对象编程思想

Java中的面向对象编程思想 大家好&#xff0c;我是微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; 面向对象编程&#xff08;Object-Oriented Programming&#xff0c;简称OOP&#xff09;是一种软件开发方法&#xff0c;它…

高校实训室:康养实训室在智慧养老服务方面的应用

随着人口老龄化的加剧&#xff0c;智慧养老服务成为应对养老挑战的重要途径。高校康养实训室作为培养专业人才和开展科研创新的重要场所&#xff0c;在智慧养老服务方面发挥着关键作用。本文深入探讨了康养实训室在智慧养老服务中的应用&#xff0c;包括技术应用、人才培养、实…

Ubuntu手动编译源码安装Python

Ubuntu系统手动编译源码安装Python 0. 下载源码压缩包 在python官网找到所需版本的python安装包&#xff0c;下载到Ubuntu系统中 https://www.python.org/downloads/ 本文以python3.8.2为例演示编译过程 ‍ 1 手动编译安装 1.1 解压压缩包 tar -zxvf Python-3.8.2.tgz可…

【计算机网络】计算机网络的分类

计算机网络的分类 导读一、按分布范围分类1.1 广域网&#xff08;WAN&#xff09;。1.2 城域网&#xff08;MAN&#xff09;1.3 局域网&#xff08;LAN&#xff09;1.4 个人区域网&#xff08;PAN&#xff09;1.5 多处理器系统 二、按传输技术分类2.1 广播式网络2.2 点对点网络…

统信UOS+银河麒麟系统开发、运维使用技巧与疑难问题解决经验

文章目录 1.开发运维常用技巧1.1 设置root密码1.2 安装g编译器1.3 系统无法登录进入命令行终端1.4 开机启动ssh服务1.5 查看显卡GPU使用率1.5.1 AMD显卡查看GPU使用率1.5.2 景嘉微显卡1.5.3 英伟达显卡 1.6 OpenGL接口版本查看1.6.1 查看OpenGL接口版本1.6.2 查看OpenGL ES接口…

LaySNS模板仿RiPro日主题素材源码资源下载响应式CMS模板

LaySNS模板仿RiPro日主题素材源码资源下载响应式CMS模板&#xff0c;该主题是网上泛滥的RiPro主题仿制而成的laysns模板&#xff0c;原主题是很强大的。 全站功能是通过ajax响应实现的&#xff0c;另外就是网上流传得比较多的是美化版。 主要说明&#xff1a;付费/回复下载功…

面试题003-Java-Java多线程(上)

面试题003-Java-Java多线程(上) 目录 面试题003-Java-Java多线程(上)题目自测题目答案1. 什么是线程和进程? 线程与进程的关系和区别&#xff1f;2. 为什么要使用多线程?3. 什么是线程上下文切换?4. 什么是线程死锁? 如何避免死锁?5. 乐观锁和悲观锁了解么&#xff1f;如何…

用Chromatix进行tuning流程

##一、基本调试 ###1、工程初始配置&#xff1a; 这个工具就是一个图形化的参数编辑器&#xff0c;其实所有tuning中的效果参数直接改文件参数酒醒&#xff0c;工具的好处是&#xff1a;带有检查错误和模拟的功能以及一些校验工具和脚本。 初始化可以中需要的配置&#xff1a;t…

鸿蒙如何打包应用程序

总结鸿蒙应用程序包 之前文章详细讲解了关于三种程序包的内容&#xff0c;现在简单总结一下&#xff1a; 1. 总结 首先需要搞清楚鸿蒙项目的模块Module的分类: Module分为“Ability”和“Library”两种类型 HAP HAP: Harmony Ability Package , 叫做鸿蒙Ability包。 “Abil…

全面详解菲律宾slots游戏本土网盟广告CPI流量效果分析

全面详解菲律宾slots游戏本土网盟广告CPI流量效果分析 一、引言 随着互联网的普及和移动设备的广泛应用&#xff0c;网络游戏行业迅速崛起&#xff0c;成为全球娱乐市场的一大热门。菲律宾作为东南亚地区的重要国家&#xff0c;其网络游戏市场也呈现出蓬勃的发展势头。在这样的…