WordPress Object Cache Redis là một trong những cách tăng tốc WordPress hiệu quả nhất khi website bắt đầu có nhiều truy vấn database, nhiều plugin, WooCommerce, membership hoặc traffic tăng đột biến. Page cache giúp trả HTML nhanh cho khách chưa đăng nhập; object cache giúp WordPress giảm số lần hỏi MySQL cho option, transient, query result, user meta, term meta và dữ liệu nội bộ.
Bài này đi theo hướng production: hiểu đúng object cache, chuẩn bị Redis, cấu hình plugin, đo hiệu năng trước/sau, troubleshooting lỗi thường gặp, checklist nghiệm thu và bài lab cuối bài. Mục tiêu không phải “cài plugin cho có”, mà là triển khai cache có kiểm soát, đo được và rollback được.
1. Object cache là gì và khác page cache thế nào?
WordPress có cơ chế object cache trong runtime PHP. Mỗi request có thể cache tạm kết quả truy vấn để không gọi lại database nhiều lần trong cùng request. Nhưng mặc định cache này biến mất sau khi request kết thúc.
Khi dùng persistent object cache như Redis, Memcached hoặc dịch vụ managed cache, dữ liệu cache tồn tại giữa nhiều request. Ví dụ: option siteurl, menu, term, transient hoặc query result được đọc từ Redis thay vì MySQL.
- Page cache: cache toàn bộ HTML, tốt cho khách chưa đăng nhập.
- Object cache: cache object/query nội bộ, rất hữu ích cho admin, user đăng nhập, WooCommerce, site nhiều dynamic content.
- Opcode cache: cache bytecode PHP, thường dùng OPcache.
- Browser/CDN cache: cache asset tĩnh hoặc response ở edge.
2. Khi nào nên dùng Redis object cache?
Nên cân nhắc Redis khi bạn thấy một hoặc nhiều dấu hiệu sau:
- Trang admin chậm dù page cache không liên quan.
- MySQL CPU/IO tăng cao khi traffic tăng.
- Query Monitor cho thấy số query/request lớn.
- WooCommerce hoặc membership có nhiều phiên đăng nhập.
- Site dùng nhiều plugin tạo transient hoặc option autoload.
- Cluster nhiều web node cần cache dùng chung.
Không nên bật Redis như “thuốc thần” nếu bottleneck là ảnh nặng, theme render chậm, plugin gọi API ngoài, PHP-FPM thiếu worker hoặc database chưa có index. Hãy đo trước rồi tối ưu đúng chỗ.
3. Kiến trúc production khuyến nghị
3.1. Single server
Với một VPS chạy Nginx/Apache, PHP-FPM, MySQL và WordPress, Redis có thể chạy local qua TCP 127.0.0.1:6379 hoặc Unix socket. Local đơn giản, độ trễ thấp, nhưng cần giới hạn memory để không tranh tài nguyên với MySQL.
3.2. Multi-web node
Nếu có nhiều web server, Redis nên là service riêng hoặc managed Redis. Tất cả web node trỏ vào cùng Redis, nhưng phải dùng WP_CACHE_KEY_SALT riêng cho từng site/environment để tránh đụng key.
3.3. Staging và production
Không dùng chung Redis database giữa staging và production nếu không có prefix/salt rõ ràng. Cache lẫn môi trường có thể gây lỗi khó đoán: URL sai, option cũ, transient không khớp hoặc dữ liệu plugin bị nhiễu.
4. Cài Redis trên Ubuntu/Debian
Ví dụ lab trên Ubuntu/Debian:
sudo apt update
sudo apt install -y redis-server
sudo systemctl enable --now redis-server
redis-cli pingOutput kỳ vọng:
PONGKiểm tra service và memory:
systemctl status redis-server --no-pager
redis-cli INFO memory | egrep 'used_memory_human|maxmemory_human|maxmemory_policy'Với production, đặt giới hạn memory và policy phù hợp trong /etc/redis/redis.conf:
maxmemory 256mb
maxmemory-policy allkeys-lru
bind 127.0.0.1 ::1
protected-mode yesSau đó restart:
sudo systemctl restart redis-server
redis-cli CONFIG GET maxmemory-policyallkeys-lru thường phù hợp cho cache vì Redis có thể loại bỏ key ít dùng khi đầy. Không để Redis public ra Internet.
5. Cấu hình WordPress dùng Redis Object Cache
Cách phổ biến là dùng plugin Redis Object Cache. Sau khi cài plugin, thêm cấu hình vào wp-config.php trước dòng “That’s all, stop editing”:
define('WP_CACHE', true);
define('WP_REDIS_HOST', '127.0.0.1');
define('WP_REDIS_PORT', 6379);
define('WP_CACHE_KEY_SALT', 'sysadminskills_prod_');
define('WP_REDIS_TIMEOUT', 1);
define('WP_REDIS_READ_TIMEOUT', 1);Nếu dùng Unix socket:
define('WP_REDIS_SCHEME', 'unix');
define('WP_REDIS_PATH', '/var/run/redis/redis-server.sock');Bật object cache bằng WP-CLI nếu plugin hỗ trợ:
wp plugin install redis-cache --activate
wp redis enable
wp redis statusOutput mong muốn có các dòng tương tự:
Status: Connected
Client: PhpRedis
Drop-in: Valid
Ping: PONG
6. Đo hiệu năng trước và sau
Đừng chỉ cảm nhận bằng mắt. Hãy đo các chỉ số:
- Thời gian phản hồi TTFB.
- Số query MySQL/request.
- CPU/IO MySQL.
- Redis hit ratio.
- Thời gian load wp-admin và trang dynamic.
Dùng curl đo nhanh:
curl -o /dev/null -s -w 'time_total=%{time_total} ttfb=%{time_starttransfer}
' https://example.com/Dùng Redis monitor thận trọng trong thời gian ngắn:
redis-cli INFO stats | egrep 'keyspace_hits|keyspace_misses'
redis-cli INFO commandstats | headHit ratio tính đơn giản:
hits / (hits + misses) * 100Ngay sau khi bật cache, miss cao là bình thường. Sau vài phút traffic thật, hit ratio mới có ý nghĩa.
7. Những lỗi thường gặp và cách xử lý
7.1. “Redis unreachable” hoặc “Connection refused”
Kiểm tra Redis có chạy và WordPress trỏ đúng host/port:
systemctl status redis-server --no-pager
ss -lntp | grep 6379
redis-cli -h 127.0.0.1 -p 6379 pingNếu Redis nằm ở server khác, kiểm tra firewall, security group, TLS/auth và DNS nội bộ.
7.2. Site lỗi sau khi bật cache
Tắt object cache tạm thời:
wp redis disable
wp cache flush
redis-cli FLUSHDBVới production lớn, tránh FLUSHALL vì có thể xóa cache của service khác. Chỉ flush database/prefix liên quan.
7.3. Dữ liệu cũ không cập nhật
Nguyên nhân thường là plugin cache sai key, transient quá lâu hoặc cache group không tương thích. Hãy purge object cache, cập nhật plugin, kiểm tra plugin thương mại có khuyến nghị exclude group không.
7.4. Redis dùng quá nhiều RAM
Kiểm tra key lớn:
redis-cli --bigkeys
redis-cli INFO memoryĐặt maxmemory, chọn eviction policy và tìm plugin tạo transient khổng lồ.
7.5. Multi-site hoặc nhiều site chung Redis bị lẫn dữ liệu
Thiếu WP_CACHE_KEY_SALT là lỗi kinh điển. Mỗi site/environment cần salt riêng, ví dụ clientA_prod_, clientA_staging_.
8. Bảo mật Redis trong môi trường WordPress
- Không expose Redis ra Internet.
- Bind localhost hoặc mạng private.
- Dùng firewall/security group chặn truy cập ngoài web node.
- Nếu Redis remote, cân nhắc AUTH/TLS hoặc managed Redis có encryption.
- Không lưu session/secret nhạy cảm chung DB cache nếu chưa hiểu plugin đang làm gì.
- Giám sát memory, connection, eviction và restart bất thường.
9. Checklist nghiệm thu triển khai
- Đã backup trước khi thay đổi.
- Redis chỉ lắng nghe localhost/private network, không public.
- Có
maxmemoryvà eviction policy. - WordPress có
WP_CACHE_KEY_SALTriêng cho production. - Plugin Redis báo connected/drop-in valid.
- Đã đo TTFB, query count hoặc wp-admin trước/sau.
- Đã test đăng nhập, cập nhật bài viết, giỏ hàng/checkout nếu có WooCommerce.
- Có lệnh rollback: disable plugin/drop-in, flush cache, restart PHP-FPM nếu cần.
- Có monitoring Redis memory, hit/miss, evicted_keys và service uptime.
10. Bài lab cuối bài
Dựng một WordPress lab và thực hiện:
- Cài Redis local và plugin Redis Object Cache.
- Đặt
WP_CACHE_KEY_SALTriêng. - Dùng Query Monitor ghi lại số query trước khi bật cache.
- Bật Redis, truy cập 10 lần cùng một trang và đo hit/miss.
- Flush cache, quan sát miss tăng rồi hit tăng lại.
- Giới hạn Redis
maxmemoryvà xem eviction hoạt động. - Viết runbook rollback trong 5 dòng cho team vận hành.
Kết luận
WordPress Object Cache Redis là lớp tối ưu đáng giá cho website production, đặc biệt khi database bắt đầu thành bottleneck hoặc site có nhiều nội dung động. Triển khai đúng cần ba thứ: hiểu cache đang giải quyết vấn đề gì, cấu hình Redis an toàn, và đo hiệu năng trước/sau. Khi có checklist nghiệm thu và rollback rõ ràng, Redis không chỉ làm WordPress nhanh hơn mà còn giúp hệ thống ổn định hơn dưới tải thật.
