Git Product home page Git Product logo

second_level_cache's Introduction

SecondLevelCache

Gem Version Dependency Status Build Status Code Climate

SecondLevelCache is a write-through and read-through caching library inspired by Cache Money and cache_fu, support ActiveRecord 4.

Read-Through: Queries by ID, like current_user.articles.find(params[:id]), will first look in cache store and then look in the database for the results of that query. If there is a cache miss, it will populate the cache.

Write-Through: As objects are created, updated, and deleted, all of the caches are automatically kept up-to-date and coherent.

Install

In your gem file:

gem "second_level_cache", "~> 2.1.4"

For ActiveRecord 3:

gem "second_level_cache", "~> 1.6"

Usage

For example, cache User objects:

class User < ActiveRecord::Base
  acts_as_cached(:version => 1, :expires_in => 1.week)
end

Then it will fetch cached object in this situations:

User.find(1)
user.articles.find(1)
User.where(:status => 1).find(1)
article.user

Cache key:

user = User.find 1
user.second_level_cache_key  # We will get the key looks like "slc/user/1/0"

Expires cache:

user = User.find(1)
user.expire_second_level_cache

or expires cache using class method:

User.expire_second_level_cache(1)

Disable SecondLevelCache:

User.without_second_level_cache do
  user = User.find 1
  # ...
end

Only SELECT * query will be cached:

# this query will NOT be cached
User.select("id, name").find(1)

Notice

  • SecondLevelCache cache by model name and id, so only find_one query will work.
  • Only equal conditions query WILL get cache; and SQL string query like User.where("name = 'Hooopo'").find(1) WILL NOT work.
  • SecondLevelCache sync cache after transaction commit:
# user and account's write_second_level_cache operation will invoke after the logger.
ActiveRecord::Base.transaction do
   user.save
   account.save
   Rails.logger.info "info"
end # <- Cache write 

# if you want to do something after user and account's write_second_level_cache operation, do this way:
ActiveRecord::Base.transaction do
   user.save
   account.save
end # <- Cache write 
Rails.logger.info "info"
  • If you are using SecondLevelCache with database_cleaner, you should set cleaning strategy to :truncation:
DatabaseCleaner.strategy = :truncation

Configure

In production env, we recommend to use Dalli as Rails cache store.

 config.cache_store = [:dalli_store, APP_CONFIG["memcached_host"], {:namespace => "ns", :compress => true}]

Tips:

  • When you want to clear only second level cache apart from other cache for example fragment cache in cache store, you can only change the cache_key_prefix:
SecondLevelCache.configure.cache_key_prefix = "slc1"
  • When schema of your model changed, just change the version of the speical model, avoding clear all the cache.
class User < ActiveRecord::Base
  acts_as_cached(:version => 2, :expires_in => 1.week)
end
  • It provides a great feature, not hits db when fetching record via unique key(not primary key).
# this will fetch from cache
user = User.fetch_by_uniq_keys(nick_name: "hooopo")
post = Post.fetch_by_uniq_keys(user_id: 2, slug: "foo")

# this also fetch from cache
user = User.fetch_by_uniq_keys!(nick_name: "hooopo") # this will raise `ActiveRecord::RecordNotFound` Exception when nick name not exists.
  • You can use Rails's Eager Loading feature as normal. Even better, second_level_cache will transform the IN query into a Rails.cache.multi_read operation. For example:
Answer.includes(:question).limit(10).order("id DESC").each{|answer| answer.question.title}
Answer Load (0.2ms)  SELECT `answers`.* FROM `answers` ORDER BY id DESC LIMIT 10 # Only one SQL query and one Rails.cache.read_multi fetching operation.

Details for read_multi feature.

Contributors

License

MIT License

second_level_cache's People

Contributors

hooopo avatar stopdropandrew avatar huacnlee avatar reyesyang avatar sishen avatar kenniz avatar wxianfeng avatar

Watchers

Sebastian Schkudlara avatar James Cloos avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.