1. 程式人生 > >magento快取系列詳解:實施正確的快取策略及不同快取結構分析

magento快取系列詳解:實施正確的快取策略及不同快取結構分析

本篇文章主要介紹一下在maegnto裡cache(File System, APC, Memcached, Redis)的使用,及在不同的伺服器環境中改怎麼使用讓其效能達到最佳。


理解magento的Two-Level Caching

magento預設使用zend framework的二層快取儲存方式。就是說它使用兩層結構對cache進行配合管理,一個快的,但大小有限制的結構是一層比如APC或者Memcached ,一個比較慢的結構作為第二層比如file system.每一種儲存結構各有利弊,要不同情況不同分析使用,APC 和 Memcached 是使用 key/value來儲存cache,他們都不支援tag。File system 和Redis 支援tag. 

magento二級快取結構工作流程圖示 (Thanks to Fabrizio Branca):

magento自帶的各種後端快取介紹:
File system (var/cache)
預設情況下,Magento 將它的快取條目儲存在file系統中,在var/cache/下可檢視。這種情況很適合小型的,資料量不大的站點。但是對於大型的站點,隨著瀏覽量的不斷增多,對file的讀寫操作也將越來越多,站點也會越來越慢。magento是由tags來對cache進行組織管理的,這意味著可以對某一個cache組(相同的tag為一個group)進行操作。
優點:這是預設的,不需要裝額外的軟體
缺點:清除cache依賴於tag,通常修改某個product或處理某個order完之後,對應的前臺頁面都需要更新快取。每次更新快取時,都需要根據tag進行所有條目即file進行查詢,試想如果站點有多於1000個product,整個cache的大小將會大於50MB,大約有3500個file,你能想象到每次更新cache都要對3500個file進行查詢有多慢嗎。
小提示
1:使用

SSD替代普通硬碟
2:把var/cache接入tmpfs

----------------------------------------------------------------------------------------------------------------------------------

APC – Alternative PHP Cache (Key/Value)

APC是一個免費,開源且強健的框架用來快取和優化 PHP 的中間程式碼。
優點:相對於file cache system是很快了
缺點:不支援tag,所以依然需要file system作為slow level cache。伺服器需要安裝PHP APC 模組
小提示:確保有足夠的記憶體給APC ,可在 php.ini 中修改引數apc.shm_size

Configuration (app/etc/local.xml)

<global>
  ...
  <cache>
    <backend>apc</backend>
      <prefix>mgt_</prefix>
  </cache>
  ...
</global>
Settings for php.ini

apc.enabled = 1
apc.optimization  = 0
apc.shm_segments = 1
apc.shm_size = 768M
apc.ttl = 48000
apc.user_ttl  = 48000
apc.num_files_hint = 8096
apc.user_entries_hint = 8096
apc.mmap_file_mask = /tmp/apc.XXXXXX
apc.enable_cli = 1
apc.cache_by_default  = 1
apc.max_file_size = 10M
apc.include_once_override = 0
---------------------------------------------------------------------------------------------------------------------------
Memcached (Key/Value)
Memcache是一個高效能的分散式的記憶體物件快取系統,通過在記憶體裡維護一個統一的巨大的hash表,它能夠用來儲存各種格式的資料,包括影象、視訊、檔案以及資料庫檢索的結果等。簡單的說就是將資料呼叫到記憶體中,然後從記憶體中讀取,從而大大提高讀取速度。
優點:更快的存取速度
缺點:不支援tag,所以依然需要file system作為slow level cache
需求:1:Memcached server 2: PHP extension for memcached
Configuration (app/etc/local.xml)

<global>
...
<cache>
  <backend>memcached</backend><!-- apc / memcached / empty=file -->
  <memcached><!-- memcached cache backend related config -->
    <servers><!-- any number of server nodes can be included -->
      <server>
        <host><![CDATA[127.0.0.1]]></host>
        <port><![CDATA[11211]]></port>
        <persistent><![CDATA[1]]></persistent>
        </server>
    </servers>
    <compression><![CDATA[0]]></compression>
    <cache_dir><![CDATA[]]></cache_dir>
    <hashed_directory_level><![CDATA[]]></hashed_directory_level>
    <hashed_directory_umask><![CDATA[]]></hashed_directory_umask>
    <file_name_prefix><![CDATA[]]></file_name_prefix>
  </memcached>
</cache>
...
</global>

---------------------------------------------------------------------------------------------------------------------

Redis – Advanced key-value store with full cache tag support
magento允許我們使用redis server作為中央儲存倉庫,它支援tag的使用,所以不再需要file system作為slow level cache。在多伺服器多站點環境中,強烈推薦使用redis
,用一箇中央快取倉庫,對所有server cache進行管理。
優點:快;支援tag;已在一個日均ip為500000的站點做過測試,效能極好且穩定。
需求:1:伺服器上需要裝Redis 2:PHP 擴充套件 phpredis 需要安裝 3:Magento擴充套件“Cm_Cache_Backend_Redis”需要安裝

Installation

1. Install redis (2.4+ required)
2. Install phpredis
3. Install the magento extension “Cm_Cache_Backend_Redis”
4. Edit your app/etc/local.xml

<global>
...
<cache>
  <backend>Cm_Cache_Backend_Redis</backend>
  <backend_options>
    <server>127.0.0.1</server> <!-- or absolute path to unix socket -->
    <port>6379</port>
    <persistent></persistent>
    <database>0</database>
    <password></password>
    <force_standalone>0</force_standalone>
    <connect_retries>1</connect_retries>
    <automatic_cleaning_factor>0</automatic_cleaning_factor>
    <compress_data>1</compress_data>
    <compress_tags>1</compress_tags>
    <compress_threshold>20480</compress_threshold>
    <compression_lib>gzip</compression_lib> <!-- Supports gzip, lzf and snappy -->
  </backend_options>
</cache>
...
</global>

Useful tool for redis

phpRedisAdmin

phpRedisAdmin 是一個簡單操作介面對 Redis databases進行操作
Demo: http://dubbelboer.com/phpRedisAdmin/?overview



總結
小型站點使用APC + file system(作為slow level cache)即可,此外推薦使用SSD和把var/cache/放入tmpfs。
對於大型站點推薦使用redis, 即便cache file達到 500 MB,它依然很快,在多伺服器環境中,Redis 也是很完美的選擇。

轉載請標註jonas的magento部落格