将 Redis 事件连接到 Lua 脚本执行和并发问题
Connecting Redis events to Lua Script execution and concurrency issues
我已经对使用 Redisson 库构建的键值对或数据结构进行了分组。设计是任何一组值的值变化都应作为事件发送到订阅 Lua 脚本。然后这些脚本进行计算并更新另一组的键值对。这个过程是作为一个链实现的,一旦 Lua 脚本更新了每个键值,它又会生成一个事件,另一个 Lua 脚本执行类似于第一个 Lua 脚本的工作基于某些参数。
问题一:Lua脚本与事件如何关联?
问题 2:事件是流水线式的,但我的 Lua 脚本可能必须等待网络 IO。在那种情况下,我假设处理了下一个事件并执行了订阅脚本。这对我来说是个问题,因为第一个脚本尚未完成更新所需的键值对,第二个脚本正在继续其工作。这会给我带来错误。有办法克服这个问题吗?
问题 3:如何从 Redisson 数据结构发出事件,我需要 Lua 脚本来理解该数据结构的结构。怎么样?
在撰写本文时,Redis (3.2.9) 不允许在 Lua 脚本中阻塞命令,包括订阅命令。因此,不可能通过 Lua 脚本实现您所描述的内容。
但是您可以使用 Redisson 主题 and/or Redisson 分布式服务:
- 修改一个值,发送一条消息到一个频道。另一个进程接收消息,进行计算和更新。
或者...
- 如果只有一个特定的进程进行计算和更新,您可以使用 Redisson 远程服务来告诉这个进程完成工作,它的工作方式类似于 RPC。也许它也可以修改第一个值。
或者...
- 将整个批次创建为一个可运行的作业,并将其发送给 Redisson 远程执行程序进行处理。如果不是立即需要,您也可以选择安排作业。
我已经对使用 Redisson 库构建的键值对或数据结构进行了分组。设计是任何一组值的值变化都应作为事件发送到订阅 Lua 脚本。然后这些脚本进行计算并更新另一组的键值对。这个过程是作为一个链实现的,一旦 Lua 脚本更新了每个键值,它又会生成一个事件,另一个 Lua 脚本执行类似于第一个 Lua 脚本的工作基于某些参数。
问题一:Lua脚本与事件如何关联?
问题 2:事件是流水线式的,但我的 Lua 脚本可能必须等待网络 IO。在那种情况下,我假设处理了下一个事件并执行了订阅脚本。这对我来说是个问题,因为第一个脚本尚未完成更新所需的键值对,第二个脚本正在继续其工作。这会给我带来错误。有办法克服这个问题吗?
问题 3:如何从 Redisson 数据结构发出事件,我需要 Lua 脚本来理解该数据结构的结构。怎么样?
在撰写本文时,Redis (3.2.9) 不允许在 Lua 脚本中阻塞命令,包括订阅命令。因此,不可能通过 Lua 脚本实现您所描述的内容。
但是您可以使用 Redisson 主题 and/or Redisson 分布式服务:
- 修改一个值,发送一条消息到一个频道。另一个进程接收消息,进行计算和更新。
或者...
- 如果只有一个特定的进程进行计算和更新,您可以使用 Redisson 远程服务来告诉这个进程完成工作,它的工作方式类似于 RPC。也许它也可以修改第一个值。
或者...
- 将整个批次创建为一个可运行的作业,并将其发送给 Redisson 远程执行程序进行处理。如果不是立即需要,您也可以选择安排作业。