前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >分布式锁

分布式锁

作者头像
摸鱼的G
发布2023-02-22 11:46:36
2480
发布2023-02-22 11:46:36
举报
文章被收录于专栏:火属性小虫

分布式锁

什么是分布式

分布式结构就是将一个完整的系统,按业务功能,拆分成一个个独立的子系统,在分布式结构中,每个子系统就被称为”服务”。

在java中,synchronized关键词在我们的代码中是常见的,这些都是本地锁,只能解决一台服务器并发问题。

但随着业务增大,我们无法保证某个数据的改变是同一台服务器操作的。因此,我们需要一个能锁住所有服务器的锁—分布式锁。

使用Redis分布式锁,就需要用到Reddission客户端,它提供的功能远远超出了一个Redis客户端的范畴。在支持基本Redis功能的同时,提供了一些高级服务:

  1. 远程调用
  2. 分布式锁
  3. 分布式对象、容器

使用依赖:

代码语言:javascript
复制
<dependencies>
    <dependency>
        <groupId>org.redisson</groupId>
        <artifactId>redisson-spring-boot-starter</artifactId>
        <version>3.13.0</version>
    </dependency>
</dependencies>

装载一下对象

代码语言:javascript
复制
@Autowired
private RedissonClient redissonClient;

实现Redis分布式锁大致需要三步:

1.取得锁

代码语言:javascript
复制
RLock rLock = redissonClient.getLock("CUSTOM_NAME");

redissonClient.getLock() 得到一个 Redis 锁对象,方法参数是 字符串 类型的自定义锁名称,不一定要用数据 Key ,一般推荐用容易理解的、业务相关的名称。

CUSTOM_NAME 只是代码举例哦

为了减少冲突、明确含义、易于理解和维护,不要以简单的数字 id 值作为 Redis 中的数据 Key,推荐的格式是:

代码语言:javascript
复制
productId-1-stock

2.上锁

使用:

代码语言:javascript
复制
rLock.lock();
  1. 并发情况下,每个线程都会竞争锁:
  2. 竞争成功(获取锁)的线程会继续允许
  3. 竞争失败的线程会被禁用,并且重新获取锁之前,该线程将一直处于休眠状态。

简单说,抢不到锁的线程会持续等待,所有使用锁要特别小心

3.解锁

代码语言:javascript
复制
rLock.unlock();

有上锁就必然要解锁,否则会导致线程持续等等而产生死锁,系统也就卡死了。

所以,推荐把业务操作放在try–catch–finally中:

代码语言:javascript
复制
try {
  rLock.lock();
  // 抢购业务逻辑
} catch (Exception e) {
    LOG.error("some error. ", e);
} finally {
    rLock.unlock();
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 分布式锁
相关产品与服务
云数据库 Redis
腾讯云数据库 Redis(TencentDB for Redis)是腾讯云打造的兼容 Redis 协议的缓存和存储服务。丰富的数据结构能帮助您完成不同类型的业务场景开发。支持主从热备,提供自动容灾切换、数据备份、故障迁移、实例监控、在线扩容、数据回档等全套的数据库服务。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档