WordPress Object Cache Với 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ă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 ping

Output kỳ vọng:

PONG

Kiể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 yes

Sau đó restart:

sudo systemctl restart redis-server
redis-cli CONFIG GET maxmemory-policy

allkeys-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 status

Output 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 | head

Hit ratio tính đơn giản:

hits / (hits + misses) * 100

Ngay 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 ping

Nế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 FLUSHDB

Vớ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.
  • maxmemory và eviction policy.
  • WordPress có WP_CACHE_KEY_SALT riê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_SALT riê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 maxmemory và 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.

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.