Dynamic cache get($cacheKey);// 是否需要更新缓存$update = true;$nowTime = time();if( !empty($result) ) {$result = @ unserialize($result);$update = $result['_expires'] $nowTime;}if($update) {$lockKey = 'lock_'.$cacheKey;// 锁,防雪
get($cacheKey);
// 是否需要更新缓存
$update = true;
$nowTime = time();
if( !empty($result) ) {
$result = @ unserialize($result);
$update = $result['_expires'] < $nowTime;
}
if($update) {
$lockKey = 'lock_'.$cacheKey;
// 锁,防雪崩
if( $redis->setnx($lockKey, 1) ) {
// 获取需要缓存的数据
$result = SomeClass::getData();
// 数据过期时间, 需要根据这个时间, 判断是否更新缓存
$result['_expires'] = $nowTime + max(1, (int)$expires);
// 长时间缓存数据, 在这个期间遇到争锁的情况, 也能正常返回数据
$redis->setex($cacheKey, 12*3600, serialize($result));
// 释放锁
$redis->del($lockKey);
} else {
// 防止死锁, -1 表示永不过期
if($redis->ttl($lockKey) == -1) {
$redis->expire($lockKey, 10);
}
}
}
return $result;
}
}
