<img src=“http://circleci.com/gh/academia-edu/cached_counts.svg?style=svg” />
A replacement for Rails’ counter caches, using memcached.
Caches counts of models in a scope or association in memcached, and keeps the cache up to date using incr/decr operations.
You might prefer this gem over Rails’ built-in counter caches when:
-
You want to cache the total number of models for a class or scope
-
You have a large association (e.g. followers of a popular figure) and want to avoid contention on a database row
-
You want your caches to occasionally expire and be refreshed to mitigate the risk of getting out of sync
-
You don’t need to use counts as part of more complex SQL queries
There are many alternatives, but this gem appears to be unique in its approach. Other gems solve the contention issue by pushing updates to a background job, which has the advantage of continuing to populate a column that can be queried via SQL, but is still more costly than our approach, while introducing a synchronization delay.
Basic usage:
class User < ActiveRecord::Base include CachedCounts has_many :followers, class_name: 'Following' #, ... scope :confirmed, ->{ where(confirmed: true) } # creates cached class method `User.confirmed_count` caches_count_where :confirmed, if: :confirmed? # creates cached instance method `user.followers_count` caches_count_of :followers end class Following < ActiveRecord::Base include CachedCounts belongs_to :followee, class_name: 'User' #, ... end
Note that CachedCounts
must be included in the counted class, but no class methods need be called there.
For full options, see docs for CachedCounts.caches_count_of
and CachedCounts.caches_count_where
.
MIT
Copyright Academia.edu
Bug reports and pull requests are welcome on GitHub at github.com/academia-edu/cached_counts