Class: DistributedMemoizer

Inherits:
Object
  • Object
show all
Defined in:
lib/distributed_memoizer.rb

Constant Summary collapse

MAX_WAIT =

never wait for longer that 1 second for a cross process lock

1

Class Method Summary collapse

Class Method Details

.memoize(key, duration = 60 * 60 * 24, redis = Discourse.redis) ⇒ Object

memoize a key across processes and machines



8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# File 'lib/distributed_memoizer.rb', line 8

def self.memoize(key, duration = 60 * 60 * 24, redis = Discourse.redis)
  redis_lock_key = self.redis_lock_key(key)
  redis_key = self.redis_key(key)

  DistributedMutex.synchronize(redis_lock_key, redis: redis, validity: MAX_WAIT) do
    result = redis.get(redis_key)

    unless result
      result = yield
      redis.setex(redis_key, duration, result)
    end

    result
  end
end

.redis_key(key) ⇒ Object



28
29
30
# File 'lib/distributed_memoizer.rb', line 28

def self.redis_key(key)
  "memoize_#{key}"
end

.redis_lock_key(key) ⇒ Object



24
25
26
# File 'lib/distributed_memoizer.rb', line 24

def self.redis_lock_key(key)
  "memoize_lock_#{key}"
end