说明:
用redis计数器存取用户的操作次数,最多3次,但是并发会超过3次,下面的代码对吗?
BoundValueOperations<String, String> operations = redisTemplate.boundValueOps("key1");
String key1 = operations.get();
if (StringUtils.isEmpty(key1)) {
service.do();//这里是业务逻辑操作成功之后,计数器加1
operations.increment(1);
} else {
if (Integer.parseInt(key1) < 2) {
service.do();//这里是业务逻辑操作成功之后,计数器加1
operations.increment(1);
}
}
对于这种计数的业务,应当先计数,再做业务。如果业务完成,发现计数器已经大于限定值了,就傻眼了。
我的方案是:
由于是并发导致的数据不一致,可以考虑用 Redis 的
INCR
命令增 1,并获得最新值(这是一次操作,所以不会造成不一致):如果大于 3,说明已经超过了,结束;
小于等于3,再执行业务(可能还要考虑业务执行失败回滚计数器)。