sql >> Databasteknik >  >> NoSQL >> Redis

Hur lagrar man i Redis sorterad uppsättning med tidsstämpel på serversidan som poäng?

Lösningen är att använda ett Lua-skript:

local time = redis.call('TIME')
local ts = time[1]..string.format('%06d', time[2])
return redis.call('ZADD', KEYS[1], ts, ARGV[1])

Här använder vi Redis TIME kommando. Kommandot returnerar:

  • Unix-tid i sekunder
  • mikrosekunder

Så vi kan sammanfoga dessa två och använda en mikrosekund-tidsstämpel. Vi måste nollställa mikrosekundersdelen.

Eftersom sorterade uppsättningar är bra med heltalsvärden upp till 2^53 är vår tidsstämpel säker ända fram till år 2255.

Detta är Redis-Cluster-säkert eftersom vi lagrar i en nyckel. Om du vill använda flera nycklar, se till att landa dem på samma nod med hash-taggar om du vill jämföra tidsstämplar.

Du kan ändra skriptet för att använda lägre upplösning än mikrosekund.

Här är EVAL kommando, enkel lösenordsnyckel och värde som argument, inget behov av att skapa den sorterade uppsättningen i förväg:

EVAL "local time = redis.call('TIME') local ts = time[1]..string.format('%06d', time[2]) return redis.call('ZADD', KEYS[1], ts, ARGV[1])" 1 ssetKey myVal

Som alltid kanske du vill ladda skriptet och använda EVALSHA .

> SCRIPT LOAD "local time = redis.call('TIME') local ts = time[1]..string.format('%06d', time[2]) return redis.call('ZADD', KEYS[1], ts, ARGV[1])"
"81e366e422d0b09c9b395b5dfe03c03c3b7b3bf7"
> EVALSHA 81e366e422d0b09c9b395b5dfe03c03c3b7b3bf7 1 ssetKey myNewVal
(integer) 1

En anteckning om Redis version. Om du använder:

  • Redis version före 3.2:tyvärr kan du inte använda TIME (icke-deterministiskt kommando) och skriv sedan med ZADD .
  • Redis version större än 3.2 men <5.0:Lägg till redis.replicate_commands() ovanpå manuset. Se skript som rena funktioner
  • Redis 5.0 och uppåt:du är bra.



  1. Kör Heroku bakgrundsuppgifter med endast 1 webbdyno och 0 arbetardyno

  2. Frågar med mangust och dadlar

  3. MongoDB skillnader mellan NumberLong och simple Integer?

  4. Node.js, Mongo hitta och returnera data