美文网首页
redis使用lua脚本遇到的问题

redis使用lua脚本遇到的问题

作者: 王大千_xMol_西摩尔 | 来源:发表于2023-02-13 10:14 被阅读0次

1、windows如何使用lua脚本

首先我们编写一段lua脚本

image

把这个lua脚本拷贝到redis的安装目录redis-cli文件夹下面,然后执行:redis-cli --eval hello.lua。就可以顺利执行。当然还可以加更多参数,具体看文档

image

2、当存在写命令的时候,lua脚本报错,当时我想通过lua脚本去删除所有没有设置过期时间的key,lua脚本如下:

image

当我去执行这串命令的时候,redis一直给我报错,报错信息如下:

image

翻译过来就是说, 写命令不被允许出现在‘非确定性命令’的后面, 请在脚本开始时调用redis.replicate_commands()来切换到命令复制模式.

为什么要使用replicate_commands()呢?

3、为什么使用replicate_commands()

因为受到了持久化和主从复制的制约,在主从复制和AOF追加时, 直接复制整个脚本的内容, 那么肯定会造成执行时数据的不一致性.

其实道理也很简单,因为开启了备份,当使用lua脚本对数据做改动的时候,其实redis是没有办法保证数据复制的一致性和数据的追踪

从Redis 3.2开始,可以选择另一种复制方法。我们可以复制脚本生成的单个写入命令,而不是复制整个脚本。我们称之为【脚本影响复制】(script effects replication)。

在这种复制模式下,当执行Lua脚本时,Redis会收集由Lua脚本引擎执行的所有实际修改数据集的命令。当脚本执行完成后,由脚本生成的命令序列将被包装到 MULTI/EXEC 事务中,并发送到从节点和进行AOF持久化保存。

当我们加了replicate_commands()以后,到AOF备份文件里面查看,发现会把写命令转换为MULTI...EXEC命令:

image

并且在Lua脚本中读多写少的情况下,只持久化和复制写命令,可以节省重启和备库的CPU时间。

replicate_commands虽好但是也不能乱用,有几个事项还是需要注意的:

1、在写命令之前调用redis.replicate_commands(),因为调用redis.replicate_commands()之后Redis开始用事务来替代整个Lua脚本做持久化和主从复制。但是Redis并没有缓存redis.replicate_commands()之前的命令,如果在此之前调用了写命令是会破坏数据一致性的

2、指定复制的模式:

redis.set_repl(redis.REPL_ALL) -- Replicate to AOF and slaves.

redis.set_repl(redis.REPL_AOF) -- Replicate only to AOF.

redis.set_repl(redis.REPL_SLAVE) -- Replicate only to slaves.

redis.set_repl(redis.REPL_NONE) -- Don't replicate at all.

默认REPL_ALL,当设置为其他模式时会有数据不一致的风险,所以不建议使用redis.set_repl(),使用redis.replicate_commands()来进行随机写入足

相关文章

  • Redis中调用Lua脚本阻塞

    在高并发系统中,redis的使用会比较频繁,lua脚本让redis的使用更加灵活。redis中使用lua脚本的好处...

  • Redis 脚本

    Redis 脚本 Redis 脚本使用 Lua 解释器来执行脚本。 Reids 2.6 版本通过内嵌支持 Lua ...

  • Redis学习之路(8)命令 -Redis 脚本

    Redis 脚本使用 Lua 解释器来执行脚本。 Redis 2.6 版本通过内嵌支持 Lua 环境。执行脚本的常...

  • redis 脚本介绍

    redis脚本简介   脚本使用 Lua 解释器来执行脚本。 Redis 从2.6版本开始,通过内嵌支持 Lua ...

  • 《redis学习》之lua

    Redis+Lua的好处 redis在2.6开始加入了lua脚本,使用lua脚本有如下好处: 减少网络开销。复合操...

  • Redis 脚本,连接,服务器

    Redis 脚本 Redis 脚本使用 Lua 解释器来执行脚本。 Reids 2.6 版 语法 Eval 命令的...

  • Redis学习笔记-Lua脚本

    前言 Redis在2.6版推出了脚本功能,允许开发者使用Lua语言编写脚本传到Redis中执行。 在Lua脚本中可...

  • springboot中redis的使用(三)

    接上一次springboot中redis的使用(二) Redis脚本的使用步骤 写Lua脚本, 放在Resourc...

  • redis中lua的基础使用

    在Redis中使用Lua脚本 我们在使用redis的时候,会面临一些问题,比如: 原子性问题 前面我们讲过,red...

  • 17 Redis脚本

    Redis 脚本使用 Lua 解释器来执行脚本。 Reids 2.6 版本通过内嵌支持 Lua 环境。执行脚本的常...

网友评论

      本文标题:redis使用lua脚本遇到的问题

      本文链接:https://www.haomeiwen.com/subject/ubobhrtx.html