1368 字
7 分钟
🍛ThinkPHP8中使用redis缓存
实现了使用redis缓存自增版本、指定缓存版本号
1. 在.env中添加以下配置
# RedisREDIS_HOST = 127.0.0.1REDIS_PORT = 6379REDIS_PASS = passwordREDIS_CACHE_SELECT = 22. 修改缓存配置文件
config/cache.php
<?php
// +----------------------------------------------------------------------// | 缓存设置// +----------------------------------------------------------------------
return [ // 默认缓存驱动 'default' => 'redis',
// 缓存连接方式配置 'stores' => [ 'file' => [ // 驱动方式 'type' => 'File', // 缓存保存目录 'path' => '', // 缓存前缀 'prefix' => '', // 缓存有效期 0表示永久缓存 'expire' => 0, // 缓存标签前缀 'tag_prefix' => 'tag:', // 序列化机制 例如 ['serialize', 'unserialize'] 'serialize' => [], ], // 更多的缓存连接 'redis' => [ 'type' => 'redis', // Redis 主机 'host' => env('REDIS_HOST', '127.0.0.1'), // Redis 端口 'port' => env('REDIS_PORT', 6379), // Redis 密码 'password' => env('REDIS_PASS', ''), // 库 'select' => env('REDIS_CACHE_SELECT', 2), // 缓存前缀 'prefix' => '', // 缓存有效期 0表示永久缓存 'expire' => 0,// // 缓存标签前缀// 'tag_prefix' => 'tag:',// // 是否使用连接池// 'use_pool' => true,// // 连接池的连接标识// 'pool' => 'default', ], ],];3.缓存相关常量配置
<?phpdeclare (strict_types=1);
namespace app\common\enum;
class CacheEnum{ // 版本号前缀 const CACHE_VERSION_PREFIX = 'cache_version_v1001'; // 版本号初始值 const DEFAULT_VERSION = 1001; // 缓存键前缀 const CACHE_PREFIX = 'data_cache';
/** 各种业务场景的缓存键 */ // 生成链接缓存键 const PRODUCT_DETAIL_GET_LINK_CACHE_KEY = 'product_detail_get_link'; // 类目列表缓存键 const PRODUCT_CATEGORY_LIST_CACHE_KEY = 'product_category_list';
// 防止队列重复消费键 const CHECK_QUEUE_REPEAT_CONSUMING_KEY = 'check_queue_repeat_consuming';}4.创建缓存帮助类
提供了两种方法设置缓存 setCacheData与remember方法 使用前都需先调用setCacheConfig方法
<?phpdeclare(strict_types=1);
namespace core\Library;
use app\common\enum\CacheEnum;use think\facade\Cache;
/** * 缓存类 * 注意事项 需先调用setCacheConfig方法 * Class CacheHelper * @package core\Library */class CacheHelper{ // 初始版本号 protected int $version = CacheEnum::DEFAULT_VERSION;
// 是否自定义缓存键 protected bool $is_set_version = false;
// 缓存时间 protected int|null $ttl = null;
// 缓存键 protected string $cache_key = 'default';
// 未拼接前的缓存键 protected string $cache_key_ori = 'default';
// 版本号键 protected string $version_key = 'default';
/** * 使用闭包缓存 * @param \Closure $callback * @return mixed */ public function remember(\Closure $callback): mixed { // 获取缓存数据 $cache_data = $this->getCacheData(); if ($cache_data !== null) { return $cache_data; }
// 缓存不存在,调用闭包生成数据 $data = $callback(); // 设置缓存与版本号 $this->setCacheData($data);
return $data; }
/** * 设置缓存数据 * @param mixed $data * @return bool */ public function setCacheData(mixed $data): bool { $data_res = Cache::set($this->getCacheKey(), $data, $this->getTtl()); $version_res = Cache::set($this->getVersionKey(), $this->getVersion()); if ($data_res && $version_res) { return true; } return false; }
/** * 获取缓存数据 * @return mixed */ public function getCacheData(): mixed { if (Cache::has($this->getCacheKey())) { return Cache::get($this->getCacheKey()); } return null; }
/** * 获取当前缓存版本号 * @return int */ public function getVersion(): int { if (!$this->is_set_version && Cache::has($this->version_key)) { // 未手动设置过缓存 缓存存在,直接返回 $this->version = intval(Cache::get($this->version_key)); } return $this->version; }
/** * 设置缓存配置 * @param string $cache_key 缓存键名 * @param int|null $ttl 缓存有效期 null为永久有效 * @param bool $inc_version 是否递增版本号 * @param int $version 是否自定义版本号 不建议与递增版本号同时使用 若同时使用 则会在自定义版本号基础上加1 * @return $this */ public function setCacheConfig(string $cache_key, int|null $ttl = null, bool $inc_version = false, int $version = 0): self { $this->cache_key_ori = $cache_key; $this->setVersionKey();
// 若指定版本号则设置 !empty($version) && $this->setVersion($version);
// 获取当前版本号 +1 $version = $this->getVersion(); $inc_version && $this->setVersion($version + 1);
// 设置缓存时间 !is_null($ttl) && $this->ttl = $ttl;
$this->cache_key = $this->generateCacheKey($this->getVersion()); return $this; }
/** * 生成缓存键名 * @param int $version * @return string */ protected function generateCacheKey(int $version): string { return CacheEnum::CACHE_PREFIX . ':' . $this->getEnv() . ':' . $this->cache_key_ori . ':' . $version; }
public function getEnv(): string { return app('env')->get('app_env') ?? 'dev'; }
/** * 获取有效期 * @return int|null */ public function getTtl(): int|null { return $this->ttl; }
/** * 获取缓存键名 * @return string */ public function getCacheKey(): string { return $this->cache_key; }
/** * 删除缓存 * @param array $version_list 版本号列表 * @return bool */ public function delete(array $version_list): bool { if (!$version_list) { return true; } foreach ($version_list as $version) { $cache_key = $this->generateCacheKey($version); Cache::delete($cache_key); } return true; }
/** * 获取历史版本缓存 不包含当前版本 * @return array */ public function getHistoryVersion(): array { $version_list = []; for ($i = CacheEnum::DEFAULT_VERSION; $i < $this->getVersion(); $i++) { $cache_key = $this->generateCacheKey($i); if (Cache::has($cache_key)) { $version_list[] = $i; } } return $version_list; }
/** * 手动设置缓存版本号 * @param int $version * @return $this */ protected function setVersion(int $version): self { $this->version = $version; $this->is_set_version = true; return $this; }
/** * 获取版本号键名 * @return string */ protected function getVersionKey(): string { return $this->version_key; }
/** * 设置缓存版本键名 * @return $this */ protected function setVersionKey(): self { $this->version_key = CacheEnum::CACHE_VERSION_PREFIX . ':' . $this->getEnv() . ':' . $this->cache_key_ori; return $this; }}5. 使用方法
首先注入帮助类
#[Inject]protected CacheHelper $cacheHelper;
- 使用闭包方式设置缓存 若缓存不存在执行闭包返回结果(适合返回结果处理比较简单的情况 这样简洁一些)
$level = 1;$cache_key = CacheEnum::PRODUCT_CATEGORY_LIST_CACHE_KEY . "_{$level}";return $this->cacheHelper->setCacheConfig($cache_key, 3600 * 24 * 4)->remember(function () use ($params) { return $this->getListByLevel($params);});
- 手动判断缓存 是否为空 处理业务(适合逻辑比较复杂的情况)
$cache_key = CacheEnum::PRODUCT_DETAIL_GET_LINK_CACHE_KEY . "_{$type}";$cache = $this->cacheHelper->setCacheConfig($cache_key, 3600 * 24);
if (!empty($cache_data = $cache->getCacheData())) { return $cache_data;}
// todo 处理业务 获取结果$return_data = ['aaa'];
// 设置缓存!empty($return_data) && $cache->setCacheData($return_data);
// 返回结果return $return_data;6. 扩展用法
自增缓存版本号
$cache = $this->cacheHelper->setCacheConfig($cache_key, 3600 * 24, true);指定版本号缓存(如果指定版本号缓存 第三个参数传false,如果传true 以下示例的版本号会变成1010)
$cache = $this->cacheHelper->setCacheConfig($cache_key, 3600 * 24, false, 1009);获取当前版本之前的历史版本号 (初始版本号为1001 以下示例为获取 1001~1008版本的缓存)
$cache = $this->cacheHelper->setCacheConfig($cache_key, 3600 * 24, false, 1009);$history_version_list = $cache->getHistoryVersion();删除指定版本号列表的缓存
$this->cacheHelper->setCacheConfig($cache_key)->delete([1001,1002]);