Redis - increment 递增方法 | 处理防重复和并发问题
一、使用场景
- 1.有时因为网路原因,在保存或其他操作时会发生重复提交问题
- 2.针对秒杀、抢购、多个用户同时下单的情况(不过redis针对秒杀只是其中的一环)
二、incr 递增函数介绍
- Redis Incr 命令将 key 中储存的数字值增一。
- 如果 key 不存在,那么 key 的值会先被初始化为 0 ,然后再执行 INCR 操作。
- 如果值包含错误的类型,或字符串类型的值不能表示为数字,那么返回一个错误。
- 本操作的值限制在 64 位(bit)有符号数字表示之内。
INCR 命令是一个针对字符串的操作。 因为 Redis 并没有专用的整数类型, 所以键 key 储存的值在执行 INCR 命令时会被解释为十进制 64 位有符号整数。
三、示例
@PostMapping(value = "/testRedis")
public R testRedis(HttpServletRequest request) {
// 通过用户ID和访问IP,处理重复请求
String key = userId + IPUtils.getIpAddr(request);
Object redisKey = redisTemplate.opsForValue().get(key);
System.out.println("redis值:" + redisKey);
// redis中的key值存在则表示当前这次请求距离上一次请求不超过下面设置的三秒钟,直接返回即可
if(redisKey != null){
return R.ok("您的操作过快,请刷新重试");
}
Long count = redisTemplate.opsForValue().increment(key, 1); // 设置递增因子
System.out.println("递增的值" + count);
redisTemplate.expire(key, 3, TimeUnit.SECONDS); // 设置过期时间 3秒
return R.ok("成功");
}
通过这种方法,同样我们也可以用到并发的情况下