Skip to content

Instantly share code, notes, and snippets.

@mradmacher
Last active January 3, 2016 13:29
Show Gist options
  • Save mradmacher/8470227 to your computer and use it in GitHub Desktop.
Save mradmacher/8470227 to your computer and use it in GitHub Desktop.
Caching database objects in memory
class MemStore
def get(klass, id)
Rails.cache.fetch("#{cachize(klass)}_#{id}") do
klass.find(id)
end
end
def remove(klass, id)
Rails.cache.delete("#{cachize(klass)}_#{id}")
end
private
def cachize(klass)
klass.name.titleize.parameterize('_')
end
end
module Cacheable
extend ActiveSupport::Concern
included do
after_save :clear_cache
after_destroy :clear_cache
end
private
def clear_cache
MemStore.remove(self.class, id)
end
end
class DBObject
include Mongoid::Document
include Cacheable
end
obj = MemStore.get(DBObject, "523abc757b0059153f000091") # retrieved from db
obj = MemStore.get(DBObject, "523abc757b0059153f000091") # retrieved from memory
# change some obj attributes
obj.save # cache for obj cleared
obj = MemStore.get(DBObject, "523abc757b0059153f000091") # retrieved from db
obj.destroy # cache for obj cleared
obj = MemStore.get(DBObject, "523abc757b0059153f000091") # raies Mongoid::Errors::DocumentNotFound
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment