• 0
  • 0

redis过期缓存清除方案

2019-12-03 31 0 admin 所属分类:PHP 记录

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);
});


返回顶部