Theo bài trước chúng ta đã tìm hiểu về [Magento 2] Mode là gì? Phân biệt các Mode (Lập trình Magento cơ bản). Bài viết này mình sẽ xoay quanh về chủ: đề Cache là gì? Cách thức hoạt động của Cache trong Magento. Và giải thích chi tiết nhất có thể cho các bạn nắm vì đây là kiến thức quan trọng trong quá trình các bạn làm và tối ưu hoá website Magento nhé!
Cache là gì?
Cache là một kỹ thuật được sử dụng để tăng tốc độ truy cập dữ liệu trong các ứng dụng máy tính. Khi một ứng dụng yêu cầu dữ liệu từ bộ nhớ hoặc cơ sở dữ liệu, thay vì truy cập trực tiếp vào nguồn dữ liệu này, ứng dụng sẽ lưu trữ một bản sao tạm thời của dữ liệu này trong bộ nhớ cache của nó. Khi ứng dụng yêu cầu dữ liệu này lần nữa, nó sẽ được truy xuất từ bộ nhớ cache thay vì phải truy cập lại nguồn dữ liệu ban đầu. Điều này giúp giảm thời gian truy cập dữ liệu và tăng tốc độ ứng dụng.
Cache có thể được áp dụng trong nhiều lĩnh vực khác nhau của máy tính, bao gồm lưu trữ đệm (buffer cache), bộ nhớ đệm (memory cache), bộ đệm trang web (web cache), và cache truy vấn (query cache). Các ứng dụng phổ biến sử dụng cache bao gồm các trình duyệt web, hệ thống quản lý cơ sở dữ liệu, các ứng dụng máy chủ và ứng dụng di động.
Phân loại cấp độ cache trong Magento 2
Có 3 cấp độ:
- Cache hệ thống: Là cache mặc định của Magento, được lưu trữ trong bộ nhớ và được sử dụng để lưu trữ các giá trị như cấu hình hệ thống, truy vấn CSDL, các đối tượng, các giá trị tạm thời, vv.
- Cache trang: Lưu trữ các thông tin liên quan đến các trang web cụ thể, bao gồm các khối dữ liệu, các bảng phân vùng, các ảnh, các tệp CSS và JavaScript, vv. Các trang web được cache lại trên các máy chủ, cho phép truy cập nhanh hơn và giảm tải cho máy chủ.
- Cache khối: Lưu trữ các thông tin liên quan đến các khối cụ thể trên trang web, bao gồm các danh mục sản phẩm, các sản phẩm, các chức năng tìm kiếm, vv. Các khối được cache lại trên các máy chủ, giúp tăng tốc độ truy cập và giảm tải cho máy chủ.
Để cấu hình cache trong Magento 2, bạn có thể sử dụng trình quản lý cache được tích hợp sẵn trong Magento Admin hoặc thông qua các tập tin cấu hình. Các tùy chọn cấu hình cache bao gồm việc bật/tắt cache hệ thống, cấu hình các giá trị cache tối đa, và chọn loại cache sử dụng.
Ngoài ra, Magento cũng hỗ trợ nhiều loại cache khác nhau, bao gồm các loại cache file, cache Redis và cache Memcached. Bạn có thể cấu hình các loại cache này trong tệp cấu hình hoặc thông qua các trình quản lý cache bên thứ ba.
Cache hệ thống (System Cache)
Cache hệ thống Magento bao gồm:
- Page Cache: Lưu trữ phiên bản được tạo sẵn của các trang web để giảm thiểu tải cho máy chủ và giảm thời gian tải trang. Khi một trang web được truy cập, nếu nó đã được lưu trữ trong bộ nhớ cache và trả về phiên bản được lưu trữ thay vì phải tạo lại trang.
- Block Cache: Lưu trữ kết quả tính toán của các khối (blocks) được sử dụng để hiển thị thông tin trên trang web. Khi một khối được yêu cầu để hiển thị, kiểm tra xem kết quả tính toán của khối đã được lưu trữ trong bộ nhớ cache hay chưa. Nếu đã có, thì sẽ trả về kết quả tính toán đã được lưu trữ thay vì tính toán lại.
- Metadata Cache: Lưu trữ thông tin về các thay đổi trong cấu trúc dữ liệu của Magento 2 để giúp kiểm tra xem các bản ghi dữ liệu đã cũ hay chưa.
- Configuration Cache: Lưu trữ thông tin về cấu hình của Magento 2 để giảm thiểu thời gian tải cấu hình từ cơ sở dữ liệu.
- Session Cache: Lưu trữ phiên của người dùng để giảm thiểu thời gian tải phiên của người dùng từ cơ sở dữ liệu.
Cache trang (Page Cache)
Cache trang trong Magento không được cấu hình tốt, có thể dẫn đến một số vấn đề như:
- Tăng thời gian phản hồi của trang: Khi cache trang không được cấu hình đúng, Magento sẽ phải tải lại các trang từ cơ sở dữ liệu, điều này sẽ tăng thời gian phản hồi của trang.
- Giảm hiệu suất của trang: Khi cache trang không được cấu hình tốt, Magento sẽ phải tính toán lại các dữ liệu mỗi khi trang được yêu cầu, điều này sẽ làm giảm hiệu suất của trang.
- Tăng tải cho máy chủ: Khi cache trang không được cấu hình đúng, Magento sẽ phải tải lại các trang từ cơ sở dữ liệu, điều này sẽ tăng tải cho máy chủ và có thể dẫn đến việc máy chủ không đủ tài nguyên để phục vụ yêu cầu.
Để cấu hình cache trang, có thể thực hiện các bước sau:
- Bật Page Cache: Để bật Page Cache, có thể truy cập vào phần System > Cache Management > Page Cache. Chọn Enable và lưu lại cấu hình.
- Tăng thời gian sống của cache: Có thể tăng thời gian sống của cache bằng cách truy cập vào phần System > Cache Management > Page Cache và sửa đổi giá trị của Time to Live.
- Sử dụng các hệ thống cache bên thứ ba: Magento 2 hỗ trợ sử dụng các hệ thống cache bên thứ ba như Redis hoặc Memcached để tăng tốc độ truy cập dữ liệu.
- Tối ưu hóa trang: Có thể tối ưu hóa trang bằng cách loại bỏ các yếu tố không cần thiết, tối ưu hóa hình ảnh, tối ưu hóa cấu trúc CSS và JavaScript.
- Sử dụng CDN: Sử dụng CDN (Content Delivery Network) để giảm tải cho máy chủ và tăng tốc độ tải trang.
Cache khối (Block Cache)
Cache khối là một trong những tính năng quan trọng của Magento 2, giúp tăng tốc độ hiển thị các khối trên trang web của bạn. Khi một khối được cache, Magento 2 sẽ lưu trữ phiên bản của khối đó trong bộ nhớ cache để sử dụng cho các yêu cầu tương lai thay vì phải tính toán lại dữ liệu từ đầu. Việc sử dụng cache khối sẽ giảm tải cho máy chủ của bạn, giảm thời gian phản hồi và cải thiện hiệu suất của trang web.
Phân loại cache khối
Có 2 loại cách khối:
- FPC (Full Page Cache): FPC là tính năng cache toàn bộ trang, bao gồm tất cả các khối trên trang. Khi một trang được cache bởi FPC, toàn bộ trang sẽ được lưu trữ trong bộ nhớ cache để sử dụng cho các yêu cầu tương lai. FPC có thể được kích hoạt bằng cách vào phần Stores > Configuration > Advanced > System > Full Page Cache.
- Cache Khối (Cache Block): Cache khối là tính năng cache các khối riêng lẻ trên trang, thay vì cache toàn bộ trang. Khi một khối được cache bởi Cache Khối, chỉ khối đó sẽ được lưu trữ trong bộ nhớ cache để sử dụng cho các yêu cầu tương lai. Cache Khối có thể được kích hoạt bằng cách vào phần Stores > Configuration > Advanced > System > Cache Management.
Hướng dẫn tạo cache tuỳ chỉnh (Custom Cache)
Bước 1: Tạo một file di chuyển tới thư mục /app/code
và tạo thư mục của module của bạn theo cấu trúc như sau: VendorName/ModuleName
mkdir -p app/code/VendorName/ModuleName
Bước 2: Tạo file registration.php trong thư mục của module app/code/VendorName/ModuleName/registration.php
và nhập mã sau đây:
<?php
\Magento\Framework\Component\ComponentRegistrar::register(
\Magento\Framework\Component\ComponentRegistrar::MODULE,
'VendorName_ModuleName',
__DIR__
);
Bước 3: Tạo file module.xml trong thư mục của module app/code/VendorName/ModuleName/etc/module.xml
và nhập mã sau đây:
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="urn:magento:framework:Module/etc/module.xsd">
<module name="VendorName_ModuleName" setup_version="1.0.0"/>
</config>
Bước 4: Tạo file cache.xml trong thư mục của module app/code/VendorName/ModuleName/etc/cache.xml
và nhập mã sau đây:
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Cache:etc/cache.xsd">
<type name="vendorname_modulename">
<frontend_model>VendorName\ModuleName\Model\Cache\Type</frontend_model>
<backend_model>Magento\Cache\Backend\File</backend_model>
<frontend_class>VendorName\ModuleName\Cache\Frontend</frontend_class>
<backend_class>Magento\Cache\Backend\File</backend_class>
<group>vendornamemodulename</group>
<options>
<option name="cache_dir" xsi:type="string">vendornamemodulename</option>
<option name="hashed_directory_level" xsi:type="number">2</option>
</options>
</type>
</config>
Bước 5: Tạo class VendorName\ModuleName\Model\Cache\Type
trong thư mục của module app/code/VendorName/ModuleName/Model/Cache/Type.php
và nhập mã sau đây:
<?php
namespace VendorName\ModuleName\Model\Cache;
class Type extends \Magento\Framework\Cache\Frontend\Decorator\TagScope
{
const TYPE_IDENTIFIER = 'vendorname_modulename';
const CACHE_TAG = 'VENDORNAMEMODULENAME';
public function __construct(
\Magento\Framework\App\Cache\Type\FrontendPool $cacheFrontendPool
) {
parent::__construct($cacheFrontendPool->get(self::TYPE_IDENTIFIER), self::CACHE_TAG);
}
}
Bước 6: Tạo class VendorName\ModuleName\Cache\Frontend
trong thư mục của module app/code/VendorName/ModuleName/Cache/Frontend.php
và nhập mã sau đây:
<?php
namespace VendorName\ModuleName\Cache;
class Frontend extends \Magento\Framework\Cache\Frontend\Decorator\TagScope
{
const TYPE_IDENTIFIER = 'vendorname_modulename';
const CACHE_TAG = 'VENDORNAMEMODULENAME';
public function __construct(
\Magento\Framework\App\Cache\Type\FrontendPool $cacheFrontendPool,
$options = []
) {
parent::__construct($cacheFrontendPool->get(self::TYPE_IDENTIFIER), self::CACHE_TAG, $options);
}
}
Bước 7: Cuối cùng, bạn cần chạy các lệnh sau để cài đặt module của bạn và xóa bộ nhớ cache của Magento:
bin/magento module:enable VendorName_ModuleName
bin/magento setup:upgrade
bin/magento cache:clean
Sau khi thực hiện các bước này, bạn có thể sử dụng custom cache của mình trong Magento 2 bằng cách gọi class MyCustomCache
trong constructor của class bạn muốn sử dụng cache:
<?php
namespace VendorName\ModuleName\Model;
use VendorName\ModuleName\Cache\MyCustomCache;
class MyModel
{
protected $cache;
public function __construct(MyCustomCache $cache)
{
$this->cache = $cache;
}
public function myMethod()
{
$cacheKey = 'my_cache_key';
$cacheData = $this->cache->load($cacheKey);
if ($cacheData === false) {
// Do something to generate cache data
$cacheData = 'Cache data goes here';
$this->cache->save($cacheData, $cacheKey);
}
// Return cache data
return $cacheData;
}
}
Trong ví dụ trên, chúng ta sử dụng class MyCustomCache
để tạo và lưu trữ cache dựa trên một cache key. Nếu dữ liệu cache không tồn tại trong cache của Magento, chúng ta thực hiện các tính toán cần thiết để tạo dữ liệu mới, sau đó lưu dữ liệu đó vào cache với cache key tương ứng.
Khi chúng ta gọi phương thức load()
của cache, Magento sẽ tìm kiếm dữ liệu cache dựa trên cache key và trả về dữ liệu đó nếu nó tồn tại. Nếu không, phương thức load()
sẽ trả về giá trị false
.
Khi chúng ta gọi phương thức save()
của cache, Magento sẽ lưu trữ dữ liệu mới vào cache với cache key tương ứng.
Với custom cache của bạn, bạn có thể tùy chỉnh các phương thức khác của cache để đáp ứng nhu cầu của ứng dụng của bạn.
Bạn có thể tùy chỉnh các phương thức của cache để đáp ứng nhu cầu của ứng dụng của bạn. Dưới đây là một số phương thức cache phổ biến mà bạn có thể tùy chỉnh trong custom cache của mình:
load($id)
: Phương thức này được sử dụng để tìm kiếm dữ liệu cache dựa trên một cache key đã cho. Nếu dữ liệu cache tồn tại, phương thức trả về dữ liệu đó. Nếu không, phương thức trả về giá trịfalse
.save($data, $id, $tags = [], $lifetime = null)
: Phương thức này được sử dụng để lưu trữ dữ liệu cache mới dựa trên một cache key đã cho. Tham số$data
chứa dữ liệu cache mới cần được lưu trữ, tham số$id
là cache key tương ứng. Tham số$tags
là một mảng các tag để gắn vào dữ liệu cache. Tham số$lifetime
là thời gian số giây mà dữ liệu cache sẽ được lưu trữ.remove($id)
: Phương thức này được sử dụng để xóa dữ liệu cache dựa trên một cache key đã cho.clean($tags = [])
: Phương thức này được sử dụng để xóa tất cả các dữ liệu cache có chứa một hoặc nhiều tag đã cho. Nếu không có tag nào được cung cấp, phương thức sẽ xóa tất cả các dữ liệu cache.flush()
: Phương thức này được sử dụng để xóa tất cả các dữ liệu cache.
Ví dụ, bạn có thể tạo phương thức getCacheKey($id)
trong class của mình để tạo cache key từ một id cụ thể và sử dụng nó để lưu trữ dữ liệu cache mới:
<?php
namespace VendorName\ModuleName\Cache;
use Magento\Framework\App\CacheInterface;
class MyCustomCache implements CacheInterface
{
protected $cache;
public function __construct(CacheInterface $cache)
{
$this->cache = $cache;
}
public function getCacheKey($id)
{
return 'my_cache_prefix_' . $id;
}
public function load($id)
{
$cacheKey = $this->getCacheKey($id);
return $this->cache->load($cacheKey);
}
public function save($data, $id, $tags = [], $lifetime = null)
{
$cacheKey = $this->getCacheKey($id);
return $this->cache->save($data, $cacheKey, $tags, $lifetime);
}
public function remove($id)
{
$cacheKey = $this->getCacheKey($id);
return $this->cache->remove($cacheKey);
}
public function clean($tags = [])
{
return $this->cache->clean($tags);
}
public function flush()
{
return $this->cache->flush();
}
}
Trong ví dụ này, class MyCustomCache
được khởi tạo với một instance của interface CacheInterface
. Phương thức getCacheKey($id)
được định nghĩa để tạo ra một cache key dựa trên id được cung cấp. Các phương thức khác của interface CacheInterface
được triển khai để lưu trữ, truy xuất và xóa dữ liệu cache dựa trên cache key được tạo ra bởi phương thức getCacheKey($id)
.
Để sử dụng custom cache này, bạn có thể tiêm nó vào các class khác trong ứng dụng của mình và sử dụng các phương thức của nó để lưu trữ và truy xuất dữ liệu cache. Ví dụ:
<?php
namespace VendorName\ModuleName\Model;
use VendorName\ModuleName\Cache\MyCustomCache;
class MyModel
{
protected $cache;
public function __construct(MyCustomCache $cache)
{
$this->cache = $cache;
}
public function getMyData($id)
{
$cacheKey = $this->cache->getCacheKey($id);
$cachedData = $this->cache->load($cacheKey);
if ($cachedData !== false) {
return $cachedData;
}
$data = $this->fetchMyData($id);
$this->cache->save($data, $cacheKey);
return $data;
}
protected function fetchMyData($id)
{
// Code to fetch data from database or external API
}
}
Trong ví dụ này, class MyModel
được khởi tạo với một instance của class MyCustomCache
. Phương thức getMyData($id)
được định nghĩa để truy xuất dữ liệu cache nếu nó đã tồn tại, hoặc lấy dữ liệu mới nếu không có trong cache và lưu trữ nó trong cache mới.
Bằng cách sử dụng custom cache của bạn, bạn có thể cải thiện hiệu suất của ứng dụng Magento 2 của mình bằng cách giảm thời gian truy xuất dữ liệu và tăng tốc độ trả về dữ liệu từ cache.
Lưu ý khi tạo custom cache
Khi tạo custom cache trong Magento 2, cần lưu ý một số điểm sau:
- Không sử dụng cache quá lớn để tránh ảnh hưởng đến hiệu suất của ứng dụng.
- Nên sử dụng các công cụ lưu trữ cache phù hợp, chẳng hạn như Redis hoặc Memcached, để lưu trữ dữ liệu cache của bạn.
- Cần đảm bảo rằng dữ liệu được lưu trữ trong cache luôn được cập nhật khi dữ liệu gốc thay đổi để tránh trả về dữ liệu cũ từ cache.
- Nên đặt tên cache key một cách hợp lý để tránh trùng lặp và đảm bảo tính duy nhất của cache key.
- Cần xác định thời gian sống của cache phù hợp để tránh lưu trữ dữ liệu cache quá lâu và trả về dữ liệu cũ từ cache.
Trong phần ví dụ ở trên, chúng ta tạo ra một custom cache bằng cách triển khai interface CacheInterface
. Tuy nhiên, Magento 2 cũng cung cấp một số class để giúp bạn tạo ra các loại cache khác nhau, chẳng hạn như File
, Database
, Redis
, và Memcached
. Bằng cách sử dụng các class này, bạn có thể nhanh chóng triển khai các loại cache phù hợp với nhu cầu của ứng dụng của mình mà không cần phải triển khai lại các phương thức của interface CacheInterface
.
Kết bài
Tóm lại, cache là một kỹ thuật thường hay sử dụng để tối ưu hoá tốc độ truyền tải dữ liệu và truy cập dữ liệu trong các ứng dụng. Và đứng như một trung gian với mục đích tăng tốc độ trải nghiệm của ứng dụng với người dùng. Hy vọng bài viết này sẽ hỗ trợ các bạn trên con đường làm việc sau này.
Ngoài ra các bạn có thể tìm hiểu nội dung tại để hiểu hơn về cách Magento phân bổ cache nhé: https://devdocs.magento.com/guides/v2.3/config-guide/cli/config-cli-subcommands-cache.html
Cảm ơn các bạn đã giành thời gian xem bài viết này, những thắc mắc hay góp ý vui lòng comment vào dưới bài viết mình sẽ hỗ trợ các bạn. Thân ái!