分布式限流(三)之 redis + lua 限流

本文介绍了如何利用Redis和Lua脚本实现分布式限流。首先,文章提到了Redis环境和Lua环境的搭建。接着,重点讲解了通过Redis的eval命令运行Lua代码进行限流的预加载过程,包括编写Lua限流脚本和Java程序。最后,文章提到了验证步骤,确保限流机制在实际项目中能够有效工作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

redis + lua 脚本实现分布式限流

redis环境搭建,请自行百度。
windows搭建lua环境,参考链接:https://blog.youkuaiyun.com/weixin_41725792/article/details/113827606

redis内置了lua解释器,我们在redis中可以使用redis 关键字 eval 运行Lua代码,如下:

# eval 关键字
# 脚本" return { KEYS[1],ARGV[1]} " 
# 2 参数个数
# 参数 K1 K2 ,值 V1 V2
eval " return { KEYS[1],ARGV[1]} " 2 K1 K2 V1 V2

在这里插入图片描述

redis预加载:

script load "return 'aaa'"

在这里插入图片描述

evalsha "e20bf1be2a7b6dc909965de4a871a2b34a6d900d" 0

在这里插入图片描述
带参数:

# lua 连接符是  ..
script load "return 'hello '..KEYS[1]"
evalsha "c42984269dae236a5a42bea45409b728a873605e" 1 jiabengshi

在这里插入图片描述

# 查看脚本是否存在 存在返回1 不存在返回0
script exists "c42984269dae236a5a42bea45409b728a873605e"
# 清空脚本
script flush

在这里插入图片描述
接下来进入正题:使用java操作redis,实现分布式限流。

1. 编写lua限流脚本

-- 声明变量
local methodKey = KEYS[1]
-- 打印在控制台
print("key is "..methodKey)
-- redis控制台打印日志 注意配置文件配置等级 可去配置文件中logfile="" 路劲下查看
redis.log(redis.LOG_DEBUG, "key is ", methodKey)

-- 传入的限流值
print("value is "..ARGV[1])
local limit = tonumber(ARGV[1])
print("convert is "..limit)

-- 获取当前限流个数 可能为nil(key不存在)
local count = tonumber(redis.call("get", methodKey) or "0")
print("count is "..count)

if count + 1 > limit then
    -- 超出限流数  拒绝
    redis.log(redis.LOG_INFO, "limit result is ", false)
    return false
end

-- 自增1
redis.call('INCRBY',methodKey,1)
-- 设置过期时间 一秒
redis.call('EXPIRE',methodKey,1
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值