Class: SafeMemoize::Stores::Memory

Inherits:
Base
  • Object
show all
Defined in:
lib/safe_memoize/stores/memory.rb

Overview

Default in-process cache store backed by a plain +Hash+.

Thread-safe via an internal +Mutex+. Supports per-entry TTL with lazy expiry: stale entries are not proactively removed but are treated as misses on read and excluded from #keys.

Constant Summary

Constants inherited from Base

Base::MISS

Instance Method Summary collapse

Methods inherited from Base

#exist?

Constructor Details

#initializeMemory

Returns a new instance of Memory.



11
12
13
14
# File 'lib/safe_memoize/stores/memory.rb', line 11

def initialize
  @data = {}
  @mutex = Mutex.new
end

Instance Method Details

#clearvoid

This method returns an undefined value.

Removes all entries.



49
50
51
# File 'lib/safe_memoize/stores/memory.rb', line 49

def clear
  @mutex.synchronize { @data.clear }
end

#delete(key) ⇒ void

This method returns an undefined value.

Parameters:

  • key (Object)


43
44
45
# File 'lib/safe_memoize/stores/memory.rb', line 43

def delete(key)
  @mutex.synchronize { @data.delete(key) }
end

#keysArray<Object>

Returns all live (non-expired) keys.

Returns:

  • (Array<Object>)


55
56
57
58
59
60
# File 'lib/safe_memoize/stores/memory.rb', line 55

def keys
  now = Process.clock_gettime(Process::CLOCK_MONOTONIC)
  @mutex.synchronize do
    @data.filter_map { |k, entry| k unless entry[:expires_at] && entry[:expires_at] <= now }
  end
end

#read(key) ⇒ Object

Returns stored value, or Base::MISS if absent or expired.

Parameters:

  • key (Object)

Returns:

  • (Object)

    stored value, or Base::MISS if absent or expired



18
19
20
21
22
23
24
25
26
# File 'lib/safe_memoize/stores/memory.rb', line 18

def read(key)
  @mutex.synchronize do
    entry = @data[key]
    return MISS unless entry
    return MISS if expired?(entry)

    entry[:value]
  end
end

#write(key, value, expires_in: nil) ⇒ void

This method returns an undefined value.

Parameters:

  • key (Object)
  • value (Object)
  • expires_in (Numeric, nil) (defaults to: nil)

    seconds until expiry



32
33
34
35
36
37
38
39
# File 'lib/safe_memoize/stores/memory.rb', line 32

def write(key, value, expires_in: nil)
  now = Process.clock_gettime(Process::CLOCK_MONOTONIC)
  expires_at = expires_in ? now + expires_in.to_f : nil

  @mutex.synchronize do
    @data[key] = {value: value, expires_at: expires_at, cached_at: now}
  end
end