wordpress object cache redis là một trong những cách tối ưu hiệu quả nhất cho website WordPress có nhiều plugin, WooCommerce, membership hoặc traffic tăng theo chiến dịch. Page cache giúp trả HTML nhanh cho khách chưa đăng nhập, nhưng object cache xử lý lớp sâu hơn: cache kết quả query, option, transient và object nội bộ để giảm tải MySQL/MariaDB.
Bài này đi theo bối cảnh production/lab: một VPS Linux chạy Nginx, PHP-FPM, MariaDB và WordPress. Mục tiêu là triển khai Redis object cache đúng cách, biết kiểm tra cache hit/miss, benchmark trước/sau, nhận diện lỗi thường gặp và có checklist nghiệm thu trước khi áp dụng cho website thật.
1. Object cache khác gì page cache?
Page cache lưu toàn bộ HTML của một URL. Khi khách truy cập /bai-viet-a/, web server hoặc plugin cache có thể trả HTML có sẵn mà không cần chạy WordPress. Object cache thì khác: nó lưu dữ liệu ở tầng ứng dụng, ví dụ kết quả get_option(), query posts, metadata, menu, transient API hoặc dữ liệu plugin.
- Page cache: tốt cho visitor chưa đăng nhập, trang ít cá nhân hóa.
- Object cache: hữu ích cho wp-admin, user đăng nhập, WooCommerce cart/account, query lặp lại, site nhiều option/plugin.
- Opcode cache: như OPcache, cache bytecode PHP để giảm thời gian parse/compile.
Trong production, ba lớp này nên bổ trợ nhau. Redis object cache không thay thế CDN hoặc page cache, nhưng giúp WordPress ít hỏi database hơn, nhất là khi admin dashboard chậm hoặc database CPU tăng cao.
2. Kiến trúc tham chiếu
Luồng cơ bản: Nginx nhận request, chuyển PHP request sang PHP-FPM, WordPress xử lý logic, plugin object-cache.php kết nối Redis qua TCP hoặc Unix socket. Nếu object đã có trong Redis, WordPress dùng lại. Nếu chưa có, WordPress đọc database rồi ghi kết quả vào Redis với key tương ứng.
Client → Nginx → PHP-FPM → WordPress
├─ Redis: object cache
└─ MariaDB/MySQL: dữ liệu gốc
Redis nên nằm cùng host với WordPress nếu là VPS nhỏ/trung bình, hoặc nằm trong private network nếu dùng nhiều web node. Không expose Redis trực tiếp ra Internet.
3. Chuẩn bị trước khi cài
- Backup database và thư mục
wp-content. - Biết phiên bản PHP đang chạy:
php -vvà pool PHP-FPM tương ứng. - Có quyền SSH/root hoặc sudo.
- Website đang chạy ổn trước khi tối ưu, để dễ so sánh.
- Đã bật OPcache cho PHP.
php -v
systemctl status php8.2-fpm --no-pager
mysqladmin ping
Output mong đợi: PHP trả đúng phiên bản, PHP-FPM ở trạng thái active (running), database trả mysqld is alive. Nếu nền chưa ổn, hãy xử lý trước khi thêm Redis.
4. Cài Redis server trên Ubuntu/Debian
sudo apt update
sudo apt install -y redis-server redis-tools
sudo systemctl enable --now redis-server
redis-cli ping
Nếu Redis hoạt động, lệnh cuối trả PONG. Kiểm tra cấu hình bind để Redis chỉ lắng nghe localhost hoặc mạng nội bộ đáng tin cậy:
grep -E '^(bind|protected-mode|port)' /etc/redis/redis.conf
Với một website chạy cùng host, cấu hình an toàn thường là bind 127.0.0.1 ::1, protected-mode yes, port 6379. Nếu dùng container hoặc nhiều node, ưu tiên private subnet, security group/firewall chặt và có authentication.
5. Cài extension Redis cho PHP
sudo apt install -y php-redis
php -m | grep -i redis
sudo systemctl restart php8.2-fpm
Nếu server dùng PHP 8.3 hoặc 8.1, thay tên service cho đúng. Kiểm tra PHP-FPM log nếu website báo 502 sau khi restart:
journalctl -u php8.2-fpm -n 80 --no-pager
nginx -t
sudo systemctl reload nginx
6. Bật WordPress object cache với plugin Redis
Cách dễ vận hành là dùng plugin Redis Object Cache. Cài qua wp-admin hoặc WP-CLI:
cd /var/www/example.com/htdocs
wp plugin install redis-cache --activate
wp redis enable
wp redis status
Output tốt thường có các dòng như Status: Connected, Drop-in: Valid, Redis: Connected. Drop-in wp-content/object-cache.php là thành phần giúp WordPress dùng Redis thay cho object cache runtime mặc định.
7. Cấu hình wp-config.php nên có
define('WP_REDIS_HOST', '127.0.0.1');
define('WP_REDIS_PORT', 6379);
define('WP_REDIS_DATABASE', 0);
define('WP_REDIS_PREFIX', 'prod-example-com:');
define('WP_CACHE_KEY_SALT', 'prod-example-com:');
WP_REDIS_PREFIX hoặc WP_CACHE_KEY_SALT rất quan trọng khi một Redis phục vụ nhiều website. Nếu không tách prefix, cache key có thể đụng nhau giữa các site, gây lỗi dữ liệu khó đoán.
8. Benchmark trước và sau
Đừng tối ưu bằng cảm giác. Hãy đo ít nhất ba nhóm: thời gian phản hồi, số query database và Redis hit ratio.
# HTTP benchmark nhẹ từ máy khác hoặc chính server
ab -n 200 -c 10 https://example.com/
# Xem Redis realtime
redis-cli INFO stats | egrep 'keyspace_hits|keyspace_misses'
redis-cli INFO memory | egrep 'used_memory_human|maxmemory_human'
Ví dụ output:
keyspace_hits:15420
keyspace_misses:2310
used_memory_human:96.30M
Hit ratio tính nhanh: hits / (hits + misses). Site mới bật cache sẽ có miss cao trong vài phút đầu. Sau khi warm-up, hit ratio tăng dần. Nếu miss luôn cao, có thể plugin/theme tạo key không tái sử dụng hoặc cache bị flush liên tục.
9. Cấu hình memory policy cho Redis
Redis dùng RAM. Nếu để không giới hạn trên VPS nhỏ, Redis có thể cạnh tranh RAM với PHP-FPM và MariaDB. Hãy đặt giới hạn phù hợp.
sudo redis-cli CONFIG SET maxmemory 256mb
sudo redis-cli CONFIG SET maxmemory-policy allkeys-lru
sudo redis-cli CONFIG REWRITE
allkeys-lru cho phép Redis loại bỏ key ít dùng khi đạt giới hạn. Với WordPress object cache, đây là lựa chọn thực tế hơn so với để Redis hết RAM rồi lỗi ghi cache.
10. Lỗi thường gặp và cách xử lý
Lỗi 1: wp-admin báo Redis unreachable
systemctl status redis-server --no-pager
redis-cli ping
php -m | grep -i redis
Nếu redis-cli ping không trả PONG, xử lý Redis trước. Nếu Redis OK nhưng WordPress lỗi, kiểm tra extension PHP Redis và restart đúng PHP-FPM pool.
Lỗi 2: website hiển thị dữ liệu cũ
wp redis flush
wp cache flush
redis-cli DBSIZE
Flush cache là biện pháp nhanh, nhưng cần tìm nguyên nhân: plugin không purge cache khi cập nhật, prefix trùng giữa staging/production hoặc deploy copy database nhưng không đổi salt.
Lỗi 3: Redis memory tăng liên tục
Kiểm tra key pattern và TTL. Một số plugin tạo transient/key quá nhiều. Dùng:
redis-cli --bigkeys
redis-cli INFO keyspace
redis-cli MEMORY STATS
11. Checklist nghiệm thu production
- Redis chỉ bind localhost/private IP, không public Internet.
- PHP Redis extension đã load trong đúng PHP-FPM version.
wp redis statusbáo connected và drop-in valid.- Có prefix/salt riêng cho từng website/môi trường.
- Đã đặt
maxmemoryvà eviction policy. - Homepage, bài viết, wp-admin, login/logout hoạt động bình thường.
- Benchmark trước/sau có ghi nhận latency/query giảm.
- Có runbook flush cache và rollback plugin.
12. Bài tập lab
- Dựng một WordPress lab bằng Docker hoặc VPS nhỏ.
- Đo TTFB và số query trước khi bật Redis bằng Query Monitor.
- Bật Redis object cache, reload 20 lần và ghi lại hit/miss.
- Thử đổi prefix, flush cache, tắt Redis để quan sát lỗi.
- Viết một checklist rollback 5 phút nếu production có sự cố.
Kết luận: Redis object cache không phải “nút tăng tốc thần kỳ”, nhưng khi được cấu hình đúng, nó giảm áp lực database rõ rệt và làm WordPress ổn định hơn dưới tải thật. Giá trị lớn nhất nằm ở khả năng đo lường: bạn biết cache có hoạt động, biết khi nào miss bất thường và có quy trình xử lý thay vì chỉ cài plugin rồi hy vọng website nhanh hơn.
