基于redis的限流

守給你的承諾、 提交于 2020-04-16 08:47:07

【推荐阅读】微服务还能火多久?>>>

/**
* 基于redis的限流
* @author: whh
* @date: 2020.03.19
**/

public class RedisRateLimitUtil {





public static final Logger LOGGER = LoggerFactory.getLogger(RedisRateLimitUtil.class);

    @Resource(name = "anticheatRedisClient")
    private RedisClient anticheatRedisClient;

    public boolean tryAcquire(String key, int timeWindow, int limitNum) {
        boolean acquireResult = anticheatRedisClient.execute(key, new JedisAction<Boolean>() {
            @Override
            public Boolean action(Jedis jedis) {
                try {
                    String setNxResult = jedis.set(key, "1", "NX", "EX", timeWindow);
                    if ("OK".equals(setNxResult)) {
                        return true;
                    }
                    Long num = jedis.incr(key);
                    if (num == 1) {
                        jedis.expire(key, timeWindow);
                    }
                    if (num > limitNum) {
                        return false;
                    }
                    return true;
                } catch (Exception e) {
                    LOGGER.error("acquireResult error", e);
                }
                return true;
            }
        });
        return acquireResult;
    }
}

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!