2016-03-29 34 views
1

Ayar sırasında Redis'te bir Sayaç aralığını nasıl önceden tanımlarım. Sayacın önceden tanımlanmış bir MAX ve bir MIN değeri (özellikle benim durumumda MIN değeri 0) olmasını istiyorum, öyle ki değer bu aralığı aşarsa INCR veya DECR bir hata döndürür. Redis Dokümantasyonundan geçtim ve hiçbir cevap bulamadım.Redis için Öntanımlı Bir Sayaç Aralığı Belirleyin

cevap

0

Redis bu yerleşik girişi sağlamaz, ancak bunu kendiniz oluşturmak için kullanabilirsiniz. Bunu yapmanın birçok yolu var, kişisel tercihim Lua betiklerini kullanıyor - daha fazla arka plan için EVAL'u oku.

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 

Burada komut satırından bir numune çalışması çıktısı var: Bu durumda

, ben bu komut dosyasını kullanmak istiyorum

$ 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

Güzel cevap !! Yine de 1 şüphe var: Lua Script iş parçacığı güvenli mi olacak? Sunucu 1 ve Sunucu 2'nin Sayacı 1'den 0'a düşürmek için komut dosyasını çağırdığımı varsayalım. Redis'in Tekli işlenmesini umuyordum, aramanın yalnızca biri 0'a dönecek ve diğeri hata döndürecektir. Anlayışımı doğrulayabilir misin? – naves

+0

Teşekkürler ve doğrulanmış - komut dosyaları atomiktir ve engellenir. –

+1

Evet, bazı yazılar da yazdım. Harika çalışıyor. Bu sayacı kodumda başka bir yerden kullanmıyorum, diğer eşzamanlılık sorunları da olmamalı. Cevabınızı doğru olarak işaretledim. Yeterli bir itibarım olduğunda gösterilecek. – naves