sql >> Databasteknik >  >> NoSQL >> Redis

Kan kommandot redis incr begränsas till ett specifikt antal?

Du kan använda ett litet Lua-skript för att göra inkrementet inom Redis själv så att det i huvudsak är entrådigt:

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

Istället för att skriva in skriptet kan du också lägga in Lua-koden i en fil som heter IncWithCap.lua så här:

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

Sedan kan du ladda den till Redis med:

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

Exempelutdata

"6e6ad88c9a2b7dfdade9c5763467aaab2358d4e1"

Sedan kan du anropa/köra den med:

127.0.0.1:6379> evalsha 6e6ad88c9a2b7dfdade9c5763467aaab2358d4e1 1 CappedInt get



  1. Hur ignorerar man nollor samtidigt som man tar upp ett MongoDB-dokument?

  2. Hur man frågar en underdokumentsamling med MongoDB och C#-drivrutinen

  3. Redis är det möjligt att uppdatera flera hset-nycklar (inte fält) med hjälp av mset

  4. Kan MongoDB aggregeringsramverket $group returnera en rad värden?