StackExchange.Redis支持ZPOP?

时间:2015-11-18 18:32:29

标签: c# redis stackexchange.redis

我想使用StackExchange.Redis为我的应用程序提出ZPOP。根据WATCH部分中的Redis documentationZPOP可以使用以下命令实现:

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

1 个答案:

答案 0 :(得分:2)

考虑使用LUA脚本。 Redis保证lua脚本是事务性的,因为当eval脚本运行时,没有其他任何东西可以同时运行。所以你可以使用EVAL

Here是如何使用LUA脚本执行ZPOP的示例:

local val = redis.call('zrange', KEYS[1], 0, 0)
if val then redis.call('zremrangebyrank', KEYS[1], 0, 0) end
return val

还提供了ZREVPOP

使用StackExchange.Redis,您可以使用IServer.ScriptLoadIDatabase.ScriptEvaluate加载和执行LUA脚本。

https://github.com/StackExchange/StackExchange.Redis/blob/master/Docs/Transactions.md

请注意,这不是阻止。在ConnectionMultiplexer中使用阻止代码并不是一个好主意。

来自Stackexchange.Redis documentation

  

... StackExchange.Redis不提供的唯一redis功能(和   永远不会提供)“阻止流行音乐”(BLPOP,BRPOP和   BRPOPLPUSH) - 因为这将允许单个呼叫者停止   整个多路复用器