Redis 7.0 最具影响力的新增功能是 Redis 函数 - 一种新的可编程性选项,通过 添加模块化、可重用性和更好的整体开发人员体验 来改进脚本。
与脚本不同,函数会保存在 .rdb 和 .aof 文件中,并自动复制到所有副本,这使其成为 Redis 的一等公民。
Redis 能够支持多个执行引擎,因此在未来的某个版本中,我们将能够使用 Lua、Javascript 等多种语言编写 Redis 函数,但目前(Redis v7.0)唯一支持的语言是 Lua。
开发人员遇到的一个常见痛点是通过逻辑模式维护对数据实体的一致视图。Redis 函数非常适合解决此问题,在本教程中,我们将演示这一点 - 我们将创建一个包含两个函数的库;第一个函数将确保我们可以自动设置 _created_at 和 _updated_at 哈希键的时间戳,而第二个函数将只更新 _updated_at 时间戳,而不会更改其他元素,模拟“touch” Unix 函数。让我们开始吧!
首先,让我们使用 Redis 7 设置一个工作环境。您可以根据您的操作系统,按照以下指南中的安装说明进行操作
或者,您可以使用 Docker 容器启动 Redis Stack
$ docker run -p 6379:6379 --name redis-7.0 -it --rm redis/redis-stack:7.0.0-RC4
在本教程的其余部分,我们将使用 $ 字符表示需要在命令提示符下运行的命令,并使用 redis-cli> 表示在 redis-cli
提示符下运行的命令。
现在我们的 Redis 服务器正在运行,我们可以创建一个名为 mylib.lua 的文件,并在其中创建一个名为 hset 的函数,该函数将接收我们从命令行传递的参数作为参数。
Redis 中的函数始终是库的一部分,一个库可以包含多个函数。
首先,让我们创建一个简单的函数,该函数返回“Hello Redis 7.0”,并将它保存在 mylib.lua 文件中。
#!lua name=mylib
local function hset(keys, args)
return "Hello Redis 7.0"
end
现在我们已准备好开始满足要求。首先,让我们实现添加 _updated_at
时间戳的部分:
#!lua name=mylib
local function hset(keys, args)
local hash = keys[1] -- Get the key name
local time = redis.call('TIME')[1] -- Get the current time from the Redis server
-- Add the current timestamp to the arguments that the user passed to the function, stored in `args`
table.insert(args, '_updated_at')
table.insert(args, time)
-- Run HSET with the updated argument list
return redis.call('HSET', hash, unpack(args))
end
redis.register_function('my_hset', hset)