Skip to content

缓存开发指南

本文档介绍 DSPlatform 项目中缓存系统的使用方法,包括缓存工具类、缓存键管理、最佳实践等内容。

概述

DSPlatform 使用 ThinkPHP 8.0 的缓存系统,并封装了 CacheUtil 工具类来简化缓存操作。缓存系统支持多种存储后端(文件、Redis等),并提供了标签管理功能。

核心组件

CacheUtil 工具类

CacheUtil 是缓存操作的核心工具类,位于 app/deshang/utils/CacheUtil.php。该类集成了缓存键常量定义和缓存操作方法。

缓存键常量定义

php
class CacheUtil
{
    // 系统配置相关
    const SYS_CONFIG_TAG = 'sys_config';
    const SYS_CONFIG_KEY = 'sys_config_%s';

    // 商品分类
    const GOODS_CATEGORY_TAG = 'goods_category';
    const GOODS_CATEGORY_LIST_KEY = 'goods_category_list_%s';
    const GOODS_CATEGORY_PAGES_KEY = 'goods_category_pages_%s';

    // 商品评论
    const GOODS_COMMENT_TAG = 'goods_comment';
    const GOODS_COMMENT_PAGES_KEY = 'goods_comment_pages_%s';

    // 店铺
    const STORE_TAG = 'store';
    const STORE_INFO_KEY = 'store_info_%s';backend
    const STORE_LIST_KEY = 'store_list_%s';
    const STORE_PAGES_KEY = 'store_pages_%s';

    // 店铺商品分类
    const STORE_GOODS_CATEGORY_TAG = 'store_goods_category';
    const STORE_GOODS_CATEGORY_LIST_KEY = 'store_goods_category_list_%s';

    // LBS
    const LBS_CITY_TAG = 'lbs';
    const LBS_CITY_LIST_KEY = 'lbs_city_list';
}

主要方法

方法说明参数
isEnabled()检查缓存是否启用
set()设置缓存值key, value, ttl, tag, store
get()获取缓存值key, default, store
delete()删除缓存条目key, store
clear()清除缓存tag, store
increment()递增缓存值key, value, store
decrement()递减缓存值key, value, store

使用示例

php
use app\deshang\utils\CacheUtil;

// 设置缓存
$cacheKey = sprintf(CacheUtil::SYS_CONFIG_KEY, $configType);
CacheUtil::set($cacheKey, $data, 3600, CacheUtil::SYS_CONFIG_TAG);

// 获取缓存
$data = CacheUtil::get($cacheKey, []);

// 删除缓存
CacheUtil::delete($cacheKey);

// 清除标签缓存
CacheUtil::clear(CacheUtil::SYS_CONFIG_TAG);

配置说明

环境变量

.env 文件中配置缓存开关:

env
CACHE_ENABLED=true

缓存配置

config/cache.php 中配置缓存驱动:

php
return [
    'default' => 'file',
    'stores' => [
        'file' => [
            'type' => 'File',
            'path' => '',
            'prefix' => '',
            'expire' => 0,
        ],
        'redis' => [
            'type' => 'Redis',
            'host' => '127.0.0.1',
            'port' => 6379,
            'password' => '',
            'select' => 0,
        ],
    ],
];

最佳实践

1. 缓存键命名规范

使用下划线分隔的命名方式:

php
// 推荐
'sys_config_%s'
'goods_category_list_%s'
'store_info_%s'

// 标签命名
'sys_config'
'goods_category'
'store'

2. 缓存标签使用

为相关的缓存设置相同的标签,便于批量管理:

php
// 系统配置相关缓存使用 'sys_config' 标签
$cacheKey = sprintf(CacheUtil::SYS_CONFIG_KEY, $configType);
CacheUtil::set($cacheKey, $data, 3600, CacheUtil::SYS_CONFIG_TAG);

// 商品分类相关缓存使用 'goods_category' 标签
$cacheKey = sprintf(CacheUtil::GOODS_CATEGORY_LIST_KEY, $hash);
CacheUtil::set($cacheKey, $data, 3600, CacheUtil::GOODS_CATEGORY_TAG);

// 清除特定标签的所有缓存
CacheUtil::clear(CacheUtil::SYS_CONFIG_TAG);
CacheUtil::clear(CacheUtil::GOODS_CATEGORY_TAG);

3. TTL 设置策略

根据数据更新频率设置合适的缓存时间:

php
// 静态数据:长时间缓存
CacheUtil::set($key, $data, 86400); // 24小时

// 动态数据:短时间缓存
CacheUtil::set($key, $data, 3600);  // 1小时

// 实时数据:短时间缓存
CacheUtil::set($key, $data, 300);   // 5分钟

4. 缓存穿透防护

使用默认值防止缓存穿透:

