2015-11-18 139 views
1

我想用我的应用程序使用StackExchange.Redis来实现ZPOP。根据该表款的Redis documentationZPOP可以用下面的命令来实现:StackExchange.Redis是否支持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

您是否在寻找阻塞的ZPOP? – thepirat000

+0

是的,我需要一个阻塞ZPOP –

回答

2

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

Here是你如何能做到ZPOP用LUA脚本的例子:

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

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

+0

我会看看这个。我可能只是使用一个非排序列表......谢谢! –

+0

是的,我会坚持SPOP :)感谢您的帮助! –