Skip to content

Instantly share code, notes, and snippets.

@barinek
Created January 19, 2010 00:43
Show Gist options
  • Select an option

  • Save barinek/280542 to your computer and use it in GitHub Desktop.

Select an option

Save barinek/280542 to your computer and use it in GitHub Desktop.
LRU Memory Store
class LRUMemoryStore < ActiveSupport::Cache::Store
def initialize(max_size = 1000)
@max_size = max_size
@data = {}
@lru = []
end
def read(name, options = nil)
super
set_lru(name)
@data[name]
end
def write(name, value = nil, options = nil)
super
value = name if value.nil?
@data[name] = value.freeze
set_lru(name)
@data.delete(@lru.pop) if @lru.size > @max_size
end
def delete(name, options = nil)
super
@data.delete(name)
@lru.delete(name)
end
def delete_matched(matcher, options = nil)
raise 'not implemented'
end
def exist?(name, options = nil)
super
@data.has_key?(name)
end
def clear
@data.clear
@lru.clear
end
def size
raise 'Index does not match data size.' if @data.size != @lru.size
@data.size
end
private
def set_lru(key)
@lru.unshift(@lru.delete(key) || key)
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment