Back your WP Object Cache with Redis, a high-performance in-memory storage backend.
For sites concerned with high traffic, speed for logged-in users, or dynamic pageloads, a high-speed and persistent object cache is a must. You also need something that can scale across multiple instances of your application, so using local file caches or APC are out.
Redis is a great answer, and one we bundle on the Pantheon platform. This is our plugin for integrating with the cache, but you can use it on any self-hosted WordPress site if you have Redis. Install from WordPress.org or Github.
It’s important to note that a persistent object cache isn’t a panacea – a page load with 2,000 Redis calls can be 2 full seconds of object cache transactions. Make sure you use the object cache wisely: keep to a sensible number of keys, don’t store a huge amount of data on each key, and avoid stampeding frontend writes and deletes.
Go forth and make awesome! And, once you’ve built something great, send us feature requests (or bug reports). Take a look at the wiki for useful code snippets and other tips.
This plugin implements a variety of WP-CLI commands. All commands are grouped into the wp redis
namespace.
$ wp help redis NAME wp redis SYNOPSIS wp redis <command> SUBCOMMANDS cli Launch redis-cli using Redis configuration for WordPress debug Debug object cache hit / miss ratio for any page URL. enable Enable WP Redis by creating the symlink for object-cache.php info Provide details on the Redis connection.
Use wp help redis <command>
to learn more about each command.
See CONTRIBUTING.md for information on contributing.
This assumes you have a PHP environment with the required PhpRedis extension and a working Redis server (e.g. Pantheon). WP Redis also works with Predis via humanmade/wp-redis-predis-client.
object-cache.php
to wp-content/object-cache.php
with a symlink or by copying the file.If you’re not running on Pantheon, edit wp-config.php to add your cache credentials, e.g.:
$redis_server = array( 'host' => '127.0.0.1', 'port' => 6379, 'auth' => '12345', 'database' => 0, // Optionally use a specific numeric Redis database. Default is 0. );
If your Redis server is listening through a sockt file instead, set its path on host
parameter and change the port to null
:
$redis_server = array( 'host' => '/path/of/redis/socket-file.sock', 'port' => null, 'auth' => '12345', 'database' => 0, // Optionally use a specific numeric Redis database. Default is 0. );
Engage thrusters: you are now backing WP’s Object Cache with Redis.
wp redis
WP-CLI commands, activate the WP Redis plugin. No activation is necessary if you’re solely using the object cache drop-in.WP_CACHE_KEY_SALT
constant to define a unique salt for each install.wp_cache_add_redis_hash_groups()
, or define the WP_REDIS_USE_CACHE_GROUPS
constant to true
to enable with all groups. However, when enabled, the expiration value is not respected because expiration on group keys isn’t a feature supported by Redis.%_transient_%
) transients from the options table: wp transient delete-all
. WP Redis assumes responsibility for the transient cache.WP_REDIS_USE_RELAY
constant to true
. For support requests, please use Relay’s GitHub discussions.If you are concerned with the speed of your site, backing it with a high-performance, persistent object cache can have a huge impact. It takes load off your database, and is faster for loading all the data objects WordPress needs to run.
This plugin is for the internal application object cache. It doesn’t have anything to do with page caches. On Pantheon you do not need additional page caching, but if you are self-hosted you can use your favorite page cache plugins in conjunction with WP Redis.
A page load with 2,000 Redis calls can be 2 full seonds of object cache transactions. If a plugin you’re using is erroneously creating a huge number of cache keys, you might be able to mitigate the problem by disabling cache persistency for the plugin’s group:
wp_cache_add_non_persistent_groups( array( 'bad-actor' ) );
This declaration means use of wp_cache_set( 'foo', 'bar', 'bad-actor' );
and wp_cache_get( 'foo', 'bad-actor' );
will not use Redis, and instead fall back to WordPress’ default runtime object cache.
There’s a known issue with WordPress alloptions
cache design. Specifically, a race condition between two requests can cause the object cache to have stale values. If you think you might be impacted by this, review this GitHub issue for links to more context, including a workaround.
Please report security bugs found in the source code of the WP Redis plugin through the Patchstack Vulnerability Disclosure Program. The Patchstack team will assist you with verification, CVE assignment, and notify the developers of this plugin.
get_multiple
function [#448] (props @souptik)array_replace_recursive
and other issues [434] (props @timnolte)esc_html
in _exception_handler()
[421]wp_cache_flush_runtime
should only clear the local cache [413]flush_runtime
and flush_group
functions [#405]pantheon-wp-coding-standards
[#400]missing_redis_message
if Redis service is not connected [#391].wp_cache_supports
function [#382].wp_cache_supports
function and support features. [#378]develop
branch for PRs. [#376]WP_REDIS_USE_RELAY
constant [#344].WP_REDIS_IGNORE_GLOBAL_GROUPS
check [#333].WP_REDIS_IGNORE_GLOBAL_GROUPS
constant to prevent groups from being added to global caching group [#331].$_SERVER
in wp_redis_get_info()
[#316].wp_cache_get_multiple()
and internal cache is already primed [#292].wp_cache_get_multiple()
for WordPress 5.5 [#287].wp redis cli
by using proc_open()
directly, instead of WP_CLI::launch()
[#268].WP_REDIS_DEFAULT_EXPIRE_SECONDS
constant to set default cache expire value [#264].flushdb
instead of flushAll
to avoid flushing the entire Redis instance [#259].wp_cache_init()
for drop-ins like LudicrousDB [#231].redis-cli
.wp redis debug
to display cache hit/miss ratio for any URL; wp redis info
to display high-level Redis statistics; wp redis enable
to create the object-cache.php
symlink.$redis_server['database']
.wp_cache_add_redis_hash_groups()
, which permits registering specific groups to use Redis hashes, and is more precise than our existing WP_REDIS_USE_CACHE_GROUPS
constant.exists
call from wp_cache_get()
, which easily halves the number of Redis calls.add_action()
and $wpdb
in a safer manner for compatibility with Batcache, which loads the object cache before aforementioned APIs are available.del
instead of delete
.exists
call against Redis.wp redis-cli
, a WP-CLI command to launch redis-cli with WordPress’ Redis credentials.$wp_object_cache->add( 'foo', 'bar' )
=== wp_cache_add( 'foo', 'bar' )
.define( 'WP_REDIS_USE_CACHE_GROUPS', true );
. When enabled, WP Redis persists cache groups in a structured manner, instead of hashing the cache key and group together.$redis_server['host']
by ensuring the supplied $port
is null.INSERT IGNORE INTO
instead of INSERT INTO
to prevent SQL errors when two concurrent processes attempt to write failback flag at the same time.E_USER_WARNING
with trigger_error()
.$wpdb->options
isn’t yet initialized on multisite.WP_REDIS_DISABLE_FAILBACK_FLUSH
constant.