Sha256: 31cfb009722e34dda71cbfadf76e7439b9773a1e77159e2619c0a98999b31ded

Contents?: true

Size: 1.74 KB

Versions: 43

Compression:

Stored size: 1.74 KB

Contents

# frozen_string_literal: true

module Aws
  # @api private
  # A simple thread safe LRU cache
  class LRUCache
    # @param [Hash] options
    # @option options [Integer] :max_entries (100) Maximum number of entries
    # @option options [Integer] :expiration (nil) Expiration time in seconds
    def initialize(options = {})
      @max_entries = options[:max_entries] || 100
      @expiration = options[:expiration]
      @entries = {}
      @mutex = Mutex.new
    end

    # @param [String] key
    # @return [Object]
    def [](key)
      @mutex.synchronize do
        value = @entries[key]
        if value
          @entries.delete(key)
          @entries[key] = value unless value.expired?
        end
        @entries[key]&.value
      end
    end

    # @param [String] key
    # @param [Object] value
    def []=(key, value)
      @mutex.synchronize do
        @entries.shift unless @entries.size < @max_entries
        # delete old value if exists
        @entries.delete(key)
        @entries[key] = Entry.new(value: value, expiration: @expiration)
        @entries[key].value
      end
    end

    # @param [String] key
    # @return [Boolean]
    def key?(key)
      @mutex.synchronize do
        @entries.delete(key) if @entries.key?(key) && @entries[key].expired?
        @entries.key?(key)
      end
    end

    def clear
      @mutex.synchronize do
        @entries.clear
      end
    end

    # @api private
    class Entry
      def initialize(options = {})
        @value = options[:value]
        @expiration = options[:expiration]
        @created_time = Time.now
      end

      # @return [Object]
      attr_reader :value

      def expired?
        return false unless @expiration

        Time.now - @created_time > @expiration
      end
    end
  end
end

Version data entries

43 entries across 43 versions & 1 rubygems

Version Path
aws-sdk-core-3.220.2 lib/aws-sdk-core/lru_cache.rb
aws-sdk-core-3.220.1 lib/aws-sdk-core/lru_cache.rb
aws-sdk-core-3.220.0 lib/aws-sdk-core/lru_cache.rb
aws-sdk-core-3.219.0 lib/aws-sdk-core/lru_cache.rb
aws-sdk-core-3.218.1 lib/aws-sdk-core/lru_cache.rb
aws-sdk-core-3.218.0 lib/aws-sdk-core/lru_cache.rb
aws-sdk-core-3.217.1 lib/aws-sdk-core/lru_cache.rb
aws-sdk-core-3.217.0 lib/aws-sdk-core/lru_cache.rb
aws-sdk-core-3.216.1 lib/aws-sdk-core/lru_cache.rb
aws-sdk-core-3.216.0 lib/aws-sdk-core/lru_cache.rb
aws-sdk-core-3.215.1 lib/aws-sdk-core/lru_cache.rb
aws-sdk-core-3.215.0 lib/aws-sdk-core/lru_cache.rb
aws-sdk-core-3.214.1 lib/aws-sdk-core/lru_cache.rb
aws-sdk-core-3.214.0 lib/aws-sdk-core/lru_cache.rb
aws-sdk-core-3.213.0 lib/aws-sdk-core/lru_cache.rb
aws-sdk-core-3.212.0 lib/aws-sdk-core/lru_cache.rb
aws-sdk-core-3.211.0 lib/aws-sdk-core/lru_cache.rb
aws-sdk-core-3.210.0 lib/aws-sdk-core/lru_cache.rb
aws-sdk-core-3.209.1 lib/aws-sdk-core/lru_cache.rb
aws-sdk-core-3.209.0 lib/aws-sdk-core/lru_cache.rb