Skip to content
This repository

Expiry time not accurate #169

Closed
philjackson opened this Issue October 29, 2011 · 6 comments

2 participants

Phil Jackson Salvatore Sanfilippo
Phil Jackson

It's possible that setting an expiry time on a key might take longer than one might expect to expire. Here's some code that proves the expiry time varies between runs:

#!/usr/bin/env coffee

redis = require "redis"
client = redis.createClient()

start = new Date().getTime()

client.setex "foo", 1, "bar", ( err, value ) ->
  f = ( ) ->
    multi = client.multi().ttl( "foo" )
                          .get( "foo" )

    multi.exec ( err, [ ttl, get ] ) ->
      if not get
        end = new Date().getTime()
        console.log( "#{ end - start } ms" )
        return client.quit()

      console.log( "ttl: #{ ttl }" )
      setTimeout f, 10

  f()

A variation of ~10 milliseconds seems fair but this can be up to a second out. When you're working at a second granularity it's too far.

Salvatore Sanfilippo
Owner

Hi, this is a good improvement indeed... it may cost us some memory for 32 bits, but for 64 bits it is completely for free...

I'm working at it right now, news soon. Thanks.

Phil Jackson

Cool, thanks, antirez.

Salvatore Sanfilippo
Owner

Hi, there is a branch implementing high res timers, the branch is called 'ttlres' and is pushed on github.
All the previous commands are of course compatible with the new resolution, so now TTL foo 100 will actually
set an expire of 100000 milliseconds. The new resolution is the millisecond basically, whatever command you use, but
now it is also possible to specify sub seconds expires:

EXPIRE foo 250 ms
TTL foo ms (this will get the timeout in milliseconds instead of the default seconds output)
EXPIRE AT foo ..... ms (also works to set an expire in the future with millisecond precision)

SETEX is still missing as a clear API for that is not clear.

The reason I did not used floats like EXPIRE foo 1.235 is because performances would suffer a lot from that in the parsing stage unfortunately. Also I think that to have the unit completely bind to the real max precision is a good idea.

Cheers,
Salvatore

Phil Jackson

Great news. Thanks for the hard work!

Salvatore Sanfilippo
Owner

thanks, we are in the process of changing the API probably but the feature will be merged into unstable in very short time.

Salvatore Sanfilippo
Owner

Hi, ttlres branch merged. Now all the old commands have millisecond resolution, we also have three new commands:

PEXPIRE <key> <milliseconds>
PSETEX <key> <milliseconds> <value>
PEXPIREAT <key> <unix time in milliseconds>

The above command also allow to specify sub-second expires since now they are internally supported so it was a shame not exposing this capability in its full power. We'll add the new commands in the Redis.io documentation once 2.6 RC1 will be released.

Closing this issue.

Thanks,
Salvatore

Salvatore Sanfilippo antirez closed this November 12, 2011
Shuge Lee shuge referenced this issue from a commit May 28, 2012
Commit has since been removed from the repository and is no longer available.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Something went wrong with that request. Please try again.