我想使用StackExchange.Redis为我的应用程序提出ZPOP
。根据WATCH部分中的Redis documentation,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
?
答案 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.ScriptLoad
和IDatabase.ScriptEvaluate
加载和执行LUA脚本。
https://github.com/StackExchange/StackExchange.Redis/blob/master/Docs/Transactions.md
请注意,这不是阻止。在ConnectionMultiplexer
中使用阻止代码并不是一个好主意。
来自Stackexchange.Redis documentation:
... StackExchange.Redis不提供的唯一redis功能(和 永远不会提供)“阻止流行音乐”(BLPOP,BRPOP和 BRPOPLPUSH) - 因为这将允许单个呼叫者停止 整个多路复用器