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:
@@ -25,6 +25,9 @@ if ( ! defined( 'ABSPATH' ) ) {
|
||||
*/
|
||||
class TMDO_Zone_Cold {
|
||||
|
||||
/** Option: post type → cold cache version (TMDO_Cache_Layer::flush_group()). */
|
||||
public const CACHE_VERSION_OPTION = 'wpdo_cold_cache_version';
|
||||
|
||||
/**
|
||||
* Get the cold table name for a post type.
|
||||
*
|
||||
@@ -45,6 +48,21 @@ class TMDO_Zone_Cold {
|
||||
return 'wpdo_cold_' . sanitize_key( $post_type );
|
||||
}
|
||||
|
||||
/**
|
||||
* Object-cache key of a post's cold blob. It carries the post type's cache
|
||||
* version once TMDO_Cache_Layer::flush_group() has bumped it (none before,
|
||||
* so existing entries keep their keys).
|
||||
*
|
||||
* @param int $post_id Post ID.
|
||||
* @param string $post_type Post type slug.
|
||||
* @return string
|
||||
*/
|
||||
public static function cache_key( int $post_id, string $post_type ): string {
|
||||
$versions = get_option( self::CACHE_VERSION_OPTION, array() );
|
||||
$version = is_array( $versions ) ? (int) ( $versions[ $post_type ] ?? 0 ) : 0;
|
||||
return $version ? "cold_{$post_id}_v{$version}" : "cold_{$post_id}";
|
||||
}
|
||||
|
||||
/**
|
||||
* Ensure the cold table exists for a post type.
|
||||
*
|
||||
@@ -92,7 +110,7 @@ class TMDO_Zone_Cold {
|
||||
*/
|
||||
public static function get_blob( int $post_id, string $post_type ): array {
|
||||
$group = self::cache_group( $post_type );
|
||||
$cache_key = "cold_{$post_id}";
|
||||
$cache_key = self::cache_key( $post_id, $post_type );
|
||||
|
||||
$cached = wp_cache_get( $cache_key, $group );
|
||||
if ( false !== $cached ) {
|
||||
@@ -202,7 +220,7 @@ class TMDO_Zone_Cold {
|
||||
);
|
||||
// phpcs:enable WordPress.DB.PreparedSQL.InterpolatedNotPrepared,WordPress.DB.DirectDatabaseQuery,WordPress.DB.DirectDatabaseQuery.NoCaching
|
||||
|
||||
wp_cache_delete( "cold_{$post_id}", self::cache_group( $post_type ) );
|
||||
wp_cache_delete( self::cache_key( $post_id, $post_type ), self::cache_group( $post_type ) );
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -215,7 +233,7 @@ class TMDO_Zone_Cold {
|
||||
public static function delete( int $post_id, string $post_type ): void {
|
||||
global $wpdb;
|
||||
$wpdb->delete( self::table( $post_type ), array( 'post_id' => $post_id ), array( '%d' ) );
|
||||
wp_cache_delete( "cold_{$post_id}", self::cache_group( $post_type ) );
|
||||
wp_cache_delete( self::cache_key( $post_id, $post_type ), self::cache_group( $post_type ) );
|
||||
}
|
||||
|
||||
// ── Private helpers ───────────────────────────────────────────────────
|
||||
@@ -264,7 +282,7 @@ class TMDO_Zone_Cold {
|
||||
);
|
||||
|
||||
// Invalidate object cache.
|
||||
wp_cache_delete( "cold_{$post_id}", self::cache_group( $post_type ) );
|
||||
wp_cache_delete( self::cache_key( $post_id, $post_type ), self::cache_group( $post_type ) );
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -305,6 +323,6 @@ class TMDO_Zone_Cold {
|
||||
);
|
||||
// phpcs:enable WordPress.DB.PreparedSQL.InterpolatedNotPrepared,WordPress.DB.DirectDatabaseQuery,WordPress.DB.DirectDatabaseQuery.NoCaching
|
||||
|
||||
wp_cache_delete( "cold_{$post_id}", self::cache_group( $post_type ) );
|
||||
wp_cache_delete( self::cache_key( $post_id, $post_type ), self::cache_group( $post_type ) );
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user