前言
Redis 2.6.0 版本开始,可通过内置的 Lua 解释器,使 EVAL 命令对 Lua 脚本进行求值。参考 Redis官网
redis对lua脚本的调用是原子性的,所以一些特殊场景,可以放在lua中实现
例子
本文记录使用 redistemplate 调用 lua 脚本,实现红包的库存消耗操作。
使用到的红包 redis 结构为Map
int id = 1;
String redisKey = RepacketItem.class_id_{
id}_today;
Map<Integer> redisValue = new HashMap();
/** map 结构
{
int money; // 红包金额
int todayLimit; //今天可发放上限数量,
int todayUsed; //今天已发放数,
int totalRmain; //红包剩余库存
}
**/
lua脚本功能:当今天已发放库存+n>今天发放限量,更新n个库存,详见脚本
一、独立编写脚本使用 (推荐)
- 准备lua 脚本
--resource/redis/decrStock.lua
local todayUsed = tonumber(redis.call('HGET',KEYS[1],'todayUsed'))
local todayLimit = tonumber(redis.call('HGET',KEYS[1],'todayLimit'))
local n = tonumber(ARGV[1])
if todayLimit >= todayUsed + n then
redis.call('HINCRBY',