You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在PrestaShop 1.7自定义模块中更新商品价格时如何失效Memcached值?

解决PrestaShop 1.7多店铺Memcached缓存精准失效问题

问题核心

你在多店铺环境下手动更新product_shop表的商品价格后,Memcached中对应的缓存条目未自动失效,导致前端读取旧价格;当前只能通过全量清除缓存(Cache::getInstance()->delete('*'))解决,性能损耗较大。

精准缓存失效方案

PrestaShop针对商品数据有内置的缓存管理逻辑,无需手动拼接哈希键,可通过以下方式精准清除目标缓存:

1. 使用PrestaShop内置商品缓存清除方法

在更新product_shop价格后,调用Product::clearCache()方法,该方法会自动清除对应商品在指定店铺的所有相关缓存(适配Memcached等驱动的键规则):

private function updateProductPrice($params)
{
    $id_product = $params['id_product'];
    $id_tax_rules_group = $params['product']->id_tax_rules_group;

    $shop_ids = $this->getShopIds();
    $tax_rate = $this->getTaxRate($id_tax_rules_group);
    
    // 优化:仅查询一次基础价格,避免循环内重复查询
    $sql = 'SELECT `price` FROM `' . _DB_PREFIX_ . 'product` WHERE `id_product` = ' . (int) $id_product;
    $base_price = (float)Db::getInstance()->getValue($sql);

    foreach ($shop_ids as $shop_id) {
        $is_tax = Configuration::get('PS_TAX', null, null, $shop_id);
        
        if (!$is_tax) {
            $new_price = $base_price * (100 + $tax_rate) / 100;
            Db::getInstance()->update('product_shop', ['price' => $new_price], 'id_product = '.(int)$id_product . ' AND id_shop = '.(int)$shop_id);
            
            // 清除当前店铺下该商品的缓存
            Product::clearCache((int)$id_product, $shop_id);
        }
    }
}

Product::clearCache()会自动处理缓存键的哈希生成与失效,无需手动拼接类似ps_288e7d9f7adabca7ca488166fced130a的字符串。

2. 手动清除特定缓存键(可选)

如果需要更细粒度的控制,可通过PrestaShop的缓存键生成器,生成对应条目并失效:

use PrestaShop\PrestaShop\Core\Cache\CacheKeyGenerator;

// 在价格更新后添加
$cacheKey = CacheKeyGenerator::generate([
    'product_shop',
    'price',
    (int)$id_product,
    (int)$shop_id
]);

// 清除该键对应的缓存
Cache::getInstance()->delete($cacheKey);

注:优先使用内置方法,避免因PrestaShop版本更新导致键规则变化。

原理说明

PrestaShop的缓存键会根据数据类型、ID、上下文(店铺、语言)等生成唯一哈希值,你看到的长字符串就是原始键(如product_shop_price_1_2)经过哈希处理后的结果。使用内置方法可自动适配不同缓存驱动的规则,避免手动处理哈希的麻烦。

内容的提问来源于stack exchange,提问作者Filip Albert

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 03:42:42