WordPress Object Cache Redis: Tăng Tốc Website Production Và Giảm Tải Database

WordPress Object Cache Redis là một trong những cách tối ưu hiệu năng đáng làm nhất khi website bắt đầu có nhiều traffic, nhiều plugin, WooCommerce, membership, LMS hoặc trang quản trị nặng. Không giống page cache chỉ lưu HTML đầu ra, object cache lưu kết quả truy vấn, options, transient và nhiều object nội bộ của WordPress để giảm số lần phải hỏi database.

Bài này đi theo hướng production: hiểu object cache là gì, khi nào nên dùng Redis, cách cài Redis trên Linux, cấu hình WordPress, kiểm tra bằng WP-CLI, đo hiệu quả, xử lý lỗi thường gặp và checklist nghiệm thu trước khi bật trên site thật.

1. Bối cảnh production: vì sao WordPress chậm dù đã có page cache?

Nhiều quản trị viên đã bật LiteSpeed Cache, Nginx FastCGI cache hoặc plugin page cache nhưng vẫn gặp các tình huống sau:

  • Trang wp-admin chậm, đặc biệt màn hình đơn hàng WooCommerce hoặc danh sách bài viết.
  • Trang động không cache HTML được vì người dùng đã đăng nhập.
  • Cron, import sản phẩm, đồng bộ API hoặc query plugin làm MySQL tăng CPU.
  • Database có nhiều query lặp lại cho options, metadata, taxonomy, user/session.

Page cache giúp khách truy cập ẩn danh rất tốt, nhưng không giải quyết toàn bộ phần truy vấn nội bộ. Đây là chỗ persistent object cache bằng Redis phát huy tác dụng.

2. Object cache trong WordPress là gì?

WordPress có một lớp cache object thông qua các hàm như wp_cache_get(), wp_cache_set(), wp_cache_delete(). Mặc định, cache này chỉ sống trong một request PHP. Nghĩa là request sau lại phải tính toán hoặc truy vấn database lại.

Khi cài Redis Object Cache drop-in wp-content/object-cache.php, dữ liệu object cache có thể được lưu bền hơn ở Redis. Request sau, PHP worker khác, thậm chí nhiều web node khác có thể đọc lại dữ liệu đã cache.

3. Khi nào nên dùng Redis Object Cache?

Nên dùng khi

  • Website có WooCommerce, membership, forum, LMS hoặc nhiều user đăng nhập.
  • wp-admin chậm vì query options/postmeta/usermeta lớn.
  • Database CPU cao nhưng web CPU còn dư.
  • Có nhiều request động không thể full-page cache.
  • Chạy multi-node WordPress cần cache chung.

Chưa chắc nên dùng khi

  • Website nhỏ, traffic thấp, database rất nhẹ.
  • Hosting shared không cho chạy Redis hoặc không cho cấu hình PHP extension.
  • Không có quyền monitor memory Redis.
  • Plugin/theme tạo cache key quá lớn hoặc không tương thích.

4. Kiến trúc khuyến nghị

Với một VPS/server đơn:

Nginx/Apache -> PHP-FPM -> WordPress
                         -> Redis local 127.0.0.1:6379
                         -> MariaDB/MySQL

Với nhiều web node:

Load Balancer
  -> Web node 1 -> Redis managed/private endpoint
  -> Web node 2 -> Redis managed/private endpoint
  -> Web node 3 -> Redis managed/private endpoint
Database riêng

Production nên đặt Redis trong private network, không mở port 6379 ra Internet.

5. Cài Redis trên Ubuntu/Debian

Cập nhật package và cài Redis:

sudo apt update
sudo apt install -y redis-server php-redis

Kiểm tra service:

systemctl status redis-server --no-pager
redis-cli ping

Output mẫu:

PONG

Nếu PHP-FPM đang chạy, restart để nhận extension Redis:

php -m | grep -i redis
sudo systemctl restart php8.2-fpm

Thay php8.2-fpm bằng phiên bản thực tế như php8.1-fpm, php8.3-fpm.

6. Cấu hình Redis an toàn tối thiểu

Mở file cấu hình:

sudo nano /etc/redis/redis.conf

Với Redis chỉ dùng local, nên có:

