如何在NRedisStack中为JSON键设置过期时间?
在NRedisStack中为JSON键原子设置过期时间的方案
因为NRedisStack的JSON.SetAsync方法未提供直接传入过期时间的重载,且常规事务无法同时原子执行JSON设置和KeyExpire操作,推荐使用Lua脚本实现原子化操作——Redis会将Lua脚本内的所有命令作为单个原子执行单元,完美解决一致性问题。
实现步骤
- 编写Lua脚本:同时执行
JSON.SET和EXPIRE命令 - 在C#中调用该脚本,传入键名、序列化后的JSON数据、过期时间(秒数)
代码示例
// 定义Lua脚本 var setJsonWithExpiryScript = @" redis.call('JSON.SET', KEYS[1], '$', ARGV[1]) redis.call('EXPIRE', KEYS[1], ARGV[2]) return 1 "; // 准备参数 var key = "exampleKey"; var jsonPayload = JsonSerializer.Serialize(exampleList); // 序列化对象为JSON字符串 var expireSeconds = (int)TimeSpan.FromDays(1).TotalSeconds; // 执行脚本(_redis为IConnectionMultiplexer实例) var db = _redis.GetDatabase(); await db.ScriptEvaluateAsync(setJsonWithExpiryScript, new RedisKey[] { key }, new RedisValue[] { jsonPayload, expireSeconds });
注意事项
- 确保序列化后的JSON字符串格式正确,可根据需求选择
System.Text.Json或Newtonsoft.Json - 如果需要毫秒级过期,可将
EXPIRE替换为PEXPIRE,并传入总毫秒数作为参数
内容的提问来源于stack exchange,提问作者theuserthatpretendstobesmart
相关产品推荐
相关产品推荐

