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.

Sơ đồ: WordPress lấy kết quả truy vấn từ Redis thay vì MariaDB

Ý 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, 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 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

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:

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 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.

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":

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 của Till Krüss. Với WP-CLI, chạy bằng user sở hữu website:

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

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.

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 và Hiệu năng và sức chứa để 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á 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.