用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 那么必然会产生数据混淆

0
0

EasySwoole+ElasticSearch打造高性能小视频服务系统

系统掌握EasySwoole框架,从容应对高并发、高性能业务

556 学习 · 235 问题

查看课程