原子性与齿轮
#
使用RedisGears改进原子性和性能#
什么是齿轮?再装备是一个动态的服务器端数据处理引擎,其中“服务器”部分是Redis本身。RedisGears作为Redis模块分发。您可以使用Docker官方图像启动预先配置Gears的Redis实例:
或者像我经常做的那样,用“redismod”包括Gears和所有其他Redis, Inc.支持的模块:
RedisGears是为了在Redis内部提供一个数据处理引擎而构建的,它具有比简单的Lua服务器端脚本更正式的语义。可以把它看作是Redis的一个更灵活的map-reduce引擎。它支持支持事务、批处理和事件驱动的Redis数据处理。Gears允许您本地化计算和数据,并提供内置的协调器,以促进在集群环境中处理分布式数据。
在RedisGears中,主要的处理单元是RedisGears函数,它(目前)可以用Python编写(正在开发更多的语言)。这些函数在它们自己的线程上运行,与Redis的主线程分开,可以在响应键空间事件或外部命令时执行。这些函数被“注册”(部署)到Gears引擎,并且有一个关联的名称和一个注册Id。
在注册过程中,我们为函数选择一个特定的读取器,它定义了函数如何获取初始数据:
键盘读取器
:Redis键和值。键控读取器
:复述,钥匙。流阅读器
: Redis Stream消息。PythonReader
:任意的Python生成器。碎片阅读器
:碎片ID。命令阅读器
:来自应用程序客户端的命令参数。
#
限速RedisGears功能根据读取器的类型,Gear Functions可以作为批处理作业立即运行,也可以通过注册它来自动触发各种类型的事件,以事件驱动的方式运行。
Python函数利率上限
接受3个参数:
关键
:支持给定用户计数器的Redis键。最大请求
:用户的请求配额。到期
:未来设置计数器TTL的秒数。
将脚本置于src/main/resources/scripts
.现在,让我们将其细分:
利率上限
作用#
这个与我们在上一次实施中所做的类似,我们:
- 检索已传递的请求的当前数量
关键
通过执行
-对得到
命令。 - 将结果转换为
int
如果没有找到,默认为-1
- 投
最大请求数
和到期
来int
- 如果没有超过配额,则执行
增量
/到期
事务中的命令(与原子():
)返回错误的
(无速率限制-允许请求) - 否则,请返回
符合事实的
(拒绝请求)
#
函数注册- 在脚本的底部,在
#函数注册
节中,实例化GearsBuilder
(国标
)使用命令阅读器
读者。这个GearsBuilder
在参数、转换、触发器等中“构建”函数的上下文。 - 我们使用
地图
方法执行记录到的参数的一对一映射利率上限
函数通过映射器函数回调。 - 现在我们可以调用
登记
操作将函数注册为事件处理程序。在我们的例子中,事件是触发器“RateLimiter”
.
#
SpringBoot中的齿轮为了在我们的SpringBoot应用程序中使用我们的RedisGear函数,我们需要做一些事情:
- 将该功能部署到Redis服务器
- 执行这个函数,对每个请求都得到一个是/否的答复
#
生菜国防部LettuceMod是一个基于生菜的Redis模块的Java客户端吗朱利安·鲁奥.它支持以下模块在独立或集群配置:
- 再装备
- Redisson
- 再研究
- 再贴现时间序列
要使用LettuceMod,我们将依赖项添加到Maven POM中,如下所示:
#
在SpringBoot中访问Gears命令要访问任何letucemod支持的模块,我们将注入一个StatefulRedisModulesConnection
在我们FixedWindowRateLimiterApplication
分类如下:
添加匹配的导入语句:
#
登记齿轮功能我们将首先编写一个函数来确定该函数是否带有触发器限速器
已被注册。需要一个列表
的登记
s并深入挖掘以提取触发
参数使用Java Streams API:
在@PostConstruct
带注释的方法loadGearsScript
方法:
- 的实例
再分配指令
从先前注入的StatefulRedisModulesConnection
- 函数获取当前注册的Gears函数
dumpregistrations
方法 - 我们把注册名单交给我们的
获取装配工的齿轮注册信息
- 如果我们没有找到注册,我们继续注册函数:
- 将函数从类路径加载到
一串
命名py
- 使用
pyexecute
方法通过py
脚本负载
- 将函数从类路径加载到
#
修改过滤器以使用Gears功能接下来,我们将修改过滤器以包括StatefulRedisModulesConnection
以及配额;我们需要传递给函数的值:
现在我们可以修改过滤器
方法来使用该函数。Gears函数通过触发正确的事件来调用限速器
传递函数所需的参数;的关键
,配额和未来的TTL秒数。
正如我们之前所做的,如果函数返回错误的
我们让请求通过,否则我们将返回HTTP 429
:
#
卷曲测试我们再次使用curl loop测试限制器:
您应该看到第21个请求被拒绝:
如果我们在监控模式下运行Redis,我们应该看到Lua调用RG。触发
在这下面,你应该看到呼叫得到
,增量
和到期
对于允许的请求:
对于价格限制的请求,你应该只看到电话得到
:
此实现的完整代码位于该分支之下带齿轮
.