C# StackExchange.Redis是否支持ZPOP?
我想使用StackExchange.Redis为我的应用程序实现C# StackExchange.Redis是否支持ZPOP?,c#,redis,stackexchange.redis,C#,Redis,Stackexchange.redis,我想使用StackExchange.Redis为我的应用程序实现ZPOP。根据WATCH部分中的说明,ZPOP可通过以下命令实现: WATCH zset element = ZRANGE zset 0 0 MULTI ZREM zset element EXEC 在StackExchange Redis中,这看起来像: var connection = GetMultiplexer(); var db = connection.GetDatabase(); var trans = db.Cre
ZPOP
。根据WATCH部分中的说明,ZPOP
可通过以下命令实现:
WATCH zset
element = ZRANGE zset 0 0
MULTI
ZREM zset element
EXEC
在StackExchange Redis中,这看起来像:
var connection = GetMultiplexer();
var db = connection.GetDatabase();
var trans = db.CreateTransaction();
var elements = await trans.SortedSetRangeByScoreAsync(key, 0, 0); // THIS WILL BLOCK INDEFINITELY
var element = elemenets.FirstOrDefault();
trans.SortedSetRemoveAsync(key, element);
await trans.ExecuteAsync();
我的问题是,如何从事务中获取和使用结果?我如何实现
ZPOP
?考虑使用LUA脚本。
Redis保证lua脚本是事务性的,因为当eval脚本运行时,其他任何脚本都不能并发运行。所以你可以用
下面是如何使用LUA脚本执行ZPOP的示例:
local val = redis.call('zrange', KEYS[1], 0, 0)
if val then redis.call('zremrangebyrank', KEYS[1], 0, 0) end
return val
此外,还提供了一个示例
使用StackExchange.Redis,您可以使用IServer.ScriptLoad
和IDatabase.ScriptEvaluate
加载和执行LUA脚本
注意这不是阻塞。在连接多路复用器中使用阻塞代码将不是一个好主意
从Stackexchange.Redis:
…StackExchange.redis不提供的唯一redis功能(以及
将永远不会提供)是“阻止POP”(BLPOP、BRPOP和
BRPOPLPUSH)-因为这将允许单个调用方暂停
全多路复用器
你在找一个阻塞ZPOP吗?是的,我需要一个阻塞ZPOP我来看看这个。我可能只是使用一个未排序的列表,但是。。。非常感谢。是的,我会坚持斯波普:)谢谢你的帮助!