Redis
 sql >> Baza danych >  >> NoSQL >> Redis

Czy polecenie redis incr może ograniczać się do określonej liczby?

Możesz użyć małego skryptu Lua, aby wykonać przyrost w samym Redis, tak aby był zasadniczo jednowątkowy:

127.0.0.1:6379> set CappedInt 7
OK
127.0.0.1:6379> eval "local c=redis.call(ARGV[1],KEYS[1])+0;if c<10 then return redis.call('INCR',KEYS[1]); else return 10; end" 1 CappedInt get
(integer) 8
127.0.0.1:6379> eval "local c=redis.call(ARGV[1],KEYS[1])+0;if c<10 then return redis.call('INCR',KEYS[1]); else return 10; end" 1 CappedInt get
(integer) 9
127.0.0.1:6379> eval "local c=redis.call(ARGV[1],KEYS[1])+0;if c<10 then return redis.call('INCR',KEYS[1]); else return 10; end" 1 CappedInt get
(integer) 10
127.0.0.1:6379> eval "local c=redis.call(ARGV[1],KEYS[1])+0;if c<10 then return redis.call('INCR',KEYS[1]); else return 10; end" 1 CappedInt get
(integer) 10

Zamiast wpisywać skrypt, możesz również umieścić kod Lua w pliku o nazwie IncWithCap.lua tak:

local cap=10
if(redis.call(ARGV[1],KEYS[1])+0 < cap) then
   return redis.call('INCR',KEYS[1])
end
return cap

Następnie możesz załadować go do Redis za pomocą:

redis-cli SCRIPT LOAD "$(cat IncWithCap.lua)"

Przykładowe wyjście

"6e6ad88c9a2b7dfdade9c5763467aaab2358d4e1"

Następnie możesz zadzwonić/wykonać to za pomocą:

127.0.0.1:6379> evalsha 6e6ad88c9a2b7dfdade9c5763467aaab2358d4e1 1 CappedInt get



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Czy powinienem używać redis do przechowywania dużej liczby plików binarnych?

  2. Tworzenie transakcji z walidacją w kliencie ServiceStack Redis

  3. Jeśli pracownik selerowy ciężko umrze, czy praca zostanie wznowiona?

  4. Czy długość nazwy wpływa na wydajność w Redis?

  5. jak zdobyć wszystkie klucze i wartości w redis w javascript?