Class: RedisRds::ExpirableHash

Inherits:
Hash show all
Defined in:
lib/redis_rds/expirable_hash.rb

Constant Summary collapse

EXPIRY_KEY_SUFFIX =
'__expiry__'.freeze

Instance Attribute Summary

Attributes inherited from Object

#redis_key

Instance Method Summary collapse

Methods inherited from Hash

#decr, #decrby, #each, #getall, #incr, #incrby, #key?, #keys, #mget, #mset, #setnx, #to_json, #values

Methods inherited from Object

configure, #connection, connection, #delete, #dump, #exists?, #expire, #expireat, flushdb, #initialize, #namespace, #persist, #pttl, #ttl, #type

Constructor Details

This class inherits a constructor from RedisRds::Object

Instance Method Details

#allObject



40
41
42
43
44
45
46
47
48
49
50
51
52
53
# File 'lib/redis_rds/expirable_hash.rb', line 40

def all
  hash = ::Hash[super().group_by do |key, _value|
    if key.ends_with?(EXPIRY_KEY_SUFFIX)
      key[0...(key.length - EXPIRY_KEY_SUFFIX.length)]
    else
      key
    end
  end.map { |key, values| [key, values.map(&:second)] }]

  expired, valid = hash.partition { |_key, values| expired?(values.second) }
  expired.each { |key, _| remove(key) }

  return ::Hash[valid.map { |key, values| [key, values.first] }]
end

#expiry_key(key) ⇒ Object



29
30
31
# File 'lib/redis_rds/expirable_hash.rb', line 29

def expiry_key(key)
  return "#{key}#{EXPIRY_KEY_SUFFIX}"
end

#get(key) ⇒ Object



5
6
7
8
9
10
11
12
13
14
15
# File 'lib/redis_rds/expirable_hash.rb', line 5

def get(key)
  result = nil
  value, expires_at = connection.hmget(@redis_key, key, expiry_key(key))
  if expired?(expires_at)
    remove(key)
  else
    result = value
  end

  return result
end

#remove(key) ⇒ Object



33
34
35
36
37
38
# File 'lib/redis_rds/expirable_hash.rb', line 33

def remove(key)
  connection.multi do |redis|
    redis.hdel(@redis_key, key)
    redis.hdel(@redis_key, expiry_key(key))
  end
end

#set(key, value) ⇒ Object



17
18
19
20
21
22
# File 'lib/redis_rds/expirable_hash.rb', line 17

def set(key, value)
  connection.multi do |redis|
    redis.hset(@redis_key, key, value)
    redis.hdel(@redis_key, expiry_key(key))
  end
end

#setex(key, value, expiry) ⇒ Object



24
25
26
27
# File 'lib/redis_rds/expirable_hash.rb', line 24

def setex(key, value, expiry)
  expires_at = Time.now.to_i + expiry
  connection.hmset(@redis_key, key, value, expiry_key(key), expires_at)
end