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