java实现分布式锁

本文涉及的产品
云原生内存数据库 Tair,内存型 2GB
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Redis 版,倚天版 1GB 1个月
简介: 分布式锁:满足分布式系统或集群模式下多进程可见并且互斥的锁。

分布式锁:满足分布式系统或集群模式下多进程可见并且互斥的锁。

跨机器进程间数据同步问题


我们用第三种 悲观锁

加入依赖

        <!-- redis分布式锁 -->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>lock4j-redisson-spring-boot-starter</artifactId>
            <version>2.2.2</version>
        </dependency>

核心代码

package com.study.task;
import com.baomidou.lock.LockInfo;
import com.baomidou.lock.LockTemplate;
import com.baomidou.lock.executor.RedissonLockExecutor;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.util.UUID;
@Component
@Slf4j
@EnableScheduling
public class ProductTask {
    @Resource
    private LockTemplate lockTemplate;
    @Scheduled(cron = "0/1 0/5 * * * ?")
    public void productTackStart() {
        //get lock
        LockInfo lockInfo = null;
        try {
            String key = UUID.randomUUID() + "";
            log.info("开始加锁------------key:{}", key);
            lockInfo = lockTemplate.lock(key, 5000L, 100L, RedissonLockExecutor.class);
            //对象转json,可以在使用任意一种方法,google/mybatis/alibaba都有封装
            ObjectMapper Obj = new ObjectMapper();
            String jsonStr = Obj.writeValueAsString(lockInfo);
            log.info("lockInfo:{}", jsonStr);
            log.info("定时任务开始-------");
            //业务代码入口
        } catch (Exception e) {
            log.error("异常:", e);
        } finally {
            //解锁
            if (null == lockInfo) {
                log.info("--------lockInfo is null");
                return;
            }
            boolean releaseLock = lockTemplate.releaseLock(lockInfo);
            log.info("-----releaseLock:{}", releaseLock);
        }
    }
}

简化版

//get lock
            LockInfo lockInfo = null;
            try {
                lockInfo = this.lockTemplate.lock(BRAND_KEY_LOCK, 5000L, 0L,
                        RedissonLockExecutor.class);#BRAND_KEY_LOCK定义为唯一的key
                //业务
                Integer updateBrand = this.updateBrand(brandPageReq, now, mchBrand);
                log.info("updateBrand:{}", updateBrand);
            } catch (Exception e) {
                log.error("修改品牌:", e);
            } finally {
                this.lockTemplate.releaseLock(lockInfo);
            }
相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
1月前
|
存储 分布式计算 Java
如何在Java中实现分布式文件系统?
如何在Java中实现分布式文件系统?
|
6天前
|
存储 NoSQL Java
一天五道Java面试题----第十一天(分布式架构下,Session共享有什么方案--------->分布式事务解决方案)
这篇文章是关于Java面试中的分布式架构问题的笔记,包括分布式架构下的Session共享方案、RPC和RMI的理解、分布式ID生成方案、分布式锁解决方案以及分布式事务解决方案。
一天五道Java面试题----第十一天(分布式架构下,Session共享有什么方案--------->分布式事务解决方案)
|
9天前
|
消息中间件 Java Kafka
"Kafka快速上手:从环境搭建到Java Producer与Consumer实战,轻松掌握分布式流处理平台"
【8月更文挑战第10天】Apache Kafka作为分布式流处理平台的领头羊,凭借其高吞吐量、可扩展性和容错性,在大数据处理、实时日志收集及消息队列领域表现卓越。初学者需掌握Kafka基本概念与操作。Kafka的核心组件包括Producer(生产者)、Broker(服务器)和Consumer(消费者)。Producer发送消息到Topic,Broker负责存储与转发,Consumer则读取这些消息。首先确保已安装Java和Kafka,并启动服务。接着可通过命令行创建Topic,并使用提供的Java API实现Producer发送消息和Consumer读取消息的功能。
31 8
|
30天前
|
负载均衡 NoSQL Java
|
1月前
|
存储 消息中间件 运维
使用Java实现分布式日志系统
使用Java实现分布式日志系统
|
1月前
|
SQL NoSQL Java
如何在Java项目中实现分布式锁
如何在Java项目中实现分布式锁
|
1月前
|
缓存 算法 NoSQL
Java中的分布式缓存与一致性哈希算法
Java中的分布式缓存与一致性哈希算法
|
1月前
|
存储 算法 Java
分布式自增ID算法---雪花算法(SnowFlake)Java实现
分布式自增ID算法---雪花算法(SnowFlake)Java实现
|
1月前
|
存储 NoSQL Java
java为什么还需要分布式锁?
java为什么还需要分布式锁?
|
1月前
|
消息中间件 Java 中间件
Java面试题:解释分布式事务的概念,讨论常见的分布式事务解决方案。
Java面试题:解释分布式事务的概念,讨论常见的分布式事务解决方案。
29 0