在
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);
基本上,这就是我想要实现的目标:
给定列表< T>,将项目添加到Redis集合(创建或添加到现有),期限为1小时.
我该怎么做?或者我应该序列化List< T>那么使用StringSet?
我想使用像SREM这样的SET函数,并将单个项添加到现有的SET(而不是重写整个SET),这就是为什么我不想使用STRING.
有什么建议?
解决方法
对于第一个问题(为什么字符串操作在设置操作时没有可选的到期):这只是因为redis操作公开了:SET(特别是EX和PX修饰符)和SETEX是这里的字符串操作允许设置到期时间.设置操作SADD不公开这样的参数.其中一部分可能是为了避免混淆,即到期将适用于元素,而事实上,到期将适用于整个密钥(即整个集合).
那么,你最好的选择是明确设定到期时间;在redis级别,这是通过EXPIRE,EXPIREAT,PEXPIRE或PEXPIREAT;或者在SE.Redis中的IDatabase:KeyExpire或KeyExpireAsync.这必须在集合存在之后完成;如果集合很大并且您要发送多个批次并且想要确保即使在接近结束时窒息也设置了超时,您可能希望在第一批之后发送到期.