2016-03-29 21 views
1

Redisでカウンタの範囲を設定するにはどうすればよいですか?私は、値がこの範囲を超えている場合、INCRまたはDECRがエラーを返すように、カウンタにあらかじめ定義されたMAXとMIN値(特にMIN値は0)を設定します。私はRedis Documentationを通過しましたが、何の答えも見つかりませんでした。Redisでカウンタの定義済み範囲を設定する

答えて

0

Redisはこの組み込み関数を提供していませんが、あなた自身で構築することができます。これを行うには多くの方法がありますが、個人的にはLuaスクリプトを使用しています。詳細はEVALをお読みください。この場合

、私はこのスクリプトを使用すると思います:

local val = tonumber(redis.call('GET', KEYS[1])) 
if not val then 
    val = 0 
end 

local inc = val + tonumber(ARGV[1]) 
if inc < tonumber(ARGV[2]) or inc > tonumber(ARGV[3]) then 
    error('Counter is out of bounds') 
else 
    return redis.call('SET', KEYS[1], inc) 
end 

ここでは、コマンドラインからのサンプル実行の出力です:

$ redis-cli --eval incrbyminmax.lua foo , 5 0 10 
(integer) 5 
$ redis-cli --eval incrbyminmax.lua foo , 5 0 10 
(integer) 10 
$ redis-cli --eval incrbyminmax.lua foo , 5 0 10 
(error) ERR Error running script (call to f_ada0f9d33a6278f3e55797b9b4c89d5d8a012601): @user_script:8: user_script:8: Counter is out of bounds 
$ redis-cli --eval incrbyminmax.lua foo , -9 0 10 
(integer) 1 
$ redis-cli --eval incrbyminmax.lua foo , -9 0 10 
(error) ERR Error running script (call to f_ada0f9d33a6278f3e55797b9b4c89d5d8a012601): @user_script:8: user_script:8: Counter is out of bounds 
+1

グレート答えは! 1つの疑いがある:Luaスクリプトはスレッドセーフであるか?私はサーバ1とサーバ2がカウンタを1から0に減らすためにスクリプトを呼び出すと仮定します。私はRedisがシングルスレッドであることを望んでおり、呼び出しの1つだけが0を返し、もう1つはエラーを返します。私の理解を検証できますか? – naves

+0

ありがとう&validated - スクリプトはアトミックでブロックされています。 –

+1

はい、スクリプトも書いています。よく働く。私はコード内のどこからでもこのカウンタを使用しているわけではないので、他の並行処理の問題もないはずです。私はあなたの答えを正しいものとしてマークしました。一度私は十分な評判を持って表示されます。 – naves

関連する問題