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 medZADD
. - 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.