在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
相关产品推荐
相关产品推荐

