当前位置:首页 » 编程软件 » redis集群脚本

redis集群脚本

发布时间: 2025-03-02 18:04:36

⑴ 在Redis中如何使用Lua脚本

Lua脚本在Redis中的应用主要分为两种方式:eval和evalsha。其中,eval提供了一种灵活的方法来为Lua脚本提供额外的参数。使用 eval 命令,你可以指定 key 列表和参数列表,来执行Lua脚本。例如,当使用如下的 Lua 脚本来发送 "hello" 和一个值作为参数时,最终的返回结果将是 "hello redisworld"。如果Lua脚本较长,还可以通过在redis-cli中直接执行文件的方式执行脚本,这种方式不需要指定key的数量,只需使用逗号分隔key和参数,并注意逗号前后空格的正确放置。

另外,evalsha命令的使用也颇具特色。首先,你需要将Lua脚本加载到Redis服务端并获取其SHA1校验和,然后使用SHA1值执行对应的Lua脚本。这样做的好处是避免了每次执行脚本时的开销,因为脚本常驻于服务器端,使得功能复用变得可能。

在实际操作中,Lua脚本的RedisAPI提供了方便的功能,如redis.call和redis.pcall函数,用于调用Redis操作。redis.call函数执行失败时将停止脚本执行并返回错误,而redis.pcall则忽略错误继续执行,选择哪个函数使用应根据具体场景来决定。在获取key和value时,可以通过 KEYS[1] 和 ARGV[1] 来实现。

开发过程中,Lua脚本的日志输出可以使用redis.log函数实现,但需控制日志级别,以免影响性能。Redis 3.2新增的Lua Script Debugger功能则为复杂脚本的调试提供了便利。

在Spring Boot中集成Lua脚本,你可以通过RedisTemplate接口实现。为避免序列化问题,确保指定了正确的序列化方式。将Lua脚本放在指定目录下,并利用RedisScript类的getSha1()方法获取脚本摘要,随后通过指定方法调用脚本。

尽管Lua脚本功能强大,但需注意其执行可能会阻塞服务器,影响数据库响应,尤其是在分片场景下。因此,应谨慎使用并确保脚本执行的高效和安全性。

⑵ redis有脚本语言吗

有,lua脚本语言

Redis脚本

