发红包
- 发红包无需加锁
- 使用redis的list的数据结构:
- LPUSH hongbao:a 1 2 3 4 5
- 红包金额: 二倍均值法 。 剩余金额M,人数N 每次抢到的金额 = (0,(M / N )X2)
redisTemplate.opsForList().leftPushAll(key,packages);
redisTemplate.expire(key,1,TimeUnit.Days)
抢红包
- 需要加锁
- 使用 LPOP hongbao:a 可以出来红包的金额
obj =redisTemplate.opsForHash().get(key,userId);
// 没抢过
if(obj == null){
Package obj = redisTemplate.opsForList().leftPop(key);
if(obj!=null){
redisTemplate.opsForHash().put(key,userId,obj);
// --> 后续使用Mysql或者rabbitmq进一步处理
}
}
记红包
- 记的时候用hash
- 不用加锁
- 下订单可以先redis,在MQ在redis