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

黑马点评学习笔记11(Redission)

前言

前面介绍了基于Redis实现分布式锁来解决优惠券秒杀系统中的高并发问题。通过SET key value NX PX命令实现互斥锁,结合Spring的setIfAbsent方法封装锁获取逻辑。实现中需要注意锁的过期时间设置以避免死锁,以及事务处理保证数据一致性。该方案有效解决了JVM单机锁在分布式环境下的局限性。

经过上面的优化,我们实现的分布式锁已经达到生产可用级别了,但是还不够完善,比如:

在这里插入图片描述

来看看怎么解决吧

像上面一步优化分布式锁,太麻烦了,可以直接使用已经实现好的Redission’。

来看看什么是Redission吧

Redisson 是一个基于 Java 的 Redis 客户端,它不仅提供了对 Redis 原生命令的封装,更重要的是在 Redis 的基础上实现了一系列分布式对象、服务和工具,使得开发者可以像使用本地 Java 对象一样操作分布式环境中的共享资源。Redisson 的设计目标是简化分布式系统开发,提供线程安全、高性能、高可用的分布式解决方案。

在这里插入图片描述
Redisson实现分布式锁
1)引入Redisson依赖

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

2)配置Redisson客户端

package com.hmdp.config;import ...@Configuration
public class RedissonConfig {@Beanpublic RedissonClient redissonClient() {// 创建配置Config config = new Config();config.useSingleServer().setAddress("redis://localhost:6379");//我的Redis是本地的,要改成自己的如果有密码记得配置// 创建RedissonClient对象return Redisson.create(config);}
}

4)Redission的使用:其实就是换一个锁把我们自己写的RedisIdWorker锁换成刚刚配置的redisson锁

package com.hmdp.service.impl;import .../*** <p>*  服务实现类* </p>** @author 虎哥* @since 2021-12-22*/
@Slf4j
@Service
public class VoucherOrderServiceImpl extends ServiceImpl<VoucherOrderMapper, VoucherOrder> implements IVoucherOrderService {@Resourceprivate ISeckillVoucherService seckillVoucherService;@Resourceprivate RedisIdWorker redisIdWorker;@Resourceprivate StringRedisTemplate stringRedisTemplate;@Resourceprivate RedissonClient redissonClient;/*查询领取秒杀券*/@Overridepublic Result seckillVoucher(Long voucherId) {//1.查询优惠券SeckillVoucher voucher = seckillVoucherService.getById(voucherId);//2.判断秒杀是否开始if (voucher.getBeginTime().isAfter(LocalDateTime.now())) {return Result.fail("秒杀尚未开始");}//3.判断秒杀是否结束if (voucher.getEndTime().isBefore(LocalDateTime.now())) {return Result.fail("秒杀已结束");}//4.判断库存是否充足if (voucher.getStock() < 1) {return Result.fail("库存不足");}// 3、创建订单(使用分布式锁)Long userId = ThreadLocalUtls.getUser().getId();RLock lock = redissonClient.getLock(RedisConstants.LOCK_ORDER_KEY + userId);boolean isLock = lock.tryLock();if (!isLock) {// 索取锁失败,重试或者直接抛异常(这个业务是一人一单,所以直接返回失败信息)return Result.fail("一人只能下一单");}try {// 索取锁成功,创建代理对象,使用代理对象调用第三方事务方法, 防止事务失效IVoucherOrderService proxy = (IVoucherOrderService) AopContext.currentProxy();return proxy.createVoucherOrder(userId, voucherId);} finally {lock.unLock();}}/*
//    创建订单
//     */@Transactional  //添加事务保证数据库操作和缓存操作的原子性public void createVoucherOrder(VoucherOrder voucherOrder) {//5.一人一单//5.1 查询订单Long userId = voucherOrder.getUserId();//5.1 获取锁成功int count = query().eq("user_id", userId).eq("voucher_id", voucherOrder).count();//5.2.判断是否存在if (count > 0) {//用户购买过log.error("用户已经买过了");return ;}//6.扣减库存boolean success = seckillVoucherService.update().setSql("stock = stock - 1").eq("voucher_id", voucherOrder).gt("stock", 0)//where id = ? and stock > 0.update();if (!success) {//扣减库存失败log.error("库存不足");return ;}//写入数据库save(voucherOrder);}
}

所以其实最好的分布式锁,就是用别人写好包装好的🤪,一场酣畅淋漓的白雪。。。
本文是学习黑马程序员—黑马点评项目的课程笔记,小白啊!!!写的不好轻喷啊🤯如果觉得写的不好,点个赞吧🤪(批评是我写作的动力)

…。。。。。。。。。。。…
请添加图片描述

…。。。。。。。。。。。…

http://www.dtcms.com/a/609156.html

相关文章:

  • 计算机网络复习日报18
  • 网站开发合同知识产权wordpress gettheid
  • Redis 全体系深度解析(架构原理、性能模型、使用场景、持久化机制、过期策略与最佳实践)
  • 百度世界 2025 核心看点:文心 5.0、萝卜快跑、惠博星数字人、伐谋智能体齐亮相!
  • 【百度拥抱开源】介绍ERNIE-4.5-VL-28B-A3B-Thinking:多模态AI的重大突破
  • HarmonyOS分布式输入法开发:实现多设备无缝输入体验
  • 基于GIS的智慧旅游调度指挥平台
  • 网站怎么做才美观WordPress moe acg
  • C/C++ Linux网络编程4 - 解决TCP服务器并发的方式
  • AI取名大师 | uni-app + Wot UI 跟随设备自动切换明暗主题
  • 镜像站更新
  • 《uni-app跨平台开发完全指南》- 07 - 数据绑定与事件处理
  • 福州网站建设方案咨询免费观看电视剧软件
  • 虚拟机网站建设与管理wordpress前台修改密码
  • 福州绿光网站建设工作室合肥那个公司做网站优化好
  • Java基础——方法
  • 设计模式实战篇(二):业务逻辑“随时切换招式”——策略模式(Strategy Pattern)解析
  • 从“能说会道”到“自主思考”:一文读懂AI的过去、现在与未来
  • Python语言编译器 | Python语言编译器的使用与原理解析
  • 【JAVA 进阶】Spring Boot 注解体系与工程实践
  • Effective Python 第51条:优先考虑通过类修饰器来提供可组合的扩充功能,不要使用元类
  • Rust时序数据库实现:从压缩算法到并发优化的实战之旅
  • SpringCloud-Consul服务注册与发现
  • 网站建设原因分析wordpress 页面分页
  • SSH级知识管理:通过CPolar暴露Obsidian vault构建你的知识API服务,实现跨设备无缝同步
  • 《Linux系统编程之进程基础》【进程入门】
  • Hello-agents TASK03 第四章节 智能体经典范式构建
  • C++ 二叉搜索树(BST)完全指南:从概念原理、核心操作到底层实现
  • 电子电气架构 --- 哨兵模式初入门
  • 桌面开发,在线%考试管理%系统,基于eclipse,java,swing,mysql数据库。