redis包含多种数据存储结构。如
KEY-VALUE
集合
有序集
队列
当中集合和键值对支持设置数据有效期。而队列则不支持。随着数据量的增多,过期数据也会相应增加。这个时候需要在合适的时间段删除过期数据。
在workman下结合redis可以调用workman定时器定期检测。
我们可以用另外一个键值集合存储其他键值的最后更新时间 根据当前时间和有效期时长来判断是否需要删除。
有新的数据更新时记录更新的键。
$redis->set("cachecontrol:{$key}",time());
定时器删除
//第一个工作进程充当监听进程 检测redis队列变化 删除老旧key
Timer::add(3600, function () use ($worker) {
global $redis_params;
$redis = phpredis::getInstance($redis_params);
$cur_time = time();
$delete_time = intval($redis->get('cache_next_delete_time'));
if ($delete_time && $cur_time-$delete_time>0){
//还未到开始
return false;
}
$old_static_keys = $redis->keys("message-*");
$caches_keys = $redis->keys("cachecontrol:*");
foreach ($caches_keys as $k => &$v) {
$v = trim(str_replace("cachecontrol:","",$v));
unset($v);
}
//删除老旧数据
foreach ($old_static_keys as $k => $key) {
if (!in_array($key, $caches_keys)) {
//太老了 删除
$redis->del($key);
}
}
//根据情况删除老数据
foreach ($caches_keys as $k => $key) {
$time = intval($redis->get($key));
if ($cur_time-$time>CACHE_DELETE_TIME){
$redis->del("cachecontrol:".$key);
$redis->del($key);
}
}
//记录下一次执行时间
$redis->set('cache_next_delete_time',$cur_time+CACHE_DELETE_TIME);
});