首页 > 其他分享 >【虹科干货】触发器和函数:让代码更接近数据

【虹科干货】触发器和函数:让代码更接近数据

时间:2023-12-11 18:02:00浏览次数:30  
标签:触发器 函数 开发人员 数据库 Redis 干货 虹科 执行

文章速览:

  • 触发器和函数的基础知识
  • 编写语言:从Lua到JavaScript
  • 轻松维护应用程序代码
  • 数据库事件实时处理
  • 如何操作触发器和函数

一般来说,应用程序处理业务的逻辑,是将执行代码发送到数据库。因此每次执行函数时,代码都会从客户端流入服务器,结果就是这个过程十分缓慢,甚至会出现代码在应用程序之间重复执行的情况。

而我们一向是反对复杂性的! Redis Gears: 四年前推出的RedisGears,是Redis平台内的第一个可编程模型,开发人员能在数据所在的地方编写并执行脚本。 Redis 7.0: Redis 7.0引入了带有函数的脚本方法,函数作为数据库的一部分,提高了可用性和持久性,继承了数据的复制和持久性级别。 Redis 7.2: Redis 7.2更进一步,引入了触发器和函数,以增强Redis的可编程性;扩展了服务器端功能;改进了数据库中执行功能的方式和时间;并促进了直接在数据所在的地方执行复杂的业务逻辑。

一、触发器和函数的基础知识

触发器和函数是通过Redis Stack提供的新一代可编程功能。它允许开发人员直接在Redis数据库中针对数据更改进行编程、存储和自动执行JavaScript代码。 1、开发人员可以定义事件(称为触发器)来执行更接近数据的函数。也就是说,开发人员定义响应数据库事件或命令而执行的业务逻辑。这加快了代码和相关交互的速度,因为无需等待即可将代码从客户端引入数据库。  2、加快对Redis中其他事件的反应时间,如键空间通知,这些通知无法通过发布和订阅(Pub/Sub)事件等其他方式实时处理。 3、远程功能:触发器和函数处理集群数据库内的分布,在每个分片上安装库并根据密钥所在的位置执行函数。远程函数允许执行读取操作,这些操作可以从任何槽访问数据,甚至在集群数据库中也是如此,因此可以从每个函数访问所有数据。

二、编写语言:从Lua到JavaScript

Redis使用Lua来编写脚本和函数。Lua有很多好处,例如代码可重用性,但它并不是专业开发人员常用的语言。根据2022 年StackOverflow开发者调查,只有 3.2% 的开发人员在专业领域使用 Lua。 因此,在Redis7.2中引入了JavaScript,这种更流行的语言的引入,可以降低新Redis开发人员的采用成本。

三、轻松维护应用程序代码

触发器和函数的另一个好处是它降低了跨多个应用程序管理业务逻辑的复杂性。  当多个应用程序访问同一数据库时,开发人员必须协调应用程序如何以一致的方式处理数据。在每个应用程序中复制代码以验证数据、丰富搜索结果,或在另一个应用程序进行更改时更新数据库也是很常见的。 有了触发器和函数,就不再需要在多个应用程序上重复代码。 代码始终以相同的方式执行,按需执行或由数据库中的事件启动。

四、数据库事件实时处理

到目前为止,开发人员对Redis中的数据库事件做出反应需要依赖Pub/Sub机制。虽然 Pub/Sub有很多优点,但它并不总是正确的选择。特别是,Pub/Sub不是实时的。客户端必须主动监听事件;如果客户端没有监听,事件就会丢失。 在Redis7.2时代,开发人员可以注册基于键前缀和事件类型执行的键空间触发器。触发器可以以原子方式执行,因此在事件和业务逻辑之间不处理其他Redis事件。

五、如何操作触发器和函数

这里,我们介绍如何注册一个函数和一个触发器。当通过TFCALL命令调用函数时,函数就会被执行;触发器根据Redis中的事件执行。 1.序言定义我们使用js引擎,库名称为lib,所需的触发器和函数API的最低版本为1.0。

#!js name=lib api_version=1.0

2.接下来,我们创建一个返回Redis命令结果的函数。客户端允许在我们的函数中执行Redis 命令。数据事件包含运行函数时可以提供的键和参数。

function answer(client, data) {
    return client.call(“ping”);
}

3.Redis全局变量允许我们注册触发器和函数,并记录到日志文件中。我们为该函数注册一个名称,并在函数执行时调用它。

redis.registerFunction(‘playPingPong’, answer);

4.完整的JavaScript文件如下所示,将其另存为lib.js. 

#!js name=lib api_version=1.0
 
function answer(client, data) {
    return client.call(‘ping’);
}
redis.registerFunction(‘playPingPong’, answer);

 

5.然后我们使用命令在触发器和函数中注册我们的函数TFUNCTION LOAD。该TFUNCTION LOAD命令还可以在集群数据库中分发函数库。

> redis-cli  -x TFUNCTION LOAD < ./lib.js
OK

6.现在我们可以使用TFCALL命令执行该函数。该命令获取以句点分隔的库名称和函数名称。

>redis-cli TFCALL lib.playPingPong 0
“PONG”

7.这样,就成功地在Redis数据库中创建、注册并触发了一个函数。 8.我们可以使用键空间触发器拓展这个示例。我们添加了一个新的注册,该注册对前缀为'fellowship:'的键做出反应。在lib.js文件末尾添加此代码。

