# Redis object cache cho WordPress: khi nào cần và cài thế nào

> Redis object cache WordPress là gì, khác page cache ra sao, khi nào thật sự giúp website nhanh hơn, và cách cài an toàn trên VPS Ubuntu, Debian hoặc ZoPanel.

Source: https://zopanel.net/vi/blog/wordpress-redis-object-cache  
Updated: 2026-10-21

## Ý chính

- Object cache mặc định của WordPress chỉ sống trong một request; Redis giữ nó giữa các request.
- Page cache phục vụ khách chưa đăng nhập, còn Redis object cache giúp wp-admin, WooCommerce và người dùng đã đăng nhập.
- Hãy đặt maxmemory và maxmemory-policy allkeys-lru, vì mặc định Redis không tự xoá key khi đầy.
- Trên server dùng chung, mỗi website cần tiền tố key và mật khẩu Redis riêng.

**Redis object cache cho WordPress** lưu kết quả truy vấn database, option và transient trong Redis, để các request sau lấy lại từ RAM thay vì hỏi lại MariaDB. Nó giúp nhiều nhất ở những trang không thể dùng page cache: wp-admin, giỏ hàng và thanh toán WooCommerce, trang thành viên, người dùng đã đăng nhập. Với một website giới thiệu ít tương tác đã bật page cache, lợi ích thường nhỏ.

Bài viết giải thích object cache hoạt động thế nào, phân biệt với page cache, khi nào nên dùng, cách cài thủ công trên Ubuntu 24.04 hoặc Debian 12, cách bật trên ZoPanel, và những lỗi cấu hình hay gặp.

## Object cache trong WordPress là gì?

WordPress có sẵn một lớp cache đối tượng (`WP_Object_Cache`). Mỗi khi cần một option, một bài viết hay metadata của người dùng, WordPress hỏi object cache trước; nếu chưa có thì truy vấn database rồi lưu lại.

