没有合适的资源?快使用搜索试试~ 我知道了~
redis lua实现高并发限流.docx
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 95 浏览量
2022-07-03
11:10:22
上传
评论
收藏 39KB DOCX 举报
温馨提示
试读
11页
我们的灵活用工系统调用优付渠道接口做用户签约或资金下发时,优付系统增加了API接口请求的限流策略。 针对每一个商户的每种类型的接口请求做限流。比如:同一商户,每秒钟只允许20次签约请求。当每秒请求超过20次时,会提示“客户请求签约接口次数超限”。 那么,作为下游系统,我们就要对并发进行控制,以防出现无效请求。 最常用的并发限流方案是借助redis/jedis。为了保证原子性,这里,我使用Redis+LUA脚本的方式来控制。 那么, 对于服务提供方来说,当请求量超出设定的限流阈值,则直接返回错误码/错误提示,并终止对请求的处理。 而对于调用方来说呢,我们要做的是:当并发请求超出了限定阈值时,要延迟请求,而不是直接丢弃。 话不多说,上代码吧。
资源推荐
资源详情
资源评论
redis lua 实现高并发限流
我们的灵活用工系统调用优付渠道接口做用户签约或资金下发时,优付系统增
加了 API 接口请求的限流策略。
针对每一个商户的每种类型的接口请求做限流。比如:同一商户,每秒钟只允
许 20 次签约请求。当每秒请求超过 20 “次时,会提示 客户请求签约接口次数超
”限 。
那么,作为下游系统,我们就要对并发进行控制,以防出现无效请求。
最常用的并发限流方案是借助 redis/jedis。为了保证原子性,这里,我使用
Redis+LUA 脚本的方式来控制。
那么,
对于服务提供方来说,当请求量超出设定的限流阈值,则直接返回错误码/错误
提示,并终止对请求的处理。
而对于调用方来说呢,我们要做的是:当并发请求超出了限定阈值时,要延迟
请求,而不是直接丢弃。
话不多说,上代码吧。
如下 RedisLimiter 类,服务提供方使用 limit 方法实现限流,服务调用方使用
limitWait 方法实现限流等待(如需)。
package jstudy.redislimit;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.script.DefaultRedisScript;
import org.springframework.data.redis.core.script.RedisScript;
import org.springframework.stereotype.Component;
import java.util.Collections;
import java.util.List;
import java.util.concurrent.TimeUnit;
/**
* Redis+Lua 实现高并发限流
*/
@Slf4j
@Component
public class RedisLimiter {
@Autowired
private RedisTemplate<String, Object> redisTemplate;
/**
* 达到限流时,则等待,直到新的间隔。
*
* @param key
* @param limitCount
* @param limitSecond
*/
public void limitWait(String key, int limitCount, int limitSecond) {
boolean ok;//放行标志
do {
ok = limit(key, limitCount, limitSecond);
log.info("放行标志={}", ok);
if (!ok) {
Long ttl = redisTemplate.getExpire(key,
TimeUnit.MILLISECONDS);
if (null != ttl && ttl > 0) {
try {
Thread.sleep(ttl);
log.info("sleeped:{}", ttl);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
} while (!ok);
}
/**
* 限流方法 true-放行;false-限流
*
* @param key
* @param limitCount
* @param limitSecond
* @return
*/
public boolean limit(String key, int limitCount, int limitSecond) {
List<String> keys = Collections.singletonList(key);
String luaScript = buildLuaScript();
RedisScript<Number> redisScript = new
DefaultRedisScript<>(luaScript, Number.class);
Number count = redisTemplate.execute(redisScript, keys,
limitCount, limitSecond);
log.info("Access try count is {} for key = {}", count, key);
剩余10页未读,继续阅读
资源评论
小兔子平安
- 粉丝: 209
- 资源: 1940
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功