【问题标题】:StackExchange Redis - StringSet vs SetAdd and expiriesStackExchange Redis - StringSet vs SetAdd 和到期
【发布时间】:2015-06-14 04:38:03
【问题描述】:

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&lt;T&gt;,将项目添加到 Redis 集(创建或添加到现有集),有效期为 1 小时。

我该怎么做?或者我应该序列化List&lt;T&gt; 然后使用StringSet

我想使用 SREM 之类的 SET 函数并将单个项目添加到现有 SET(而不是重写整个 SET),这就是我尝试不使用 STRING 的原因。

有什么建议吗?

【问题讨论】:

  • @marcgravell 你在外面吗? :)

标签: c# .net redis stackexchange.redis


【解决方案1】:

对于第一个问题(为什么字符串操作在集合操作没有到期时具有可选的到期时间):这只是 因为这就是 redis 操作所暴露的内容SET(尤其是EXPX 修饰符)和 SETEX 是此处允许设置过期的 string 操作。 set 操作SADD 没有公开这样的参数。其中一部分可能是为了避免混淆,即过期将应用于元素,而实际上过期将应用于整个键(即整个 set)。

那么,您最好的选择是明确设置到期时间;在redis级别,这是通过EXPIREEXPIREATPEXPIREPEXPIREAT;或在 SE.Redis 中的 IDatabase 上:KeyExpireKeyExpireAsync。这必须在 set 存在之后进行;如果集合很大,并且您要发送多个批次并且想要确保设置超时,即使它在接近尾声时阻塞,您可能希望在第一批次之后发送过期时间。

【讨论】:

  • 完美答案。谢谢! :)
  • 所以我想不可能为单个成员设置到期时间?
  • @asgs 在集合/散列/排序集中?不,除非您手动将其编码为项目的一部分并检查它 - 如果您发现它在运行时过期,可能还会自动发送“删除”。
猜你喜欢
  • 2022-01-12
  • 1970-01-01
  • 1970-01-01
  • 2017-08-01
  • 2020-02-15
  • 2017-05-06
  • 2019-04-05
  • 2018-03-22
  • 2022-06-17
相关资源
最近更新 更多