Class: Cache::Storage

Inherits:
Object
  • Object
show all
Includes:
Singleton
Defined in:
lib/cache/storage.rb

Overview

:nodoc: all

Instance Method Summary collapse

Instance Method Details

#bare_clientObject



59
60
61
62
63
64
65
66
67
68
# File 'lib/cache/storage.rb', line 59

def bare_client
  if @pid == ::Process.pid
    fork_detected = false
  else
    fork_detected = true
    ::Thread.current[:cache_storage_bare_client] = nil
    @pid = ::Process.pid
  end
  ::Thread.current[:cache_storage_bare_client] ||= fresh_bare_client(fork_detected)
end

#delete(k) ⇒ Object



43
44
45
46
47
48
49
50
51
52
53
# File 'lib/cache/storage.rb', line 43

def delete(k)
  if defined?(::Memcached) and bare_client.is_a?(::Memcached)
    begin; bare_client.delete(k); rescue ::Memcached::NotFound; nil; end
  elsif defined?(::Redis) and bare_client.is_a?(::Redis)
    bare_client.del k
  elsif bare_client.respond_to?(:delete)
    bare_client.delete k
  else
    raise "Don't know how to work with #{bare_client.inspect} because it doesn't define delete"
  end
end

#flushObject



55
56
57
# File 'lib/cache/storage.rb', line 55

def flush
  bare_client.send %w{ flush flushdb flush_all clear }.detect { |flush_cmd| bare_client.respond_to? flush_cmd }
end

#fresh_bare_client(fork_detected) ⇒ Object



70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
# File 'lib/cache/storage.rb', line 70

def fresh_bare_client(fork_detected)
  if defined?(::Dalli) and Config.instance.client.is_a?(::Dalli::Client)
    Config.instance.client.close if fork_detected
    Config.instance.client
  elsif defined?(::ActiveSupport::Cache::DalliStore) and Config.instance.client.is_a?(::ActiveSupport::Cache::DalliStore)
    Config.instance.client.reset if fork_detected
    Config.instance.client
  elsif defined?(::Memcached) and (Config.instance.client.is_a?(::Memcached) or Config.instance.client.is_a?(::Memcached::Rails))
    Config.instance.client.clone
  elsif defined?(::Redis) and Config.instance.client.is_a?(::Redis)
    Config.instance.client.client.connect if fork_detected
    Config.instance.client
  elsif defined?(::MemCache) and Config.instance.client.is_a?(::MemCache)
    Config.instance.client.reset if fork_detected
    Config.instance.client
  else
    raise "Don't know how to thread/fork #{Config.instance.client.inspect}"
  end
end

#get(k) ⇒ Object



6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# File 'lib/cache/storage.rb', line 6

def get(k)
  if defined?(::Memcached) and bare_client.is_a?(::Memcached)
    begin; bare_client.get(k); rescue ::Memcached::NotFound; nil; end
  elsif defined?(::Redis) and bare_client.is_a?(::Redis)
    if cached_v = bare_client.get(k) and cached_v.is_a?(::String)
      ::Marshal.load cached_v
    end
  elsif bare_client.respond_to?(:get)
    bare_client.get k
  elsif bare_client.respond_to?(:read)
    bare_client.read k
  else
    raise "Don't know how to work with #{bare_client.inspect} because it doesn't define get"
  end
end

#set(k, v, ttl) ⇒ Object



22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
# File 'lib/cache/storage.rb', line 22

def set(k, v, ttl)
  ttl ||= Config.instance.default_ttl
  if defined?(::Redis) and bare_client.is_a?(::Redis)
    if ttl == 0
      bare_client.set k, ::Marshal.dump(v)
    else
      bare_client.setex k, ttl, ::Marshal.dump(v)
    end
  elsif bare_client.respond_to?(:set)
    bare_client.set k, v, ttl
  elsif bare_client.respond_to?(:write)
    if ttl == 0
      bare_client.write k, v # never expire
    else
      bare_client.write k, v, :expires_in => ttl
    end
  else
    raise "Don't know how to work with #{bare_client.inspect} because it doesn't define set"
  end
end