Vấn đề là cache mặc định **không bền**. Theo [tài liệu của WordPress](https://developer.wordpress.org/reference/classes/wp_object_cache/), dữ liệu chỉ nằm trong bộ nhớ trong suốt một request. Request tiếp theo bắt đầu lại từ đầu và chạy lại các truy vấn đó.

Persistent object cache thay lớp này bằng một drop-in `wp-content/object-cache.php` kết nối tới Redis (hoặc Memcached). Dữ liệu được giữ giữa các request và giữa các PHP worker. Thêm một điểm ít người để ý: khi có persistent object cache, transient của plugin được lưu trong Redis thay vì bảng `wp_options`, nên bảng này không phình ra vì transient hết hạn.

Từ WordPress 6.1, trang **Tình trạng website** (Site Health) có thể gợi ý dùng persistent object cache khi thấy website đủ lớn để hưởng lợi.

## Page cache và object cache khác nhau thế nào?

| | Page cache | Redis object cache |
|---|---|---|
| Lưu gì | Nguyên trang HTML đã dựng | Kết quả truy vấn, option, transient |
| PHP có chạy không | Không, web server trả thẳng | Có, nhưng ít truy vấn database hơn |
| Phục vụ ai | Khách chưa đăng nhập | Mọi request, kể cả wp-admin và người đã đăng nhập |
| Giỏ hàng, thanh toán | Phải bỏ qua | Có tác dụng |
| Mức tăng tốc | Rất lớn với trang cache được | Vừa phải, tuỳ website nặng truy vấn đến đâu |

Hai loại cache bổ sung cho nhau, không thay thế nhau. Thứ tự hợp lý là bật page cache trước, vì đó là thay đổi lớn nhất (bài [VPS 4 GB chạy được bao nhiêu website WordPress](/vi/blog/how-many-wordpress-sites-4gb-vps) cho thấy sức chứa tăng 2,5 đến 4 lần khi có page cache), rồi thêm Redis cho phần không cache được.

## Khi nào nên dùng Redis object cache?

Nên dùng khi:

- **Cửa hàng WooCommerce**: giỏ hàng, thanh toán, tài khoản khách và trang quản lý đơn hàng đều bỏ qua page cache.
- **Website thành viên, khoá học, diễn đàn** có nhiều người đăng nhập.
- **wp-admin chậm** vì plugin nặng truy vấn, nhiều biên tập viên làm việc cùng lúc.
- **Plugin dùng nhiều transient**, ví dụ plugin SEO, plugin thống kê, plugin gọi API ngoài.

Lợi ích nhỏ hoặc không đáng khi:

- Website giới thiệu, blog ít bình luận, đã có page cache: gần như mọi lượt xem đã không chạy PHP.
- Server rất thiếu RAM: Redis cần bộ nhớ riêng, và một bộ cache quá nhỏ bị xoá liên tục thì hiệu quả thấp.
- Truy vấn chậm vì thiếu index hoặc plugin viết kém: cache che triệu chứng, nhưng lần miss đầu tiên vẫn chậm.

Cách kiểm tra nhanh: cài plugin Query Monitor trên bản staging, mở vài trang wp-admin và trang giỏ hàng, xem số truy vấn và thời gian database. Nếu mỗi trang chạy hàng trăm truy vấn lặp lại, Redis sẽ giúp rõ rệt.

## Cài Redis object cache thủ công trên Ubuntu hoặc Debian

Các bước dưới đây dành cho VPS chạy một hoặc vài website của chính bạn, PHP-FPM có sẵn.

### Bước 1: cài Redis và extension PHP

```bash
sudo apt update
sudo apt install redis-server php-redis
```

Trên Ubuntu 24.04, PHP mặc định là 8.3; trên Debian 12 là 8.2. Nếu bạn dùng PHP từ kho khác, cài đúng gói extension cho phiên bản đó, ví dụ `php8.3-redis`.

### Bước 2: giới hạn bộ nhớ và chọn chính sách xoá key

Mở `/etc/redis/redis.conf` và đặt:

```conf
bind 127.0.0.1 -::1
maxmemory 256mb
maxmemory-policy allkeys-lru
requirepass DOI_THANH_MAT_KHAU_DAI_NGAU_NHIEN
```

Điểm quan trọng nhất là `maxmemory-policy`. Mặc định Redis dùng `noeviction`: khi đầy, nó **từ chối ghi** thay vì xoá key cũ. [Tài liệu Redis về eviction](https://redis.io/docs/latest/develop/reference/eviction/) khuyên `allkeys-lru` làm mặc định cho cache, vì nó xoá key ít dùng nhất. 128–256 MB thường đủ cho một vài website WordPress; hãy theo dõi rồi điều chỉnh.

Vì đây là cache, bạn có thể tắt ghi snapshot ra đĩa để đỡ I/O bằng cách đặt `save ""`. Mất dữ liệu cache khi khởi động lại là chấp nhận được.

Không bao giờ mở cổng 6379 ra internet. Giữ `bind` ở localhost và không thêm rule tường lửa cho cổng này.

```bash
sudo systemctl restart redis-server
sudo systemctl restart php8.3-fpm     # Debian 12: php8.2-fpm
```

### Bước 3: cấu hình wp-config.php

Thêm vào `wp-config.php`, **phía trên** dòng "That's all, stop editing":

```php
define( 'WP_REDIS_HOST', '127.0.0.1' );
define( 'WP_REDIS_PORT', 6379 );
define( 'WP_REDIS_PASSWORD', 'DOI_THANH_MAT_KHAU_DAI_NGAU_NHIEN' );
define( 'WP_REDIS_PREFIX', 'shop1:' );
define( 'WP_REDIS_MAXTTL', 86400 );
```

`WP_REDIS_PREFIX` bắt buộc phải khác nhau nếu nhiều website dùng chung một Redis, nếu không website này sẽ đọc nhầm cache của website kia. `WP_REDIS_MAXTTL` đặt thời gian sống tối đa (giây) cho key, tránh cache tồn tại mãi.

### Bước 4: cài plugin và bật drop-in

Plugin phổ biến nhất là [Redis Object Cache](https://wordpress.org/plugins/redis-cache/) của Till Krüss. Với WP-CLI, chạy bằng user sở hữu website:

```bash
wp plugin install redis-cache --activate
wp redis enable      # chép drop-in object-cache.php vào wp-content
wp redis status      # kiểm tra trạng thái kết nối
```

### Bước 5: kiểm tra cache có hiệu quả không

```bash
export REDISCLI_AUTH='DOI_THANH_MAT_KHAU_DAI_NGAU_NHIEN'
redis-cli INFO stats | grep -E 'keyspace_(hits|misses)|evicted_keys'
redis-cli INFO memory | grep used_memory_human
```

Tỷ lệ hit = `keyspace_hits / (keyspace_hits + keyspace_misses)`. Sau khi website chạy ổn định một thời gian, tỷ lệ này nên cao. Nếu `evicted_keys` tăng nhanh, Redis đang thiếu bộ nhớ: tăng `maxmemory` hoặc giảm `WP_REDIS_MAXTTL`.

## Một Redis cho nhiều khách hàng: chuyện bảo mật

Trên server shared hosting, một Redis chung cho mọi website là rủi ro thật. Không có kiểm soát, website của khách A có thể đọc, ghi hoặc xoá cache của khách B, kể cả dữ liệu phiên làm việc nếu plugin lưu vào đó. Một lệnh `FLUSHALL` là xoá cache của tất cả mọi người.

Các cách tách biệt, từ yếu đến mạnh:

1. **Chỉ dùng tiền tố khác nhau.** Tránh đụng key do vô tình, nhưng không ngăn ai cố tình đọc key của người khác.
2. **Số database khác nhau (0–15).** Vẫn cùng mật khẩu, và chỉ có 16 database.
3. **Redis ACL (Redis 6 trở lên).** Mỗi website một user với mật khẩu riêng, chỉ được truy cập key có tiền tố của mình, không được chạy lệnh quản trị. Plugin Redis Object Cache hỗ trợ ACL bằng cách truyền `WP_REDIS_PASSWORD` dạng `['user', 'password']`.
4. **Một tiến trình Redis riêng cho mỗi tài khoản.** Cách ly mạnh nhất nhưng tốn RAM.

Nếu bạn bán hosting, tối thiểu phải ở mức 3.

## Bật Redis object cache trên ZoPanel

ZoPanel làm sẵn phần cách ly ở trên. Các bước:

1. **Quản trị viên cài Redis một lần**: vào **Cơ sở dữ liệu**, thẻ **Máy chủ cơ sở dữ liệu**, hoặc trang **Thành phần**. Mỗi engine database đều tốn RAM, nên chỉ cài khi khách thật sự cần.
2. **Mở website → tab PHP & cấu hình → Redis object cache** và bật. ZoPanel tạo một database Redis riêng cho website và cấu hình plugin Redis Object Cache.
3. **Bật page cache** trong cùng tab nếu chưa bật, để khách chưa đăng nhập được phục vụ thẳng từ nginx.

Mỗi database Redis trong ZoPanel có namespace key riêng và mật khẩu riêng. Key phải bắt đầu bằng tiền tố namespace (ví dụ `alice_cache:`); key khác và lệnh quản trị đều bị chặn, nên một khách không thể đọc hay xoá cache của khách khác. Chi tiết trong [tài liệu Cơ sở dữ liệu](/vi/docs/databases).

Khi cần xoá cache, vào tab **WordPress**, thẻ **Vận hành**, bấm **Xoá cache**: lệnh này chạy `wp cache flush` và xoá mọi transient. Xem thêm [WordPress Toolkit](/vi/docs/wordpress) và [Hiệu năng và sức chứa](/vi/docs/performance) để biết page cache, Redis và PHP ngủ khi rảnh phối hợp ra sao.

Lưu ý: dữ liệu Redis không được export hay sao lưu. Điều này đúng với bản chất cache, nhưng có nghĩa bạn không bao giờ nên để plugin lưu dữ liệu duy nhất (đơn hàng, cài đặt) chỉ trong Redis.

## Những lỗi hay gặp với Redis object cache WordPress

1. **Không đặt `maxmemory`.** Redis dùng RAM tới khi server thiếu bộ nhớ, hoặc với `noeviction` thì bắt đầu báo lỗi ghi.
2. **Hai website cùng tiền tố.** Website hiển thị tiêu đề, menu hay cài đặt của website kia. Triệu chứng rất khó hiểu nếu không nghĩ tới cache.
3. **Sửa database trực tiếp rồi không xoá cache.** Đổi URL hay option bằng SQL, website vẫn đọc giá trị cũ từ Redis. Luôn chạy `wp cache flush` sau thao tác trực tiếp trên database, hoặc dùng `wp search-replace` vốn đi qua WordPress.
4. **Gỡ Redis mà không tắt drop-in.** Chạy `wp redis disable` trước khi gỡ Redis hay chuyển website sang server khác không có Redis.
5. **Mở Redis ra internet.** Redis không mật khẩu ở cổng công khai là mục tiêu quét tự động thường xuyên.
6. **Kỳ vọng Redis thay page cache.** Với khách chưa đăng nhập, page cache vẫn nhanh hơn nhiều.

## Kết luận

Redis object cache không phải nút "tăng tốc" cho mọi website WordPress. Nó đáng giá ở nơi page cache không với tới: wp-admin, WooCommerce, website thành viên. Hãy bật page cache trước, đo số truy vấn, rồi thêm Redis với giới hạn bộ nhớ, `allkeys-lru` và tiền tố riêng cho từng website. Trên server nhiều khách, cách ly key và mật khẩu theo tài khoản là bắt buộc.

Trên ZoPanel, cả page cache lẫn Redis object cache đều bật bằng một công tắc trong tab **PHP & cấu hình**, có trên gói Free (3 tài khoản hosting, 10 website, 10 database). Xem [bảng giá](/vi/pricing) khi bạn cần nhiều website hơn.

## Câu hỏi thường gặp

### Redis object cache có làm WordPress nhanh hơn không?

Có, ở các trang chạy PHP và truy vấn database nhiều: wp-admin, WooCommerce, trang thành viên. Với khách chưa đăng nhập trên website đã bật page cache, PHP gần như không chạy nên Redis hầu như không thay đổi gì.

### Nên dùng Redis hay Memcached cho WordPress?

Cả hai đều dùng được làm persistent object cache. Redis phổ biến hơn trong hệ sinh thái WordPress, có ACL để tách quyền theo website và có plugin Redis Object Cache được dùng rộng rãi, nên thường là lựa chọn dễ hơn.

### Redis cần bao nhiêu RAM cho một website WordPress?

Phụ thuộc số bài viết, plugin và lượng transient. Một website bình thường thường chỉ dùng vài chục MB; hãy đặt `maxmemory` vừa phải, theo dõi `used_memory` và `evicted_keys`, rồi tăng khi thấy key bị xoá liên tục.

### Có cần cả page cache và Redis object cache không?

Với cửa hàng và website có người đăng nhập, có. Page cache phục vụ khách vãng lai mà không chạy PHP, còn Redis giảm truy vấn cho những request bắt buộc phải chạy PHP như giỏ hàng, thanh toán và wp-admin.

### Tắt Redis object cache thế nào cho an toàn?

Chạy `wp redis disable` để gỡ drop-in `object-cache.php`, sau đó mới tắt plugin hoặc gỡ Redis. Trên ZoPanel, chỉ cần tắt công tắc **Redis object cache** trong tab **PHP & cấu hình**.
