Active Record用Counter Cache实现计数器
经常会有遇到这样的场景:
统计页面的访问次数
如果每次访问时都直接update数据库,对于大并发场景效率太低。由于对事务要求并不高,如访问次数数据延迟几分钟并没有太大问题,每次都操作数据库显得有点浪费。
Rails中有ActiveRecord::CounterCache专门用于这个场景。
这个类用起来很简单,只有4个方法:
- (Object) decrement_counter(counter_name, id)
根据id找到行,然后对counter_name列减一, 一般用于计数器
- (Object) increment_counter(counter_name, id)
根据id找到行,然后对counter_name列加一,一般用于计数器
- (Object) reset_counters(id, *counters)
执行sql从数据库中重新读出一个或多个counter的值。一般用于手动修改counter值后。
- (Object) update_counters(id, counters)
A generic “counter updater” implementation, intended primarily to be used by increment_counter and decrement_counter, but which may also be useful on its own.
示例
# 对id=99的记录post_count减1 DiscussionBoard.decrement_counter(:post_count, 99) # 对id=99的记录post_count加1 DiscussionBoard.increment_counter(:post_count, 99) # 对id=99的记录post_count加10,comment_count减10 Post.update_counters 99, :comment_count => -10, :action_count => 10