5 ms·
Here's an implementation in Python built on top of Redis using sorted sets: class TimeStore: def __init__(self, redis_client): self.red
by smarx 12y ago
Here's an implementation in Python built on top of Redis using sorted sets:
class TimeStore:
def __init__(self, redis_client):
self.redis_client = redis_client
@staticmethod
def timestamp(time): return (time-datetime.datetime(1970,1,1)).total_seconds()
def set_value(self, key, value, time=None):
if time is None: time = datetime.datetime.utcnow()
self.redis_client.zadd(key, self.timestamp(time), value)
def get_value(self, key, time=None):
if time is None: time = datetime.datetime.utcnow()
for item in self.redis_client.zrevrangebyscore(key, self.timestamp(time), 0, start=0, num=1):
return item
return None
def cleanup_before(self, key, time):
self.redis_client.zremrangebyscore(key, 0, self.timestamp(time))
- huy 12y agoI think this won't work because Redis' sorted set only allow members with different values. In this case the value mutations could be the same.
- smarx 12y agoOops, you're right! Here's a fixed version (just prefixing the timestamp to the value to make sure it's always unique). Of course, this entire class makes the assumption that you never write twice with the same timestamp. (That's hard to guarantee if you're actually using time instead of something strictly increasing.) class TimeStore: def __init__(self, redis_client): self.redis_client = redis_client @staticmethod def timestamp(time): return (time-datetime.datetime(1970,1,1)).total_seconds() def set_value(self, key, value, time=None): if time is None: time = datetime.datetime.utcnow() timestamp = self.timestamp(time) self.redis_client.zadd(key, timestamp, '%d:%s' % (timestamp, value)) def get_value(self, key, time=None): if time is None: time = datetime.datetime.utcnow() for item in self.redis_client.zrevrangebyscore(key, self.timestamp(time), 0, start=0, num=1): return item.partition(':')[2] return None def cleanup_before(self, key, time): self.redis_client.zremrangebyscore(key, 0, self.timestamp(time))