使用脚本的好处:

  • 减少网络开销。可以将多个请求通过脚本的形式一次发送,减少网络时延

  • 原子操作。redis会将整个脚本作为一个整体执行,中间不会被其他命令插入。因此在编写脚本的过程中无需担心会出现竞态条件,无需使用事务。

  • 复用。客户端发送的脚步会永久存在redis中,这样,其他客户端可以复用这一脚本而不需要使用代码完成相同的逻辑。

  • 调用Lua脚本的语法:

    $ redis-cli --eval path/to/redis.lua KEYS[1] KEYS[2] , ARGV[1] ARGV[2] ...

  • --eval,告诉redis-cli读取并运行后面的lua脚本

  • path/to/redis.lua,是lua脚本的位置

  • KEYS[1] KEYS[2],是要操作的键,可以指定多个,在lua脚本中通过KEYS[1], KEYS[2]获取

  • ARGV[1] ARGV[2],参数,在lua脚本中通过ARGV[1], ARGV[2]获取。

  • 注意:

    KEYS和ARGV中间的 ',' 两边的空格,不能省略。

    redis支持大部分Lua标准库

    库名

    说明

    Base 提供一些基础函数

    String 提供用于字符串操作的函数

    Table 提供用于表操作的函数

    Math 提供数学计算函数

    Debug 提供用于调试的函数

    在脚本中调用redis命令

    在脚本中可以使用redis.call函数调用Redis命令

  • redis.call('set', 'foo', 'bar')local value=redis.call('get', 'foo') --value的值为bar

  • redis.call函数的返回值就是Redis命令的执行结果

    Redis命令的返回值有5种类型,redis.call函数会将这5种类型的回复转换成对应的Lua的数据类型,具体的对应规则如下(空结果比较特殊,其对应Lua的false)

    redis返回值类型和Lua数据类型转换规则

    redis返回值类型

    Lua数据类型

    整数回复 数字类型

    字符串回复 字符串类型

    多行字符串回复 table类型(数组形式)

    状态回复 table类型(只有一个ok字段存储状态信息)

    错误回复 table类型(只有一个err字段存储错误信息)

    redis还提供了redis.pcall函数,功能与redis.call相同,唯一的区别是当命令执行出错时,redis.pcall会记录错误并继续执行,而redis.call会直接返回错误,不会继续执行。

    在脚本中可以使用return语句将值返回给客户端,如果没有执行return语句则默认返回nil

    Lua数据类型和redis返回值类型转换规则

    Lua数据类型

    redis返回值类型

    数字类型 整数回复(Lua的数字类型会被自动转换成整数)

    字符串类型 字符串回复

    table类型(数组形式) 多行字符串回复

    table类型(只有一个ok字段存储状态信息) 状态回复

    table类型(只有一个err字段存储错误信息) 错误回复

    脚本相关命令

  • EVAL "lua-script" [key ...] [arg ...]

    通过key和arg这两类参数向脚本传递数据,它们的值在脚本中分别使用KEYS和ARGV两个表类型的全局变量访问

    注意: EVAL命令依据参数key-number来将其后面的所有参数分别存入脚本中KEYS和ARGV两个table类型的全局变量。当脚本不需要任何参数时,也不能省略这个参数(设为0)

    redis>EVAL "return redis.call('SET', KEYS[1], ARGV[1])" 1 foo bar
    OK
    redis>GET foo"bar"
  • EVALSHA命令

    在脚本比较长的情况下,如果每次调用脚本都需要将整个脚本传给Redis会占用较多的带宽。为了解决这个问题,Redis提供了EVALSHA命令,允许开发者通过脚本内容的SHA1摘要来执行脚本,该命令的用法和EVAL一样,只不过是将脚本内容替换成脚本内容的SHA1摘要。

    Redis在执行EVAL命令时会计算脚本的SHA1摘要并记录在脚本缓存中,执行EVALSHA命令时Redis会根据提供的摘要从脚本缓存中查找对应的脚本内容,如果找到了则执行脚本,否则会返回错误:"NOSCRIPT No matching script. Please use EVAL."

    在程序中使用EVALSHA命令的一般流程如下。

    虽然这一流程略显麻烦,但值得庆幸的是很多编程语言的Redis客户端都会代替开发者完成这一流程。执行EVAL命令时,先尝试执行EVALSHA命令,如果失败了才会执行EVAL命令。

  • 先计算脚本的SHA1摘要,并使用EVALSHA命令执行脚本。

  • 获得返回值,如果返回“NOSCRIPT”错误则使用EVAL命令重新执行脚本。

  • SCRIPTLOAD "lua-script"

    将脚本加入缓存,但不执行. 返回:脚本的SHA1摘要

  • SCRIPT EXISTS lua-script-sha1

    判断脚本是否已被缓存

  • SCRIPT FLUSH

    清空脚本缓存 redis将脚本的SHA1摘要加入到脚本缓存后会永久保留,不会删除,但可以手动使用SCRIPT FLUSH命令情况脚本缓存。

  • SCRIPT KILL

    强制终止当前脚本的执行。 但是,如果当前执行的脚步对redis的数据进行了写操作,则SCRIPT KILL命令不会终止脚本的运行,以防止脚本只执行了一部分。脚本中的所有命令,要么都执行,要么都不执行。

  • Redis的脚本执行是原子的,即脚本执行期间Redis不会执行其他命令。所有的命令都必须等待脚本执行完成后才能执行。为了防止某个脚本执行时间过长导致Redis无法提供服务(比如陷入死循环),Redis提供了lua-time-limit参数限制脚本的最长运行时间,默认为5秒钟。当脚本运行时间超过这一限制后,Redis将开始接受其他命令但不会执行(以确保脚本的原子性,因为此时脚本并没有被终止),而是会返回“BUSY”错误

热点内容
忘记qq密保怎么改密码 发布:2025-03-03 12:12:15 浏览:367
c语言编程结构 发布:2025-03-03 12:05:06 浏览:693
zip无法解压乱码 发布:2025-03-03 12:04:11 浏览:308
十台服务器电脑功率多大 发布:2025-03-03 11:58:31 浏览:337
连接服务器异常如何解决 发布:2025-03-03 11:53:58 浏览:640
推导编译原理 发布:2025-03-03 11:37:31 浏览:259
80人团队解压拓展哪家价格便宜 发布:2025-03-03 11:15:16 浏览:345
androidwebview插件 发布:2025-03-03 11:08:15 浏览:566
智慧云服务器搭建 发布:2025-03-03 10:57:53 浏览:973
编程接单 发布:2025-03-03 10:57:13 浏览:892