StackExchange Redis - StringSet 与 SetAdd 和过期
StackExchange Redis - StringSet vs SetAdd and expiries
在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
。
有什么建议吗?
对于第一个问题(为什么字符串操作有可选的过期时间而集合操作没有):这很简单因为这就是 redis 操作公开的内容:SET
(特别是使用 EX
和 PX
修饰符)和 SETEX
是此处允许设置过期的 string 操作。 set 操作 SADD
没有公开这样的参数。其中一部分可能是为了避免混淆过期将应用于元素,而实际上过期将应用于整个键(即整个 set)。
那么,最好的办法是明确设置到期时间;在 Redis 级别,这是通过 EXPIRE
、EXPIREAT
、PEXPIRE
或 PEXPIREAT
;或 SE.Redis 中的 IDatabase
:KeyExpire
或 KeyExpireAsync
。这必须在 set 存在之后完成;如果集合很大并且您要发送多个批次并且想要确保设置超时,即使它在接近尾声时阻塞,您可能希望在第一个批次之后发送过期时间。
在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
。
有什么建议吗?
对于第一个问题(为什么字符串操作有可选的过期时间而集合操作没有):这很简单因为这就是 redis 操作公开的内容:SET
(特别是使用 EX
和 PX
修饰符)和 SETEX
是此处允许设置过期的 string 操作。 set 操作 SADD
没有公开这样的参数。其中一部分可能是为了避免混淆过期将应用于元素,而实际上过期将应用于整个键(即整个 set)。
那么,最好的办法是明确设置到期时间;在 Redis 级别,这是通过 EXPIRE
、EXPIREAT
、PEXPIRE
或 PEXPIREAT
;或 SE.Redis 中的 IDatabase
:KeyExpire
或 KeyExpireAsync
。这必须在 set 存在之后完成;如果集合很大并且您要发送多个批次并且想要确保设置超时,即使它在接近尾声时阻塞,您可能希望在第一个批次之后发送过期时间。