Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# StackExchange.Redis是否支持ZPOP?_C#_Redis_Stackexchange.redis - Fatal编程技术网

C# StackExchange.Redis是否支持ZPOP?

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

我想使用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.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我来看看这个。我可能只是使用一个未排序的列表,但是。。。非常感谢。是的,我会坚持斯波普:)谢谢你的帮助!