错过一秒就抢不到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的设置,并在秒杀前给定有效期和限流次数,让用户在秒杀成功之前有更多参与选择,避免因秒杀限流失去机会。


数据运维技术 » 错过一秒就抢不到Redis秒杀限流实例(redis限制抢购)