File: memory_cache.rb

package info (click to toggle)
ruby-device-detector 1.0.1-2
  • links: PTS, VCS
  • area: main
  • in suites: bookworm, bullseye, buster, forky, sid, trixie
  • size: 3,104 kB
  • sloc: ruby: 1,224; makefile: 5
file content (55 lines) | stat: -rw-r--r-- 1,024 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
class DeviceDetector
  class MemoryCache

    DEFAULT_MAX_KEYS = 5000

    attr_reader :data, :max_keys, :lock
    private :lock

    def initialize(config)
      @data = {}
      @max_keys = config[:max_cache_keys] || DEFAULT_MAX_KEYS
      @lock = Mutex.new
    end

    def set(key, value)
      lock.synchronize do
        purge_cache
        data[String(key)] = value
      end
    end

    def get(key)
      data[String(key)]
    end

    def key?(string_key)
      data.key?(string_key)
    end

    def get_or_set(key, value = nil)
      string_key = String(key)

      if key?(string_key)
        get(string_key)
      else
        value = yield if block_given?
        set(string_key, value)
      end
    end

    private

    def purge_cache
      key_size = data.size

      if key_size >= max_keys
        # always remove about 1/3 of keys to reduce garbage collecting
        amount_of_keys = key_size / 3

        data.keys.first(amount_of_keys).each { |key| data.delete(key) }
      end
    end

  end
end