目录
前言
本文主要讨论下使用Lua脚本去对redis进行操作的一些想法。我将会通过一个具体的例子来进行分析。
背景:Lua是一种类C的语言,在这里我们使用它去编写一些语句,去操纵redis中的数据。一些背景知识,大家感兴趣的话,可以通过下面的Link去了解下。
- lua基本语法。Lua 教程 | 菜鸟教程
- springboot集成redis和lua。Springboot整合Redis以及Lua脚本的使用 - 奕锋博客 - 博客园
- redis的基本命令。Redis 教程 | 菜鸟教程
- redis集群 Redis集群 - -Finley- - 博客园
需求与分析
我在工作中遇到如下一个需求。需要对一些产品的库存节点进行清空操作。因为产品的库存是一个频繁访问和变更的数据。因此在我们的系统中,它是在redis和db各有一份。redis上的数据为最新数据。所以我的工作流程大概如下:
因为要操作的库存节点可能会有多个。如果使用循环的方式去call redis,考虑到网络IO的问题,它会变得很慢。同时,万一在循环的过程中,网络环境出现变化,也很难去保证数据的一致性。所以这里我考虑使用lua脚本,将要更新的库存节点id给到它,进行批量的处理。
伪代码与实现
所以思路清晰之后,就可以编码的。这里贴上对redis处理的Lua伪代码:
-- id 的common前缀
local invIdPrefix = KEYS[1]
-- n个节点id的值
local inventoryIds = ARGV
-- 以下为简写的伪代码,实际上并不能运行
local id2InvCount