php
$data = CacheUtil::get($cacheKey, []);
if (empty($data)) {
    $data = $this->getDataFromDatabase();
    CacheUtil::set($cacheKey, $data, 3600, $tag);
}

常见使用场景

1. 系统配置缓存

php
class SysConfigService
{
    public function getConfig($configType)
    {
        $cacheKey = sprintf(CacheUtil::SYS_CONFIG_KEY, $configType);
        $config = CacheUtil::get($cacheKey);
        
        if (empty($config)) {
            $config = $this->getConfigFromDatabase($configType);
            CacheUtil::set($cacheKey, $config, 3600, CacheUtil::SYS_CONFIG_TAG);
        }
        
        return $config;
    }
    
    public function updateConfig($configType, $value)
    {
        // 更新数据库
        $this->updateConfigInDatabase($configType, $value);
        
        // 清除缓存
        $cacheKey = sprintf(CacheUtil::SYS_CONFIG_KEY, $configType);
        CacheUtil::delete($cacheKey);
    }
}

2. 商品分类缓存

php
class GoodsCategoryService
{
    public function getCategoryList($params)
    {
        $hash = md5(serialize($params));
        $cacheKey = sprintf(CacheUtil::GOODS_CATEGORY_LIST_KEY, $hash);
        
        $categoryList = CacheUtil::get($cacheKey);
        if (empty($categoryList)) {
            $categoryList = $this->getCategoryFromDatabase($params);
            CacheUtil::set($cacheKey, $categoryList, 3600, CacheUtil::GOODS_CATEGORY_TAG);
        }
        
        return $categoryList;
    }
    
    public function updateCategory($categoryId)
    {
        // 更新数据库
        $this->updateCategoryInDatabase($categoryId);
        
        // 清除相关缓存
        CacheUtil::clear(CacheUtil::GOODS_CATEGORY_TAG);
    }
}

3. 店铺信息缓存

php
class StoreService
{
    public function getStoreInfo($storeId)
    {
        $cacheKey = sprintf(CacheUtil::STORE_INFO_KEY, $storeId);
        
        $storeInfo = CacheUtil::get($cacheKey);
        if (empty($storeInfo)) {
            $storeInfo = $this->getStoreFromDatabase($storeId);
            CacheUtil::set($cacheKey, $storeInfo, 7200, CacheUtil::STORE_TAG);
        }
        
        return $storeInfo;
    }
    
    public function updateStore($storeId, $data)
    {
        // 更新数据库
        $this->updateStoreInDatabase($storeId, $data);
        
        // 清除相关缓存
        $infoKey = sprintf(CacheUtil::STORE_INFO_KEY, $storeId);
        CacheUtil::delete($infoKey);
        
        // 或者清除所有店铺相关缓存
        CacheUtil::clear(CacheUtil::STORE_TAG);
    }
}

4. LBS城市列表缓存

php
class LbsService
{
    public function getCityList()
    {
        $cacheKey = CacheUtil::LBS_CITY_LIST_KEY;
        
        $cityList = CacheUtil::get($cacheKey);
        if (empty($cityList)) {
            $cityList = $this->getCityListFromDatabase();
            CacheUtil::set($cacheKey, $cityList, 86400, CacheUtil::LBS_CITY_TAG); // 24小时
        }
        
        return $cityList;
    }
    
    public function updateCityList()
    {
        // 更新数据库
        $this->updateCityListInDatabase();
        
        // 清除缓存
        CacheUtil::delete(CacheUtil::LBS_CITY_LIST_KEY);
    }
}

性能优化建议

1. 合理设置缓存大小

  • 避免缓存过大的数据
  • 使用压缩存储大型对象
  • 定期清理过期缓存

2. 缓存预热

在系统启动时预加载常用数据:

php
public function warmUpCache()
{
    // 预热系统配置
    $this->warmUpSystemConfig();
    
    // 预热商品分类
    $this->warmUpGoodsCategories();
    
    // 预热城市列表
    $this->warmUpCityList();
}

3. 缓存监控

监控缓存命中率和性能指标:

php
public function getCacheStats()
{
    return [
        'hit_rate' => $this->calculateHitRate(),
        'memory_usage' => $this->getMemoryUsage(),
        'key_count' => $this->getKeyCount(),
    ];
}

常见问题

Q: 缓存数据不一致怎么办?

  • 确保在数据更新后及时清除相关缓存
  • 使用缓存标签进行批量管理
  • 设置合理的缓存过期时间

Q: 缓存占用内存过多怎么办?

  • 定期清理过期缓存
  • 使用 Redis 等外部缓存服务
  • 压缩存储大型数据

Q: 如何调试缓存问题?

  • 检查缓存是否启用
  • 验证缓存键是否正确
  • 查看缓存存储日志
  • 使用缓存监控工具

相关链接


最后更新:2024-01-20
维护者:DSPlatform技术团队