当前位置: 首页 > news >正文

【分布式锁通关指南 05】通过redisson实现分布式锁

引言

在上个篇章中,我们通过redis手撸了一套分布式锁,但是最后也提到了它依然存在不完美的地方。那么有没有更简单和靠谱的实现方式。当然有,在本篇章中,我们将讲解如何使用redisson框架实现分布式锁以及理解它的源码。

什么是redisson

一句话总结-redis的高性能客户端,我们选择它是因为它内部已经封装好了很多锁的实现,详细介绍可以通过redisson的Github主页来查看。

在这里插入图片描述

SpringBoot整合redisson

我们继续以扣减库存的案例为例,看看如何通过SpringBoot来整合redisson,从而解决并发问题。

1.引入依赖

redisson的Github的readme里我们可以找到它的Quick start,里面就有最新版本的引入指引,当然你也可以在maven的中央仓库中找到。

在这里插入图片描述## 2.配置对象

接着将redisson的客户端对象注册成Bean,方便我们在别的service里可以注入使用,代码如下:

import org.redisson.Redisson;
import org.redisson.api.RedissonClient;
import org.redisson.config.Config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class RedissonConfig {

    @Bean
    public RedissonClient redissonClient(){
        Config config = new Config();
        config.useSingleServer().setAddress("redis://127.0.0.1:6379");
        return Redisson.create(config);
    }
    
}

3.代码实现

redisson的封装非常完善,我们只需要获取锁、加锁、解锁即可,改造后的代码如下:


@Autowired
private RedissonClient redissonClient;


public String deductStockRedissonLock(Long goodsId, Integer count) {
    RLock lock = null;
    try {
        lock = redissonClient.getLock("lock" + goodsId);
        lock.lock();
        //1.查询商品库存数量
        String stock = template.opsForValue().get("stock" + goodsId);
        if (StringUtil.isNullOrEmpty(stock)) {
            return "商品不存在!";
        }
        int lastStock = Integer.parseInt(stock);
        //2.判断库存数量是否足够
        if (lastStock < count) {
            return "库存不足!";
        }
        //3.如果库存数量足够,则去扣减库存
        template.opsForValue().set("stock" + goodsId, String.valueOf(lastStock - count));
        return "扣减库存成功";
    } catch (Exception e) {
        throw new RuntimeException(e);
    } finally {
        if (lock != null) {
            lock.unlock();
        }
    }
}

在上个章节中我们考虑的锁重入、锁超时、锁阻塞等问题,这个时候我们不再需要考虑,它的底层都已经为我们完成了封装,我们只需要用即可,相关实现的源码我们会在后续章节中为大家带来讲解。

4.测试

改造完成后我们启动服务,先准备5000个库存,如下:

在这里插入图片描述
接着通过JMeter进行压测:

在这里插入图片描述
此时,库存剩余数量也为0,说明也无并发问题。

在这里插入图片描述

小结

本篇通过对redisson的整合,我们简化了分布式锁的实现,不用再关注各种边界情况,但是它做了什么样的封装也是需要我们学习的。因此,在后续的几个篇章里,将会为大家剖析redisson有关锁实现的源码。

相关文章:

  • 昆山市住房和城乡建设局网站市场监督管理局是干什么的
  • 厘米售卡站怎么做网站广东网络优化推广
  • 做视频直播网站需要多少资金优化seo方法
  • dede还是wordpress网站seo的方法
  • 做网站域名的成本百度快照如何优化
  • 南京 网站备案重庆网站页面优化
  • 【AIGC系列】5:视频生成模型数据处理和预训练流程介绍(Sora、MovieGen、HunyuanVideo)
  • 基于 Ray 构建的机器学习平台
  • 处理大数据的架构模式:Lambda 架构 和 Kappa 架构
  • 防火墙的智能选路与NAT实验
  • Qt 中 **QGraphicsView** 框架的总结
  • 【大模型系列篇】DeepSeek开源周,解锁AI黑科技
  • 【密码学实战】Java 实现 SM2 国密算法(签名带id、验签及 C1C3C2 加密解密)
  • 51页精品PPT | 农产品区块链溯源信息化平台整体解决方案
  • RK3588部署YOLOv8
  • 在 Vue 单文件组件(SFC)中,标签的显式关闭与隐式关闭有着重要的区别
  • QNAP威联通NAS第三方动态域名解析之docker部署DDNS GO
  • 企业为什么要选择软件测试外包公司?湖南软件测试公司有哪些?
  • GPT-4.5来了
  • 基于路由策略的BGP路径控制实验笔记
  • GCN从理论到实践——基于PyTorch的图卷积网络层实现
  • Deepseek API接入IDE【VSCode Cline Cursor ChatBox Deepseek deepseek-reasoner】
  • 项目开发时,涉及到的css样式
  • 【WPF命令绑定之--没有Command属性的控件如何进行命令绑定?】
  • 单例模式---是 Spring 容器的核心特性之一
  • 【AutoSar CP】SoAd模块