Redis(二) 可编程性

结合上一期 Redis(一) Redis简介(Redis(一) Redis简介-CSDN博客)

目录

Redis 可编程性

运行脚本

只读脚本

只读脚本历史记录 

最长执行时间

Redis 函数

加载库和函数

输入键和常规参数

扩展库 

重用库中的代码

Lua 脚本 

脚本参数化

从脚本与 Redis 交互 

脚本缓存

在 Redis 中调试 Lua 脚本


Redis 可编程性

使用 Lua 和 Redis 函数扩展 Redis供了一个编程接口,允许您在服务器本身上执行自定义脚本。在 Redis 7 及更高版本中,您可以使用 Redis functions 来管理和运行脚本。在 Redis 6.2 及更低版本中,您可以使用 带有EVAL命令的 Lua 编写脚本对服务器进行编程。

Redis 是一种“抽象数据类型的特定领域语言”。 Redis 使用的语言由其命令组成。 大多数命令专门用于以不同的方式操作核心数据类型。 在许多情况下,这些命令提供了开发人员在 Redis 中管理应用程序数据所需的所有功能。

Redis 中的术语可编程性是指能够由服务器执行任意用户定义的逻辑。 我们将这些逻辑片段称为脚本。 在我们的例子中,脚本可以处理它所在的数据,也就是数据局部性。 此外,在 Redis 服务器中负责任地嵌入编程工作流有助于减少网络流量并提高整体性能。 开发人员可以使用此功能来实现可靠的、特定于应用程序的 API。 此类 API 可以封装业务逻辑,并跨多个键和不同数据结构维护数据模型。

用户脚本由嵌入式沙盒脚本引擎在 Redis 中执行。 目前,Redis 支持单个脚本引擎,即 Lua 5.1 解释器。

运行脚本

Redis 提供了两种运行脚本的方法。

首先,从 Redis 2.6.0 开始,EVAL命令允许运行服务器端脚本。 Eval 脚本提供了一种快速而直接的方法,让 Redis 临时运行您的脚本。 但是,使用它们意味着脚本逻辑是应用程序的一部分(而不是 Redis 服务器的扩展)。 运行脚本的每个应用程序实例都必须具有随时可加载脚本的源代码。 这是因为脚本仅由服务器缓存,并且是易失性的。 随着应用程序的增长,此方法可能更难开发和维护。

其次,在 v7.0 中添加的 Redis 函数本质上是作为一类数据库元素的脚本。 因此,函数将脚本与应用程序逻辑分离,并支持脚本的独立开发、测试和部署。 要使用函数,需要先加载它们,然后它们可供所有连接的客户端使用。 在这种情况下,将函数加载到数据库将成为管理部署任务(例如加载 Redis 模块),这会将脚本与应用程序分开。

有关详细信息,请参阅以下页面:

  • Redis EVAL脚本
  • Redis 函数

在运行脚本或函数时,Redis 保证其原子执行。 脚本的执行会在整个时间内阻止所有服务器活动,这与事务的语义类似。 这些语义意味着脚本的所有效果要么尚未发生,要么已经发生。 已执行脚本的阻塞语义始终适用于所有连接的客户端。

请注意,这种阻塞方法的潜在缺点是执行慢速脚本不是一个好主意。 创建快速脚本并不难,因为脚本的开销非常低。 但是,如果您打算在应用程序中使用慢速脚本,请注意,所有其他客户端都会被阻止,并且在运行时无法执行任何命令。

只读脚本

只读脚本是仅执行不修改 Redis 中任何键的命令的脚本。 可以通过向脚本添加标志或使用只读脚本命令变体之一(EVAL_ROEVALSHA_RO 或 FCALL_RO )执行脚本来执行只读脚本。 它们具有以下属性:no-writes

  • 它们始终可以在副本上执行。
  • 它们始终可以通过 SCRIPT KILL 命令杀死。
  • 当 redis 超过内存限制时,它们永远不会因 OOM 错误而失败。
  • 它们在写入暂停期间不会被阻止,例如在协调故障转移期间发生的暂停。
  • 它们不能执行任何可能修改数据集的命令。
  • 目前,PUBLISH 、SPUBLISH 和 PFCOUNT 也被视为脚本中的写入命令,因为它们可以尝试将命令传播到副本和 AOF 文件。

除了所有只读脚本提供的好处外,只读脚本命令还具有以下优点:

  • 它们可用于将 ACL 用户配置为只能执行只读脚本。
  • 对于希望使用副本进行读取扩展的应用程序,许多客户端还更好地支持将只读脚本命令路由到副本。

只读脚本历史记录 

Redis 7.0 中引入了只读脚本和只读脚本命令

  • 在 Redis 7.0.1  PUBLISH 之前, SPUBLISH  和 PFCOUNT  不被视为脚本中的写入命令
  • 在 Redis 7.0.1 之前,该标志并不意味着no-writesallow-oom
  • 在 Redis 7.0.1 之前,该标志不允许脚本在写入暂停期间运行。no-writes

最长执行时间

  • 39
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值