2015-11-18 155 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 :)感謝您的幫助! –