在StackExchange.Redis中,STRING
操作允许设置到期时间,例如:
Task<bool> StringSetAsync(
RedisKey key,
RedisValue value,
TimeSpan? expiry = null,
When when = When.Always,
CommandFlags flags = CommandFlags.None);
为什么SET
操作没有?
Task<long> SetAddAsync(
RedisKey key,
RedisValue[] values,
CommandFlags flags = CommandFlags.None);
基本上,这就是我想要实现的目标:
给定List<T>
,将项目添加到Redis集(创建或添加到现有),期限为1小时。
我该怎么做?或者我应该序列化List<T>
然后使用StringSet
?
我想使用像SREM
这样的SET函数,并将单个项添加到现有的SET中(而不是重写整个SET),这就是为什么我不想使用STRING
。
有什么建议吗?
答案 0 :(得分:11)
对于第一个问题(为什么字符串操作在设置操作时没有可选的过期):这只是,因为这是redis操作公开的内容:SET
(特别是使用EX
和PX
修饰符)和SETEX
是字符串操作,允许设置过期时间。 set 操作SADD
不会公开此类参数。其中一部分可能是为了避免混淆过期将适用于元素,而实际上过期将适用于整个密钥(即整个集)。
然后,最好的办法是明确设定到期日;在redis级别,这是通过EXPIRE
,EXPIREAT
,PEXPIRE
或PEXPIREAT
;或在SE.Redis IDatabase
上:KeyExpire
或KeyExpireAsync
。必须在 之后 如果集合很大并且您要发送多个批次并且想要确保即使它在接近结束时窒息也设置了超时,您可能希望在第一批之后发送到期。