Để duy trì hiệu xuất cho cửa hàng Magento 2 của bạn khi làm việc với các dữ liệu hiếm khi được cập nhật hoặc dữ liệu có khối lượng lớn. Chúng ta có thể lưu chúng vào bộ nhớ cache, sau đó không cần phải lần nào cũng truy cập vào database để lấy dữ liệu nữa. Thay vào đó chỉ là một câu kiểm tra, nếu dữ liệu có trong bộ nhớ cache rồi thì trả về luôn, còn ngược lại thì mới vào database để get dữ liệu ra. Nghe có vẻ cũng đơn giản phải không nào. Chúng ta hãy cùng nhau xem cách để lưu data vào bộ nhớ cache như thế nào nhé.
Cache là gì?
Bộ nhớ đệm(cache) là lớp lưu trữ dữ liệu tạm thời tốc độ cao. Trong quá trình này, các phần dữ liệu có liên quan được lưu trữ, để các yêu cầu về dữ liệu tương tự trong tương lai có thể được phục vụ nhanh hơn.
Bộ nhớ đệm giúp các ứng dụng hoạt động nhanh hơn đáng kể. Bằng cách sử dụng Bộ nhớ đệm, bạn có thể sử dụng lại các thông tin và dữ liệu cũ một cách hiệu quả. Truy xuất dữ liệu từ bộ nhớ cache nhanh hơn nhiều so với truy xuất dữ liệu trực tiếp từ Cơ sở dữ liệu.
Cache làm việc như thế nào?
Ban đầu, dữ liệu được tìm nạp từ nguồn chính của nó (ví dụ: Cơ sở dữ liệu) và được lưu trữ trong Cache. Phần dữ liệu đó có thể được truy xuất và phục vụ từ Cache thay vì được tải trực tiếp từ nguồn dữ liệu ban đầu, tức là Cơ sở dữ liệu. Khi bộ đệm được xóa hoặc làm sạch, dữ liệu mới sẽ được cập nhật trong Bộ đệm.
Tạo mới một Cache type
Tạo một file cache.xml bên trong thư mục etc trong module của bạn:
ViMagento/HelloWorld/etc/cache.xml
1 2 3 4 5 6 7 |
<?xml version="1.0"?> <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Cache/etc/cache.xsd"> <type name="vimagento_custom_cache" translate="label,description" instance="ViMagento\HelloWorld\Model\Cache\Type"> <label>ViMagento Custom Cache</label> <description>Custom Cache Storage by ViMagento</description> </type> </config> |
ViMagento/HelloWorld/Model/Cache/Type.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
<?php namespace ViMagento\HelloWorld\Model\Cache; class Type extends \Magento\Framework\Cache\Frontend\Decorator\TagScope { /** * Cache type code là tên định danh duy nhất */ const TYPE_IDENTIFIER = 'vimagento_custom_cache'; /** * Cache tag được sử dụng để phân biệt cache type với các cache khác */ const CACHE_TAG = 'VIMAGENTO_CUSTOMCACHE'; /** * @param \Magento\Framework\App\Cache\Type\FrontendPool $cacheFrontendPool */ public function __construct(\Magento\Framework\App\Cache\Type\FrontendPool $cacheFrontendPool) { parent::__construct($cacheFrontendPool->get(self::TYPE_IDENTIFIER), self::CACHE_TAG); } } |
Sau đó các bạn xóa cache của Magento và truy cập vào admin phần System > Tools > Cache Management, bạn sẽ được như hình bên dưới:

Lưu custom data vào bộ nhớ cache
Đây sẽ là phần đơn giản nhưng quan trọng trong bài viết này. Mục đích thì như đầu bài viết tôi đã nói, sẽ không cần phải lần nào cũng vào database để get data. Thay vào đó chúng ta sẽ lưu chúng vào bộ nhớ cache để lần truy cập tiếp theo chúng ta sẽ sử dụng.
Đầu tiên bạn phải khởi tạo class CacheInterface trong module của bạn nơi bạn dự định sẽ lưu data và bộ nhớ cache:
1 2 3 4 5 |
protected $cache; public function __construct(\Magento\Framework\App\CacheInterface $cache) { $this->cache = $cache; } |
Để lưu dữ liệu của bạn vào bộ nhớ cache hãy sử dụng hàm save
1 |
$this->cache->save($data, $identifier, $tags, $lifeTime); |
Trong đó:
- $data: là dữ liệu cần được lưu vào cache(phải chuyển sang dạng serialize).
- $identifier: tên định danh duy nhất không trùng lặp.
- $tags: có thể bỏ trống.
- $lifeTime: là thời gian tồn tại của cache(tính bằng giây).
Ví dụ:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
const CACHE_TAG = 'VIMAGENTO_CUSTOMCACHE'; const CUSTOM_IDENTIFIER = 'custom_cache'; protected $cache; protected $serializer public function __construct( \Magento\Framework\App\CacheInterface $cache, \Magento\Framework\Serialize\SerializerInterface $serializer ) { $this->cache = $cache; $this->serializer = $serializer; } public function save($data) { $this->cache->save($this->serializer->serialize($data), self::CUSTOM_IDENTIFIER, array(self::CACHE_TAG), 8600); } |
Lấy dữ liệu từ bộ nhớ cache
1 |
$data = $this->cache->load(self::CUSTOM_IDENTIFIER); |
Các bạn nhớ chuyển sang dạng mảng nếu data đang ở dạng serialize nhé.
Ngoài ra còn các hàm dùng để xóa dữ liệu đã được cache:
1 2 3 4 5 6 7 |
/** * Remove cached data by identifier * * @param string $identifier * @return bool */ public function remove($identifier); |
Hàm dùng để xóa cache
1 2 3 4 5 6 7 |
/** * Clean cached data by specific tag * * @param array $tags * @return bool */ public function clean($tags = []); |
Kết luận
Vừa rồi mình đã hướng dẫn cho các bạn cách tạo mới một cache type cũng như lưu custom data vào bộ nhớ cache trong Magento 2. Nếu bài viết có gì thiết sót, mọi người đừng ngại để lại một bình luận để bài viết hoàn thiện hơn nhé.