Redis中提供了原子性命令SETEX或SET来写入STRING类型数据并设置Key的过期时间:
> SET key value EX 60 NX ok > SETEX key 60 value ok
但对于HASH结构则没有这样的命令,只能先写入数据然后设置过期时间:
> HSET key field value ok > EXPIRE key 60 ok
这样就带了一个问题:HSET命令执行成功而EXPIRE命令执行失败(如命令未能成功发送到Redis服务器),那么数据将不会过期。针对这个问题,本文提供了几种解决方案:
Lua脚本
向Redis中写入HASH结构的Lua脚本如下:
local fieldIndex=3 local valueIndex=4 local key=KEYS[1] local fieldCount=ARGV[1] local expired=ARGV[2] for i=1,fieldCount,1 do redis.pcall('HSET',key,ARGV[fieldIndex],ARGV[valueIndex]) fieldIndex=fieldIndex+2 valueIndex=valueIndex+2 end redis.pcall('EXPIRE',key,expired)
使用Redis命令行工具执行Lua脚本,需要将脚本内容单行化,并以分号间隔不同的命令:
> SCRIPT LOAD "local fieldIndex=3;local valueIndex=4;local key=KEYS[1];local fieldCount=ARGV[1];local expired=ARGV[2];for i=1,fieldCount,1 do redis.pcall('HSET',key,ARGV[fieldIndex],ARGV[valueIndex]) fieldIndex=fieldIndex+2 valueIndex=valueIndex+2 end;redis.pcall('EXPIRE',key,expired);" "e03e7868920b7669d1c8c8b16dcee86ebfac650d" > evalsha e03e7868920b7669d1c8c8b16dcee86ebfac650d 1 key 2 1000 field1 value1 field2 value2 nil
写入结果:
使用StackExchange.Redis执行Lua脚本:
public async T