FastAdmin 清除无效缓存 Tag

FastAdmin 现在使用的还是 ThinkPHP 5.0.24 版本,相比于现在的 ThinkPHP 最新版,在缓存方面还是有些不足的地方,比如缓存 Tag 的处理。默认的前缀是 tag_ ,如果你使用一些可视化工具,是没办法呈现一个文件夹架构的,只能看到一堆 tag_ 开头的文件,这样就很难找到自己想要的缓存文件了。

不过我们这里要讲的是另外一个问题,在我们鉴权场景中,我们会将 Token 打上一个带有 UID 的 Tag,但 FastAdmin 是没办法自动清除这些 Tag 的,如果我们不进行清除那会占用一个内存空间,到一个程度后会触发 Redis 的一些释放操作(这里要看你规则是 LUR 还是什么之类的,如果你的热点或者永久性缓存数据被清空了,那就是灾难性问题了),所以我们需要另外一个脚本,定期在非高峰期进行一个检测,如果发现这个 Tag 下没有任何记录了,那就将这个 Tag 进行删除。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
public function index()
{
$handle = \think\Cache::$handler;

if(!$handle instanceof \think\cache\driver\Redis){
throw new \Exception('非 Redis 驱动');
}

// 获取全部 tag 记录
$tags = $handle->handler()->keys('tag_*');

foreach ($tags as $tag) {
$info = $handle->handler()->get($tag);

if(!$info) {
continue;
}

// 解析出包含这个 tag 的记录列表
$token_keys = explode(',', $info);

$exists = false;

foreach ($token_keys as $token_key) {
// 这个 tag 还有记录在使用,那就跳过
if($handle->handler()->exists($tag)) {
$exists = true;
break;
}
}

if($exists) {
continue;
}

// 赋予过期时间,让 redis 后台处理
$handle->handler()->expire($tag, 1);
}

return 'success';
}
往上