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_PREFIX và WP_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
- Backup database và file trước khi thay đổi.
- Bật Redis trên staging trước.
- Đo baseline: TTFB, query count, CPU MySQL, memory server.
- Cài Redis server/managed Redis.
- Cài extension PHP Redis và plugin.
- Đặt prefix/salt riêng.
- Bật object cache.
- Kiểm tra wp-admin, checkout WooCommerce, login/logout, cron.
- Theo dõi log 30–60 phút đầu.
- Ghi lại rollback command.
15. Checklist nghiệm thu
wp redis statusbáo Connected.wp-content/object-cache.phptồn tại và hợp lệ.- Redis không public ra Internet.
WP_REDIS_PREFIXhoặcWP_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 disablehoặc đổi tênobject-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:
- Cài Redis và plugin Redis Object Cache.
- Đặt prefix riêng trong
wp-config.php. - Dùng
curlđo TTFB 10 lần trước/sau. - Dùng
redis-cli info statsquan sát hit/miss. - 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.
