php/**
* Class Rpt redis 用于报表的缓存基本存储和读写 2.0
* @simple
* Rpt::read("diamond.account",$nick);
* Rpt::readSync("diamond.account",$nick);
* $finder = Rpt::createFinder("diamond.account",$nick);
* $finder->read();
* $finder->readSync();
*
* Rpt::save("diamond.account",$nick,$data);
* $storage = Rpt::createStorage("diamond.account",$nick);
* $storage->save($data);
* $storage->save($data,7200);*/
classRpt {public static function read($key,$nick){$finder = self::createFinder($key,$nick);return $finder->read();
}public static function readSync($key,$nick){$finder = self::createFinder($key,$nick);return $finder->readSync();
}public static function createFinder($key,$nick){$key = RptGenerate::key($key,$nick);return new RptFinder($key);
}public static function createStorage($key,$nick){$key = RptGenerate::key($key,$nick);return new RptStorage($key);
}public static function save($key,$nick,$data,$expired=7200){$storage = self::createStorage($key,$nick);return $storage->save($data,$expired);
}public static functioncreateRedis(){$redis = newRedis();$redis->connect(Yii::app()->params["RedisServerIP"]);return $redis;
}
}/**
* Class RptFinder 数据读取*/
classRptFinder {/**
* @var string $key*/
public $key;/**
* @param string $key*/
public function __construct($key){$this->key = $key;
}/**
* 非安全读取数据
* @return mixed*/
public functionread(){$data = $this->readData();if($data->isRead && !$data->isExpired())return $data->data;return null;
}protected functionreadData(){$redis = Rpt::createRedis();$rptData = newRptData();$data = json_decode($redis->get($this->key));if(false == $data){$rptData->isRead = false;$rptData->expiredTime = time();$rptData->expired = 24*3600;
}else{$rptData->expired = $data->expired;$rptData->isRead = $data->isRead;$rptData->expiredTime = $data->expiredTime;$rptData->data = $data->data;
}return $rptData;
}/**
* 同步读取数据
* @return mixed*/
public functionreadSync(){while(true){$rptData = $this->readData();if($rptData->isRead && !$rptData->isExpired())return $this->read();sleep(1);
}
}
}/**
* Class RptStorage 数据存储*/
classRptStorage {/**
* @var string key*/
public $key;/**
* @param string $key*/
public function __construct($key){$this->key = $key;
}/**
* 写入数据
* @param $data
* @param int $expired
* @return bool*/
public function save($data,$expired=7200){$rptData = newRptData();$rptData->data = $data;$rptData->expiredTime = time();$rptData->isRead = true;$rptData->expired = $expired;$redis = Rpt::createRedis();return $redis->setex($this->key, $rptData->expired,json_encode($rptData));
}
}/**
* Class RptData redis存储数据实体*/
classRptData {public $expired;public $expiredTime;public $data;public $isRead;public functionisExpired(){if(time()-$this->expiredTime > $this->expired)return true;return false;
}
}/**
* Class RptGenerate key生成*/
classRptGenerate {public static function key($key,$nick){return $key.".".md5($nick);
}
}