function addLastUpdatedField(client, data) {
    if(data.event == ‘hset’) {
    var currentDateTime = Date.now();
    client.call(‘hset’, data.key, ‘last_updated’, currentDateTime.toString());
}
}
redis.registerKeySpaceTrigger(‘addLastUpdated’, 'fellowship:', addLastUpdatedField);
  1. 使用带有 REPLACE 参数的 TFUNCTION LOAD 命令来更新现有库。该TFUNCTION LOAD REPLACE命令立即更新所有使用 Redis 数据库的客户端,并且它们会开始使用新的业务逻辑。
>redis-cli -x TFUNCTION LOAD REPLACE . < ./lib.js
OK

10.要测试新的键空间触发器,请创建一个以Fellowship:开头的新键,并使用RedisInsight 检查字段。键空间触发器是通过命令执行的,因此在创建键时已经添加了last_updated字段。最后,我们可以在RedisInsight中查看结果。

标签:触发器,函数,开发人员,数据库,Redis,干货,虹科,执行
From: https://blog.51cto.com/u_14928887/8776456

相关文章

  • 【干货分享】网工必懂的ICMP协议
    原创:厦门微思网络因特网控制报文协议ICMP(InternetControlMessageProtocol)是一个差错报告机制,是TCP/IP协议簇中的一个重要子协议,通常被IP层或更高层协议(TCP或UDP)使用,属于网络层协议,主要用于在IP主机和路由器之间传递控制消息,用于报告主机是否可达、路由是否可用等。这些控制消息......
  • # yyds干货盘点 # 盘点一个Pandas处理Excel表格实战问题(下篇)
    大家好,我是皮皮。一、前言继续接着上一篇文章说,这一篇文章我们一起来看看大佬们的解决办法。二、实现过程这里【郑煜哲·Xiaopang】和【瑜亮老师】给了一个提示,如下图所示:后来【隔壁......
  • #yyds干货盘点#深入了解Python类与面向对象编程
    类与对象的概念1.什么是类?类是一种用户自定义的数据类型,用于描述对象的属性和行为。它是对象的模板,定义了对象的结构。2.创建类使用class关键字来创建类。示范如何定义一个类,包括类名、属性和方法的定义。classDog:def__init__(self,name,breed):self.name=nam......
  • #yyds干货盘点#Java面试题
    1.如何理解面向对象和面向过程【面向过程】:完成某件事的过程,性能高于【面向对象】优点:但是因为类调用时需要实例化,开销比较大,比较消耗资源;比如单片机、嵌入式开发、Linux/Unix等一般采用面向过程开发,性能是最重要的因素。缺点:没有面向对象易维护、易复用、易扩展【面向对象】:把要完......
  • # yyds干货盘点 # 盘点一个Pandas处理Excel表格实战问题(上篇)
    大家好,我是皮皮。一、前言前几天在Python最强王者交流群【哎呦喂 是豆子~】问了一个Pandas实战的问题,一起来看看吧。问题描述:大佬们~ 请问下这个数据怎么实现呢?有2组数据:第一个数据《获取的数据.xlsx》:每13行数据为一组,要实现一列数据拆分成多列数据(这边简称表1),见截图第二个数......
  • #yyds干货盘点# LeetCode程序员面试金典:统计各位数字都不同的数字个数
    题目给你一个整数n,统计并返回各位数字都不同的数字x的个数,其中0<=x<10n。 示例1:输入:n=2输出:91解释:答案应为除去11、22、33、44、55、66、77、88、99外,在0≤x<100范围内的所有数字。 示例2:输入:n=0代码实现classSolution{publicintcount......
  • #yyds干货盘点# LeetCode程序员面试金典:斐波那契数
    题目斐波那契数(通常用F(n)表示)形成的序列称为斐波那契数列。该数列由0和1开始,后面的每一项数字都是前面两项数字的和。也就是:F(0)=0,F(1)=1F(n)=F(n-1)+F(n-2),其中n>1给定n,请计算F(n)。 示例1:输入:n=2输出:1解释:F(2)=F(1)+F(0)=1+0......
  • # yyds干货盘点 # 分享一个Python网络爬虫数据采集利器
    前言你是否曾为获取重要数据而感到困扰?是否因为数据封锁而无法获取所需信息?是否因为数据格式混乱而头疼?现在,所有这些问题都可以迎刃而解。让我为大家介绍一款强大的数据收集平台——亮数据BrightData。作为世界领先的数据收集平台,亮数据以其高效、可靠和灵活的方式检索提取关键的......
  • 干货分享 | TSMaster小程序启动和停止的自动化控制流程
    在实际应用场景中,用户常常需要按一定逻辑和时序来控制TSMaster内置功能模块的启动和停止,TSMaster软件内置有C/Python小程序和图形程序,开发者可以通过编程对这些模块的运行进行精确控制。本文将重点和大家分享一下如何通过C代码来控制TSMaster内置模块的启动与停止。本文关键字:run_f......
  • # yyds干货盘点 # 想在同一张图片上添加不同的文字,也就是一张图片上出现一个词
    大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Python实战的问题,一起来看看吧。问题描述:上图中也是他的代码,没有文字的代码确实看着难受,而且还是手机拍出来的模糊照片,不是截图。其实他自己也发现了问题,但是不知道怎么修改。二、实现过程这里【巭孬......