Redis 7.0 版本最具影响力的新增功能是 Redis Functions - 一种新的可编程选项,通过 添加模块化、可重用性和更好的整体开发者体验 来改进脚本。
函数与脚本不同,它们会持久化到 .rdb 和 .aof 文件中,并自动复制到所有副本,这使得它们成为 Redis 中的一等公民。
Redis 能够支持多种执行引擎,因此在未来的版本中,我们将能够用 Lua、Javascript 和更多语言编写 Redis Functions,但目前 (Redis v7.0) 唯一支持的语言是 Lua。
开发者普遍遇到的一个痛点是难以通过逻辑模式维护数据实体的一致视图。Redis Functions 非常适合解决这个问题,在本教程中,我们将演示如何做到这一点 - 我们将创建一个包含两个函数的库;第一个函数将确保我们可以自动为哈希键设置 _created_at 和 _updated_at 时间戳,第二个函数将只更新 _updated_at 时间戳而不更改其他元素,模拟 Unix 的“touch”函数。开始吧!
首先,让我们设置一个 Redis 7 的工作环境。您可以根据您的操作系统按照下面的指南进行安装
或者,您可以使用 Redis Stack 启动一个 Docker 容器
$ 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)