bind 127.0.0.1 ::1
protected-mode yes
supervised systemd
maxmemory 256mb
maxmemory-policy allkeys-lru

Giải thích nhanh:

  • bind 127.0.0.1: chỉ lắng nghe local, tránh lộ Redis ra mạng.
  • protected-mode yes: lớp bảo vệ cơ bản khi cấu hình sai.
  • maxmemory: tránh Redis ăn hết RAM server.
  • allkeys-lru: khi đầy bộ nhớ, Redis loại key ít dùng gần đây.

Restart Redis:

sudo systemctl restart redis-server
redis-cli info memory | grep -E 'used_memory_human|maxmemory_human'

7. Cài plugin Redis Object Cache

Cách đơn giản nhất là dùng plugin Redis Object Cache. Có thể cài trong wp-admin hoặc dùng WP-CLI:

cd /var/www/example.com/public
wp plugin install redis-cache --activate

Bật object cache drop-in:

wp redis enable
wp redis status

Output mẫu khi thành công:

Status: Connected
Client: PhpRedis
Drop-in: Valid
Redis: 7.x
Connection: 127.0.0.1:6379

8. Cấu hình wp-config.php cho production

Thêm trước dòng /* That's all, stop editing! */:

define('WP_REDIS_HOST', '127.0.0.1');
define('WP_REDIS_PORT', 6379);
define('WP_REDIS_DATABASE', 0);
define('WP_REDIS_PREFIX', 'sysadminskills_prod:');
define('WP_REDIS_TIMEOUT', 1);
define('WP_REDIS_READ_TIMEOUT', 1);
define('WP_CACHE_KEY_SALT', 'sysadminskills.com:');

WP_REDIS_PREFIXWP_CACHE_KEY_SALT rất quan trọng nếu nhiều website dùng chung Redis. Nếu không đặt prefix riêng, cache key có thể đụng nhau giữa staging và production.

9. Kiểm tra Redis có thực sự nhận cache key không

Trước khi bật traffic thật, kiểm tra bằng Redis CLI:

redis-cli dbsize
redis-cli --scan --pattern 'sysadminskills_prod:*' | head

Truy cập vài trang WordPress, vào wp-admin, rồi chạy lại:

redis-cli info stats | grep -E 'keyspace_hits|keyspace_misses'
redis-cli info memory | grep used_memory_human

Output mẫu:

keyspace_hits:1542
keyspace_misses:321
used_memory_human:18.73M

Số hit tăng dần là tín hiệu tốt. Tuy nhiên đừng chỉ nhìn hit/miss; hãy đo cả TTFB, query count và tải database.

10. Đo hiệu năng trước và sau

Đo HTTP latency bằng curl

curl -o /dev/null -s -w 'DNS:%{time_namelookup} Connect:%{time_connect} TTFB:%{time_starttransfer} Total:%{time_total}\n' https://example.com/

Chạy nhiều lần trước và sau khi bật Redis để tránh kết luận từ một request đơn lẻ.

Đo bằng WP-CLI profile nếu có

wp profile stage --all
wp profile hook --all --spotlight

Nếu không có package profile, bạn vẫn có thể dùng Query Monitor trong staging để xem số query và thời gian query.

Quan sát database

mysqladmin processlist
mysqladmin extended-status | grep -E 'Questions|Slow_queries|Threads_connected'

Mục tiêu là giảm query lặp lại, giảm CPU MySQL và cải thiện độ ổn định, không chỉ chạy benchmark cho đẹp.

11. Những lỗi thường gặp và cách xử lý

Lỗi: Status Not Connected

Kiểm tra Redis có chạy không:

systemctl status redis-server --no-pager
redis-cli ping

Kiểm tra PHP có extension không:

php -m | grep -i redis
php-fpm8.2 -m | grep -i redis

Nếu CLI có Redis nhưng PHP-FPM không có, restart đúng service PHP-FPM hoặc cài package cho đúng version PHP.

Lỗi: Connection refused

Thường do Redis không listen ở host/port WordPress đang dùng. Kiểm tra:

ss -ltnp | grep 6379
grep -E '^bind|^port' /etc/redis/redis.conf

