先贴一段简单 code:
//红包锁 redis_lock:redpacket:${redPacketId}
String lockName = RedisKeys.buildDistributedLockKey("redpacket", redPacketId);
RLock rLock = redissonClient.getLock(lockName);
//用户锁 redis_lock:redpacket_userid:${userId}
String lockUserName = RedisKeys.buildDistributedLockKey("redpacket_userid", userId);
RLock lockUser = redissonClient.getLock(lockUserName);
try {
rLock.lock(10, TimeUnit.SECONDS);
lockUser.lock(10, TimeUnit.SECONDS);
//抢红包
return doUnpack(redPacketId);
} finally {
lockUser.unlock();
rLock.unlock();
}
----------------
问题如果没有加 lockUser 锁的情况下:
用 jmeter 测试 单用户 10 个线程并发, 持续测试 5-10 个用户左右, 就肯定会出现一个人执行了两次业务逻辑的问题,
更加奇怪的是, 我业务逻辑也用 redis 做过重复领取红包的行为判断 用的是 redis set isMember 判断的, 那两次重复执行的请求中, 第二次却没有检查出来!!!
所以我怀疑我是不是把 redis 哪里给玩坏了??
ps: redis 配置很简单 就个单节点~
//红包锁 redis_lock:redpacket:${redPacketId}
String lockName = RedisKeys.buildDistributedLockKey("redpacket", redPacketId);
RLock rLock = redissonClient.getLock(lockName);
//用户锁 redis_lock:redpacket_userid:${userId}
String lockUserName = RedisKeys.buildDistributedLockKey("redpacket_userid", userId);
RLock lockUser = redissonClient.getLock(lockUserName);
try {
rLock.lock(10, TimeUnit.SECONDS);
lockUser.lock(10, TimeUnit.SECONDS);
//抢红包
return doUnpack(redPacketId);
} finally {
lockUser.unlock();
rLock.unlock();
}
----------------
问题如果没有加 lockUser 锁的情况下:
用 jmeter 测试 单用户 10 个线程并发, 持续测试 5-10 个用户左右, 就肯定会出现一个人执行了两次业务逻辑的问题,
更加奇怪的是, 我业务逻辑也用 redis 做过重复领取红包的行为判断 用的是 redis set isMember 判断的, 那两次重复执行的请求中, 第二次却没有检查出来!!!
所以我怀疑我是不是把 redis 哪里给玩坏了??
ps: redis 配置很简单 就个单节点~
