StackExchange Redis - StringSet与SetAdd和expiries

RPM*_*984 8 .net c# redis stackexchange.redis

StackExchange.Redis中,STRING操作允许设置到期时间,例如:

    Task<bool> StringSetAsync(
RedisKey key, 
RedisValue value, 
TimeSpan? expiry = null, 
When when = When.Always, 
CommandFlags flags = CommandFlags.None);
Run Code Online (Sandbox Code Playgroud)

为什么SET操作没有?

    Task<long> SetAddAsync(
RedisKey key, 
RedisValue[] values, 
CommandFlags flags = CommandFlags.None);
Run Code Online (Sandbox Code Playgroud)

基本上,这就是我想要实现的目标:

给定a List<T>,将项目添加到Redis集(创建或添加到现有),期限为1小时.

我该怎么做?或者我应该序列化List<T>然后使用StringSet

我想使用SET函数SREM,并将单个项添加到现有SET(而不是重写整个SET),这就是为什么我不想使用STRING.

有什么建议?

Mar*_*ell 11

对于第一个问题(为什么字符串操作在设置操作时没有可选的到期):这仅仅是因为redis操作暴露的内容 :( SET特别是使用EXPX修饰符)并且这里SETEX字符串操作允许到期被设定.该操作SADD不公开任何这样的参数.其中一部分可能是为了避免混淆,即到期将适用于元素,而实际上到期将适用于整个密钥(即整个集合).

那么,你最好的选择是明确设定到期时间; 在redis的水平,这是通过EXPIRE,EXPIREAT,PEXPIREPEXPIREAT; 或者IDatabase在SE.Redis:KeyExpireKeyExpireAsync.这必须在集合存在之后完成; 如果集合很大并且您要发送多个批次并且想要确保即使在接近结束时窒息也设置了超时,您可能希望在第一批之后发送到期.

  • @asgs在set/hash/sorted中?不,除非您手动将其编码为项目的一部分,并检查它 - 如果您发现它在运行时过期,也可能自动发送"删除". (2认同)