2017-04-26 21 views
0

我想知道是否有在Redis的從我的應用程序的單一往返執行此道:Redis的INCRBY與限制

對於給定的關鍵K,它可能值V是任何整數在範圍[A, B]之內。基本上它有一個上限和下限。

當發出INCRBYDECRBY命令(例如。INCRBY key 10),它會被執行僅如果所得到的值不超出範圍。

我需要這個操作是原子的,我想知道是否有辦法避免這個Lua腳本。

謝謝。

+0

1.爲什麼要避免lua腳本? 2.「B - A == 2^n - 1」? –

+0

@for_stack我試圖避免LUA,因爲我從來沒有使用它,這段代碼需要爲我清楚。關於範圍,這是一個正常的時間間隔...基本上,我想有一個分數從0到100,事件增加和減少點數,但從未低於0或超過100。問題是50個事件可以發生在同一秒內,所以原子性是必須**。 –

回答

2

這個答案可能不是你所期望的。但我不得不說,Lua腳本是一個清晰的解決方案。

-- range-incrby.lua key , increment 
local key = KEYS[1] 
local increment = ARGV[1] 
local cnt = redis.call('get', key) or 0 
cnt = cnt + increment 
if (cnt >= 0 and cnt <= 100) then 
    redis.call('set', key, cnt) 
    return cnt 
end 

而且,如果範圍爲[0, 2^N - 1],那麼你可以使用BITFIELD命令溢出控制來解決問題。

BITFIELD key OVERFLOW FAIL INCRBY uN 0 increment 

但是,這似乎不是你的情況。

+0

正確答案也是。次要評論:Lua,不是「lua」,總是更好地使用'ARGS'並將參數外化......即使在例子中;) –

+0

@ItamarHaber感謝您的評論! B.T.W你不能用'ARGS'替換'ARGV'。或者我誤解任何東西? –

+0

想當然'ARGV'(該死的自動更正)。我想回報,並感謝您在SO/Redis問題中變得更加活躍 - 我一直在關注着你,你知道;) –