Appearance
缓存开发指南
本文档介绍 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技术团队