Class: CacheFor::Base

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

Constant Summary collapse

DefaultSeconds =

10 minutes

600
CacheMiss =
nil

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(redis_uri = nil, default_seconds: Base::DefaultSeconds) ⇒ Base

When redis_uri == nil, Redis gem will use its own default url, typically redis://locahost:6379.



17
18
19
20
# File 'lib/cache_for/base.rb', line 17

def initialize(redis_uri = nil, default_seconds: Base::DefaultSeconds)
  @for_seconds = default_seconds
  @redis_store = Redis.new url: redis_uri
end

Instance Attribute Details

#for_secondsObject

Returns the value of attribute for_seconds.



9
10
11
# File 'lib/cache_for/base.rb', line 9

def for_seconds
  @for_seconds
end

#redis_storeObject

Returns the value of attribute redis_store.



10
11
12
# File 'lib/cache_for/base.rb', line 10

def redis_store
  @redis_store
end

Instance Method Details

#cache_time(seconds = nil) ⇒ Object



50
51
52
53
54
55
# File 'lib/cache_for/base.rb', line 50

def cache_time(seconds = nil)
  seconds ||= for_seconds
  # a time integer that remains unchanging for <seconds> seconds
  #   rounds down to nearest multiple of seconds
  (seconds * (Time.now.to_i / seconds).to_i)
end

#expire(name, seconds = nil) ⇒ Object



43
44
45
46
47
48
# File 'lib/cache_for/base.rb', line 43

def expire(name, seconds = nil)
  begin
    @redis_store.expire(key_for(name, seconds))
  rescue
  end
end

#fetch(name, seconds = nil) ⇒ Object



61
62
63
64
65
66
67
68
69
70
# File 'lib/cache_for/base.rb', line 61

def fetch(name, seconds = nil)
  if (cached = get(name, seconds)) != self.class::CacheMiss
    cached
  else
    new_value = yield
    set(name, new_value, seconds)
    expire(name, seconds)
    new_value
  end
end

#get(name, seconds = nil) ⇒ Object Also known as: read



22
23
24
25
26
27
28
29
30
31
32
# File 'lib/cache_for/base.rb', line 22

def get(name, seconds = nil)
  begin
    if found = @redis_store.get(key_for(name, seconds))
      puts "cache hit #{key_for(name, seconds)}"
      found
    end
  rescue
    puts "cache miss #{key_for(name, seconds)}"
    self.class::CacheMiss
  end
end

#key_for(name, seconds = nil) ⇒ Object



57
58
59
# File 'lib/cache_for/base.rb', line 57

def key_for(name, seconds = nil)
  "#{name}#{cache_time(seconds)}"
end

#set(name, value, seconds = nil) ⇒ Object Also known as: write



35
36
37
38
39
40
# File 'lib/cache_for/base.rb', line 35

def set(name, value, seconds = nil)
  begin
    @redis_store.set(key_for(name, seconds), value)
  rescue
  end
end