//1、使用互斥锁
function get_redis_cache($ptid) {
$ptid_key = GG_LIST_KEY . "_" . $ptid;
$ptid_mutex = GG_KEY_MUTEX . "_" . $ptid;
$value_redis = "";
// $return = array();
if(class_exists('Redis')) {
$redis = new Redis();
$res = $redis->connect(REDIS_HOST,REDIS_PORT,REDIS_TIMEOUT);//两秒超时连接
}
if($res){
$auth = 1;
if(REDIS_AUTH){
$auth = $redis->auth(REDIS_AUTH); //设置密码
}
}
if($auth){
$value_redis = $redis->get($ptid_key);
if($value_redis == null){
//设置3min的超时,防止del操作失败的时候,下次缓存过期一直不能load db
if ($redis->set($ptid_mutex, 1, Array('nx', 'ex'=>60)) == 1) { //代表设置成功
$value_db = get_db_gg($ptid);
$value_redis = json_encode($value_db);
$redis->set($ptid_key, $value_redis);
$redis->del($ptid_mutex);
}else { //这个时候代表同时候的其他线程已经load db并回设到缓存了,这时候重试获取缓存值即可
sleep(3);
$value_redis = get_redis_cache($ptid); //重试
return $value_redis;
}
}
}
return json_decode($value_redis,1);
}