错过一秒就抢不到Redis秒杀限流实例(redis限制抢购)
秒杀活动可以带动用户的活跃和商家的收益,但是设置限流关键技术是秒杀系统要因应高并发场景的重要条件。本文介绍如何使用Redis限流,实现秒杀限流。
基本思路:
1. 用redis实现每个用户每天对同一秒杀商品的请求次数限制,避免恶意秒杀,如限制单个用户1天最多只能秒杀某个商品2次;
2. 对整体请求流量进行控制,比如:秒杀每分钟最多支持10000次请求,超过该流量的请求均返回失败
实现步骤:
1. 定义常量
String GOODS_ID = “goods_id”;
long ONEDAY_MILLISECONDS = 1000*3600*24;
2. 设置用户限流:在秒杀开始前,获取用户id,拼接key设置用户行为,key格式如下:
(GOODS_ID~userID),例如: (1~2)
“`java
// 拼接存储key
String key = GOODS_ID+”~”+userID;
// 设置存储的有效期
redisTemplate.expire(key,ONEDAY_MILLISECONDS,TimeUnit.MILLISECONDS);
// 设置访问次数
redisTemplate.opsForValue().increment(key,1);
// 判断访问次数是否超过限制
Long count = redisTemplate.opsForValue().get(key);
if (count >=2) {
return fl(“exceed”);
}
3. 设置API限流:拼接key设置每分钟请求接口次数,key格式举例如下:
(seckill_limit~minute~userID), 例如: (seckill_limit~2019-06-08 12:00~2)
```java // 拼接存储key
String minute =formate.format(new Date());String key = "seckill_limit"+"~"+ minute+"~"+userID;
// 设置存储的有效期redisTemplate.expire(key,60 - second,TimeUnit.SECONDS);
// 设置访问次数redisTemplate.opsForValue().increment(key,1);
// 获取存的值Long count = redisTemplate.opsForValue().get(key);
if(count > 10000) { return fl("exceed");
}
以上就是使用Redis限流实现秒杀限流的思路,关键是存储key的设置,并在秒杀前给定有效期和限流次数,让用户在秒杀成功之前有更多参与选择,避免因秒杀限流失去机会。