redis+lua分布式高并发--限流算法

lua脚本 limit.lua

local key = KEYS[1]
local limit = tonumber(ARGV[1])
local current = tonumber(redis.call('get', key) or '0')
if current + 1 > limit then
  return 0
else ---- 设置有效期为1秒钟
  redis.call("INCRBY", key,"1")
  redis.call("expire", key,"1")
  return 1
end

java代码

    // redis server
    protected static final String HOST_NAME = "192.168.1.29";
    //redis 端口
    protected static final int PORT = 6379;

    public RedisTemplate<String, String> getFactory() {

        RedisStandaloneConfiguration config = new RedisStandaloneConfiguration();
        config.setDatabase(0);
        config.setHostName(HOST_NAME);
        config.setPort(PORT);

        RedisTemplate<String, String> redisTemplate = new StringRedisTemplate();
        JedisConnectionFactory factory = new JedisConnectionFactory(config);
        redisTemplate.setConnectionFactory(factory);
        redisTemplate.setScriptExecutor(new DefaultScriptExecutor(redisTemplate));
        redisTemplate.afterPropertiesSet();
        return redisTemplate;
    }
		
    public static void main(String[] args) {
        RedisUtils utils = new RedisUtils();
        RedisTemplate<String, String> redisTemplate = utils.getFactory();
        /*限流脚本位置*/
        DefaultRedisScript<Long> redisScript = new DefaultRedisScript<>();
        redisScript.setLocation(new ClassPathResource("limit.lua"));
        redisScript.setResultType(java.lang.Long.class);
        String current = String.valueOf(System.currentTimeMillis());
        // redisTemplate.execute(redisScript);
        while(true) {
            Long id = redisTemplate.execute(redisScript, Collections.singletonList(
                    "ratelimit:app"
            ), "50");
            if(id == 0){
                /*超出限流数量,直接返回*/
                break;
            }
            /*为限流*/
            System.out.println(id);
        }
    }
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值