當有資料不常去做更動,就能夠用 cache 去讀取增加速度!
- cache 處太多,程式會變複雜,增加維護的難度
- cache 會增加除錯難度,資料不再只有唯一的資料庫版本
- cache 如果沒寫好,可能會產生資料不一致的Bug、時間顯示相關的Bug(例如顯示資料的時間雖然時間不會變,但是如果是要顯示多少小時以前,就會變動了)等等
- cache 增加了寫程式的難度,像是Expire過期資料、資料的安全性(放在cache 層的資料也需要被保護注意安全)
- 會增加撰寫UI的難度,因為 cache 相關的程式可能會混在樣本中
Cache Store
- 預設的 memory_store 只適合單機開發,重啟 Rails cache 資料就不見了。
- 正式上線的網站會推薦使用
Memcached
- 它是一套Name-Value Pair(NVP)分散式記憶體快取系統,當你有多個Rails伺服器的時候,也可以很方便的共用快取資料。
Etag
ETag 是用來辨識當前的頁面是否有所改變(Rails 預設就有使用了)
第一次
- Client 發 Request
- Rails 流程
- Render body
- Create ETag
- Body & ETag included in response(
headers['ETag'] = Digest::MD5.hexdigest(body)
)
- Body & ETag included in response(
- Rails 發 Response
- 200 Success Head 裡包含 headers[‘ETag’]
- Client 接收並 caches response
第二次
- Client 發 Request 並帶著
headers['If-None-Match']
就是 Etag 但不知道為什麼要叫這名字 - Rails 流程
- Render body
- Create ETag
- Compare ETag
- If ETags match then body not included in response
- Rails 發 Response
- 304 Not Modified
- Client 接收並 reads response from cache
以上雖然就不需要再重新 response body,但是每次 request 都必須再把整個 body 去 generate 一次 ETag 這是相當沒有效率的事
所以可以透過 Customer Etag 來改善
1 2 3 4 5 6 7 8 9 10 |
|
這樣一來就只要 id 和 update_at 兩個就可以知道到底整個頁面有沒有東西變動過
memcache store uses dalli
Dalli is a high performance pure Ruby client for accessing memcached servers
- Approximately 20% faster than memcache-client.
- Provides proper failover with recovery and adjustable timeouts.
- Easier to integrate with monitoring tools like NewRelic RPM in order to track usage. 4. ThreadSafe.
Backwards compatible with the previous memcache-client API.
安裝Memcached
1
|
|
- 加上memcached的函式庫
1 2 |
|
編輯config/environments/development.rb
和production.rb
加上
1 2 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
|
使用時機
1.資料庫裡不常變動的資料,ex:所有國家
使用
1 2 3 4 5 |
|
- [self.class.name, id, :skills]這是存儲的關鍵
- cache 將會在240小時後過期
- 如果不轉 array (to_a)直接將 active-record 的 relations 儲存到 cache 的話,每次訪問 cache 這個 relations 還是會查詢資料庫的
2.某個每天需要更新的 cache 資料
1 2 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
|
參考文件
Gem
官方文件
參考文件:
- 快取
- Google Developers: HTTP 快取
- 數據緩存提升性能gem - Dalli介紹
- 如何使用 memcached 做快取
- Rails中使用memcached內存緩存技術
- 译 ~ 介绍Rails中的条件HTTP缓存
- Rails 3 和 Rails 4 中 ETags 工作原理
- 淺談memory cache
- 总结 Web 应用中常用的各种 Cache
- Rails Cache
- Speed Up Your Rails App by 66% - The Complete Guide to Rails Caching
- Accelerating Rails, Part 1: Built-in Caching
- Accelerating Rails, Part 2: Dynamic HTTP Caching
- [不是工程師] 讓網站速度飛快的秘密,你瞭解什麼是網頁快取(Cache)嗎?
- Caching with Rails: An Overview