用Di获取Redis数据间接丢失
来源:7-15 性能优化 – redis解决方案
已经快秃顶了呢
2019-05-16
老师你帮我看一下.我用Di容器获取Redis的内容刷新页面十次.才会出现2~3的数据.其他返回的都是空值, 用原生的Redis去获取就能一直拿到数据
获取数据
$videoData = Di::getInstance()->get('REDIS')->get('index_video_data_cat_id_' . $catId);
// $redis = new Redis();
// $redis->connect(\Yaconf::get('redis.host'), \Yaconf::get('redis.port'), \Yaconf::get('redis.time_out'));
// $videoData = $redis->get('index_video_data_cat_id_' . $catId);
return $this->writeJson(Status::CODE_OK, 'ok', $videoData);
Di注册
public static function initialize()
{
Di::getInstance()->set('REDIS', Redis::getInstance());
}
Redis
namespace App\Lib\Redis;
use EasySwoole\Component\Singleton;
use EasySwoole\EasySwoole\Config;
use \Yaconf;
class Redis
{
use Singleton;
public $redis = null;
private function __construct()
{
/*判断有没有安装redis拓展*/
if (!extension_loaded('redis')) {
throw new \Exception('redis拓展不存在');
}
try {
$this->redis = new \Redis();
$link = $this->redis->connect(Yaconf::get('redis.host'), Yaconf::get('redis.port'), Yaconf::get('redis.time_out'));
} catch (\Exception $e) {
/*
* 因为$e->getmaessage会把详细信息输入上去
* 这些数据是比较隐蔽的。我们不能让别人看到
* throw new \Exception($e->getMessage());*/
throw new \Exception('redis服务异常');
}
if (!$link) {
throw new \Exception('redis链接失败');
}
}
public function __call($name, $arguments)
{
$count = count($arguments);
if ($count == 1) {
return $this->redis->$name($arguments[0]);
} elseif ($count == 2) {
return $this->redis->$name($arguments[0], $arguments[1]);
} elseif ($count == 3) {
return $this->redis->$name($arguments[0], $arguments[1], $arguments[2]);
}
return '';
}
}
写回答
1回答
-
慕九州5137920
2020-04-02
DI容器处理的对象全部是单例模式 当你使用类属性变量 且有多个请求同时调用这个单例redis 那么必然会产生数据混淆
00
相似问题