栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

redisson分布式锁使用,经典好文

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

redisson分布式锁使用,经典好文

适用场景

==========================================

《一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义》

【docs.qq.com/doc/DSmxTbFJ1cmN1R2dB】 完整内容开源分享

=========================

分布式应用,分布式缓存,分布式回话管理,分布式服务(任务,延迟任务,执行器),分布式 redis 客户端。

我们一般使用其分布式锁功能。

项目集成

===================================================================

  • 添加依赖

  • 引入依赖

代码示例


@Resource

private RedissonClient redissonClient;

@Transactional(rollbackFor = Exception.class)

public ResultInfo doSeckill(Integer voucherId, String accessToken, String path) {

// 基本参数校验

AssertUtil.isTrue(voucherId == null || voucherId < 0, “请选择需要抢购的代金券”);

AssertUtil.isNotEmpty(accessToken, “请登录”);

// ----------注释原始的走 关系型数据库 的流程----------

// 判断此代金券是否加入抢购

// SeckillVouchers seckillVouchers = seckillVouchersMapper.selectVoucher(voucherId);

// AssertUtil.isTrue(seckillVouchers == null, “该代金券并未有抢购活动”);

// ----------采用 Redis 解问题----------

String redisKey = RedisKeyConstant.seckill_vouchers.getKey() + voucherId;

Map seckillVoucherMaps = redisTemplate.opsForHash().entries(redisKey);

SeckillVouchers seckillVouchers = BeanUtil.mapToBean(seckillVoucherMaps, SeckillVouchers.class, true, null);

// 判断是否有效

AssertUtil.isTrue(seckillVouchers.getIsValid() == 0, “该活动已结束”);

// 判断是否开始、结束

Date now = new Date();

AssertUtil.isTrue(now.before(seckillVouchers.getStartTime()), “该抢购还未开始”);

AssertUtil.isTrue(now.after(seckillVouchers.getEndTime()), “该抢购已结束”);

// 判断是否卖完通过 Lua 脚本扣库存时判断

//AssertUtil.isTrue(seckillVouchers.getAmount() < 1, “该券已经卖完了”);

// 获取登录用户信息

String url = oauthServerName + “user/me?access_token={accessToken}”;

ResultInfo resultInfo = restTemplate.getForObject(url, ResultInfo.class, accessToken);

if (resultInfo.getCode() != ApiConstant.SUCCESS_CODE) {

resultInfo.setPath(path);

return resultInfo;

}

// 这里的data是一个linkedHashMap,SignInDinerInfo

SignInDinerInfo dinerInfo = BeanUtil.fillBeanWithMap((linkedHashMap) resultInfo.getData(),

new SignInDinerInfo(), false);

// 判断登录用户是否已抢到(一个用户针对这次活动只能买一次)

VoucherOrders order = voucherOrdersMapper.findDinerOrder(dinerInfo.getId(),

seckillVouchers.getFkVoucherId());

AssertUtil.isTrue(order != null, “该用户已抢到该代金券,无需再抢”);

// ----------注释原始的走 关系型数据库 的流程----------

// 扣库存

// int count = seckillVouchersMapper.stockDecrease(seckillVouchers.getId());

// AssertUtil.isTrue(count == 0, “该券已经卖完了”);

// 使用 Redis 锁一个账号只能购买一次

String lockName = RedisKeyConstant.lock_key.getKey() + dinerInfo.getId() + “:” + voucherId;

// 加锁

long expireTime = seckillVouchers.getEndTime().getTime() - now.getTime();

// 自定义 Redis 分布式锁

// String lockKey = redisLock.tryLock(lockName, expireTime);

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/687106.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号