sql >> Database teknologi >  >> NoSQL >> Redis

Hvordan gemmer man i Redis sorteret sæt med server-side tidsstempel som score?

Løsningen er at bruge et Lua-script:

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

Her bruger vi Redis TIME kommando. Kommandoen returnerer:

  • unix-tid i sekunder
  • mikrosekunder

Så vi kan sammenkæde disse to og bruge et mikrosekund-tidsstempel. Vi er nødt til at nulstille mikrosekunderdelen.

Da sorterede sæt er gode med heltalsværdier op til 2^53, er vores tidsstempel sikkert helt op til år 2255.

Dette er Redis-Cluster-sikkert, da vi opbevarer i én nøgle. Hvis du vil bruge flere nøgler, skal du sørge for at lande dem på den samme node ved hjælp af hash-tags, hvis du vil sammenligne tidsstempler.

Du kan ændre scriptet til at bruge lavere opløsning end mikrosekund.

Her er EVAL kommando, simpel adgangsnøgle og værdi som argumenter, ingen grund til at oprette det sorterede sæt på forhånd:

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 altid vil du måske indlæse scriptet og bruge 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 note om Redis version. Hvis du bruger:

  • Redis version før 3.2:beklager, du kan ikke bruge TIME (ikke-deterministisk kommando) og skriv derefter med ZADD .
  • Redis version større end 3.2 men <5.0:Tilføj redis.replicate_commands() oven på manuskriptet. Se scripts som rene funktioner
  • Redis 5.0 og op:du er god.



  1. Bedste måde at opbevare redis-nøgler på

  2. Sådan konverteres streng til objectId i LocalField for $lookup Mongodb

  3. Mongoose sorterer det aggregerede resultat

  4. Hvordan konstrueres og videregives bson-dokument - Go lang?