适用场景
==========================================
《一线大厂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
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);
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)