Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

redis: EVAL and the TIME

Tags:

time

redis

eval

lua

I like the Lua-scripting for redis but i have a big problem with TIME.

I store events in a SortedSet.

The score is the time, so that in my application i can view all events in given time-window.

redis.call('zadd', myEventsSet, TIME, EventID);

Ok, but this is not working - i can not access the TIME (Servertime).

Is there any way to get a time from the Server without passing it as an argument to my lua-script? Or is passing the time as argument the best way to do it?

like image 742
Thomas Deutsch Avatar asked Sep 03 '12 09:09

Thomas Deutsch


People also ask

Does Redis have timestamp?

The TIME command returns the current server time as a two items lists: a Unix timestamp and the amount of microseconds already elapsed in the current second.

What is Redis EVAL?

Redis EVAL command is used to evaluate scripts using the Lua interpreter. The first argument of EVAL is a Lua 5.1 script. The script does not need to define a Lua function (and should not). It is just a Lua program that will run in the context of the Redis server.

What is Redis latency?

Because Redis is single-‐threaded, command requests are processed sequentially. The typical latency for a 1Gb/s network is about 200 μs. If you are seeing slow response time for commands and latency that is significantly higher than 200 μs, it could be because there are a high number of requests in the command queue.

What is Lua script in Redis?

Executing Lua in Redis. Redis lets users upload and execute Lua scripts on the server. Scripts can employ programmatic control structures and use most of the commands while executing to access the database. Because scripts execute in the server, reading and writing data from scripts is very efficient.


1 Answers

This is explicitly forbidden (as far as I remember). The reasoning behind this is that your lua functions must be deterministic and depend only on their arguments. What if this Lua call gets replicated to a slave with different system time?

Edit (by Linus G Thiel): This is correct. From the redis EVAL docs:

Scripts as pure functions

A very important part of scripting is writing scripts that are pure functions. Scripts executed in a Redis instance are replicated on slaves by sending the script -- not the resulting commands.

[...]

In order to enforce this behavior in scripts Redis does the following:

  • Lua does not export commands to access the system time or other external state.
  • Redis will block the script with an error if a script calls a Redis command able to alter the data set after a Redis random command like RANDOMKEY, SRANDMEMBER, TIME. This means that if a script is read-only and does not modify the data set it is free to call those commands. Note that a random command does not necessarily mean a command that uses random numbers: any non-deterministic command is considered a random command (the best example in this regard is the TIME command).

There is a wealth of information on why this is, how to deal with this in different scenarios, and what Lua libraries are available to scripts. I recommend you read the whole documentation!

like image 69
Sergio Tulentsev Avatar answered Sep 21 '22 15:09

Sergio Tulentsev