perf(2meet-data-optimizer): flush the cold cache group without a server-side scan
- TMDO_Cache_Layer::flush_group() bumps the post type's cold cache version (option wpdo_cold_cache_version) instead of wp_cache_flush_group(), which Redis Object Cache runs as one server-side scan that blocks Redis on a large group; entries under older keys expire by their TTL - TMDO_Zone_Cold::cache_key() builds every cold blob key; version 0 keeps the current keys, so upgrading invalidates nothing - Verify: CacheLayerTest (new keys, no scan, other post types untouched), unit 702, integration 583, phpcs, stan - PR: PR-110
This commit is contained in:
@@ -49,7 +49,7 @@ class TMDO_Cache_Layer {
|
||||
// Check which IDs are already cached.
|
||||
$uncached = array();
|
||||
foreach ( $post_ids as $pid ) {
|
||||
$cached = wp_cache_get( "cold_{$pid}", $group );
|
||||
$cached = wp_cache_get( TMDO_Zone_Cold::cache_key( (int) $pid, $post_type ), $group );
|
||||
if ( false === $cached ) {
|
||||
$uncached[] = (int) $pid;
|
||||
}
|
||||
@@ -94,7 +94,7 @@ class TMDO_Cache_Layer {
|
||||
// Cache all results (including empty arrays for posts with no cold data).
|
||||
foreach ( $uncached as $pid ) {
|
||||
$data = $fetched[ $pid ] ?? array();
|
||||
wp_cache_set( "cold_{$pid}", $data, $group, $ttl );
|
||||
wp_cache_set( TMDO_Zone_Cold::cache_key( $pid, $post_type ), $data, $group, $ttl );
|
||||
}
|
||||
}
|
||||
|
||||
@@ -114,7 +114,7 @@ class TMDO_Cache_Layer {
|
||||
|
||||
// Force a fresh read from DB (bypasses cache).
|
||||
$group = 'wpdo_cold_' . sanitize_key( $post_type );
|
||||
wp_cache_delete( "cold_{$post_id}", $group );
|
||||
wp_cache_delete( TMDO_Zone_Cold::cache_key( $post_id, $post_type ), $group );
|
||||
|
||||
// Re-read will populate cache.
|
||||
TMDO_Zone_Cold::get_blob( $post_id, $post_type );
|
||||
@@ -136,18 +136,18 @@ class TMDO_Cache_Layer {
|
||||
/**
|
||||
* Flush all cold cache for a post type.
|
||||
*
|
||||
* Useful after bulk imports or schema changes.
|
||||
* Useful after bulk imports or schema changes. Bumps the post type's cache
|
||||
* version (new keys from now on) instead of wp_cache_flush_group(), which
|
||||
* Redis Object Cache runs as one server-side scan that blocks Redis on a
|
||||
* large group; older entries expire by their TTL.
|
||||
*
|
||||
* @param string $post_type Post type to flush.
|
||||
*/
|
||||
public static function flush_group( string $post_type ): void {
|
||||
$group = 'wpdo_cold_' . sanitize_key( $post_type );
|
||||
|
||||
if ( function_exists( 'wp_cache_flush_group' ) ) {
|
||||
wp_cache_flush_group( $group );
|
||||
}
|
||||
// If wp_cache_flush_group is not available (older WP or no object cache),
|
||||
// individual entries will expire via TTL.
|
||||
$versions = get_option( TMDO_Zone_Cold::CACHE_VERSION_OPTION, array() );
|
||||
$versions = is_array( $versions ) ? $versions : array();
|
||||
$versions[ $post_type ] = (int) ( $versions[ $post_type ] ?? 0 ) + 1;
|
||||
update_option( TMDO_Zone_Cold::CACHE_VERSION_OPTION, $versions, true );
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -183,7 +183,7 @@ class TMDO_Cache_Layer {
|
||||
return array(
|
||||
'groups' => $groups,
|
||||
'prefetch_support' => true,
|
||||
'flush_support' => function_exists( 'wp_cache_flush_group' ),
|
||||
'flush_support' => true,
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user