Nếu Redis chạy container, cần dùng hostname/container network phù hợp thay vì 127.0.0.1.

Lỗi: Website trắng trang sau khi bật object-cache.php

Khôi phục nhanh bằng cách đổi tên drop-in:

mv wp-content/object-cache.php wp-content/object-cache.php.disabled

Sau đó kiểm tra log:

tail -n 100 /var/log/nginx/error.log
tail -n 100 /var/log/php8.2-fpm.log

Lỗi: wp-admin hiển thị dữ liệu cũ

Xóa cache:

wp cache flush
wp redis flush

Nếu lỗi lặp lại, kiểm tra plugin cache, plugin multilingual, WooCommerce session hoặc custom code dùng object cache sai cách.

12. Bảo mật Redis trong production

Redis không nên public. Checklist nhanh:

  • Không mở port 6379 ra Internet.
  • Firewall chỉ cho web node truy cập Redis.
  • Nếu dùng Redis remote, bật TLS/auth theo dịch vụ managed.
  • Đặt prefix riêng cho từng site và từng môi trường.
  • Không dùng chung Redis production với staging nếu không có database/prefix tách biệt rõ.
  • Monitor memory, eviction và connection count.

Kiểm tra port từ ngoài server bằng máy khác:

nc -vz your-server-ip 6379

Kỳ vọng production an toàn là không kết nối được từ Internet.

13. Redis memory sizing: đặt bao nhiêu là đủ?

Không có con số chung cho mọi site. Với blog vừa, 128–256MB có thể đủ. Với WooCommerce lớn, membership hoặc nhiều plugin nặng, có thể cần 512MB đến vài GB. Bắt đầu nhỏ, monitor rồi tăng dần.

redis-cli info memory
redis-cli info stats | grep evicted_keys

Nếu evicted_keys tăng quá nhanh và hit rate thấp, Redis có thể thiếu RAM hoặc key churn quá cao.

14. Quy trình triển khai an toàn

  1. Backup database và file trước khi thay đổi.
  2. Bật Redis trên staging trước.
  3. Đo baseline: TTFB, query count, CPU MySQL, memory server.
  4. Cài Redis server/managed Redis.
  5. Cài extension PHP Redis và plugin.
  6. Đặt prefix/salt riêng.
  7. Bật object cache.
  8. Kiểm tra wp-admin, checkout WooCommerce, login/logout, cron.
  9. Theo dõi log 30–60 phút đầu.
  10. Ghi lại rollback command.

15. Checklist nghiệm thu

  • wp redis status báo Connected.
  • wp-content/object-cache.php tồn tại và hợp lệ.
  • Redis không public ra Internet.
  • WP_REDIS_PREFIX hoặc WP_CACHE_KEY_SALT đã đặt riêng.
  • Memory Redis không tăng vô hạn.
  • Không có PHP fatal error trong log.
  • wp-admin, login, search, comment, checkout hoạt động bình thường.
  • TTFB hoặc tải database cải thiện có số liệu so sánh.
  • Có rollback: wp redis disable hoặc đổi tên object-cache.php.

16. Lab cuối bài

Dựng một site WordPress lab trên VPS hoặc local Docker, sau đó thực hiện:

  1. Cài Redis và plugin Redis Object Cache.
  2. Đặt prefix riêng trong wp-config.php.
  3. Dùng curl đo TTFB 10 lần trước/sau.
  4. Dùng redis-cli info stats quan sát hit/miss.
  5. Giả lập rollback bằng wp redis disable, kiểm tra site vẫn chạy.

Nếu bạn quản trị WordPress production, Redis Object Cache không phải “thuốc thần”, nhưng là một mảnh ghép rất đáng có khi đi cùng page cache, database indexing, PHP-FPM tuning và monitoring nghiêm túc.

Tác giả: Mạnh Hoàng

Tôi là Hoàng Mạnh, người sáng lập blog SysadminSkills.com. Tôi viết về quản trị hệ thống, bảo mật máy chủ, DevOps và cách ứng dụng AI để tự động hóa công việc IT. Blog này là nơi tôi chia sẻ những gì đã học được từ thực tế – đơn giản, ngắn gọn và áp dụng được ngay.