当前位置: 首页 > 知识库问答 >
问题:

Redis:使用lua和并发事务

郤令
2023-03-14
    null

Redis事务是有限的,无法取消监视特定键,并且所有键在exec上都不被监视;我们仅限于给定客户端上的单个正在进行的事务。

我见过许多redis用户声称lua脚本是他们所需要的全部的线程。甚至redis官方文档也表示,他们可能会删除交易,转而支持lua脚本。然而,有些情况下这是不够的,比如最标准的情况:使用redis作为缓存。

假设我们想从Redis中的持久数据存储中缓存一些数据。下面是一个快速的过程:

  1. 检查缓存->未命中
  2. 从数据库加载数据
  3. 在Redis中存储

但是,如果在第2步(加载数据)和第3步(存储在redis中)之间,数据被另一个客户机更新了怎么办?

存储在redis中的数据会过时。所以...我们使用redis事务,对吗?我们在从db加载密钥之前观察密钥,如果密钥在存储之前在其他地方更新,存储就会失败。太棒了!但是,在原子lua脚本中,我们不能从外部数据库加载数据,因此这里不能使用lua。希望我只是遗漏了什么,或者我们的过程有问题。

作为替代方案,我们可以使用redlock/mutex锁定来代替redis事务,但相比之下,这是缓慢的。

任何帮助都很感激!

共有1个答案

蒋星雨
2023-03-14

在我的查询升级到redis工程师之后,我收到了以下信息:

嗨,杰里米,

使用多个后端连接的方法将是处理该问题的预期方法。我们没有看到多个后端连接有任何问题,每个连接都使用一个乐观的Redis事务(watch/multi/exec)--“第二个事务在它应该失败的地方成功”是不可能的。

 类似资料:
  • 在下面的例子中,当在burst中调用事务性带注释的方法时,attachDirty总是尝试持久化实体。 有没有办法避免这个主键约束冲突异常?我认为如果实体尚未创建,则将持续存在,否则将进行更新。 我用了这个而不是来处理这些突发事件。 实际上没有数据损坏。因为第一个会根据需要为每个实体保存一条记录。由于主键约束冲突,数据库拒绝了其他持久化。 我研究了乐观锁定和悲观锁定。我知道这些工作是在获取一个已经存

  • 问题内容: 有没有人能够使它们一起工作?我已经将5.2很好地工作了,它可以找到lua- redis(redis.lua),但是它无法加载套接字模块,而我似乎无法使用lua(LuaSocket版本2.0.2)。任何人都有任何技巧可以使它正常工作吗? 我尝试过制作luasocket,但是它完全失败了,我认为这是由于我的lua版本5.2。 答案只是恢复到lua 5.1,还是我不知道的另一种解决方法? 问

  • redis-lua 是 Redis 的 Lua 语言的客户端开发包。 示例代码: require 'redis'local redis = Redis.connect('127.0.0.1', 6379)local response = redis:ping() -- trueredis:set('usr:nrk', 10)redis:set('usr:nobody', 5)l

  • rld 是一个非交互的调试工具,用于调试 Redis 的 Lua 脚本,这里有篇详细介绍的文章。 rld 特性包括: 易于安装,只有 6kB 可打印输出到本地和远端 跟踪执行的代码行 先进的数值变化的自动监控机制报告 报告函数调用、返回和参数可进行实时检查 基本使用: Load rld.lua to Redis once (e.g. redis-cli --eval rld.lua). Add t

  • Nginx与Lua编写脚本的基本构建块是指令执行顺序的图 Nginx 教程 基础 Nginx编译安装 Nginx.conf详解 Location 详解 Nginx基础知识 Nginx高性能WEB服务器详解 Nginx高并发系统内核优化和PHP7配置文件优化 Nginx和PHP-FPM启动脚本 Nginx的11个Phases agentzh 的 Nginx 教程 Nginx 陷阱和常见错误 TCP和

  • 我正在尝试用Connector/J和MySql构建一个Java(JDK1.8)应用程序。有人告诉我,Serializable是最高级别,但它会影响性能,所以Serializable并不常用。 但是考虑一下这种情况: 有两个提交将更新同一行的字段(提交A和提交B)。如果A和B同时发生,并且隔离级别不可序列化,则会出现数据竞争,这会导致字段不一致。但在可序列化级别,这两个更新不会同时发生,因此A发生在