美文网首页我爱编程Redis
Yii2 redis同步数据到mysql

Yii2 redis同步数据到mysql

作者: meteorites | 来源:发表于2017-07-17 00:06 被阅读0次

    将redis数据写入mysql中:

    本次案例讲解将如何将商城中商品浏览次数通过缓存记录并写入mysql中
    具体的redis安装过程暂且就省略了.....

    一、安装redis插件|配置redis

    composer require yiisoft/yii2-redis

    找到common的config文件,在components下加入redis配置参数

     'redis' => [
                'class' => 'yii\redis\Connection',
                'hostname' => 'localhost',
                'port' => 6379,
                'database' => 0,
            ],
    

    二、建立redis
    在显示商品详情页面之前建立redis记录,每当用户访问该页面,就对redis进行一个判断,如果没有redis则建立并赋值为1,如果已存在则在原数据的基础上+1

     //将商品访问写入到redis中
            $redisObj = Yii::$app->redis;
            $visitsData = $redisObj->get('goods_visits');
    
            //反序列化访问数据
            $visitsData = empty($visitsData)?[]:unserialize($visitsData);
    
            if (isset($visitsData[$id])) {
                $visitsData[$id] += 1;
            }else{
                $visitsData[$id] = 1;
            }
    
            //序列化后的数据格式为{商品id:浏览次数}
            $visitsData = serialize($visitsData);
            $redisObj->set('goods_visits',$visitsData);
    

    三、将redis写入数据库中
    创建一个新的控制器,通过redistomysql方法获取存在的redis进行判断,如果为空则返回true,否则同步到Mysql当中,并在同步完成之后将redis数据删除

    public function actionRedistomysql()
        {
            //从redis中查询所有商品信息
            $redisObj = Yii::$app->redis;
            $visits = $redisObj->get("goods_visits");
    
            //三元表示判断redis是否为空
            $visitsArr = empty($visits)?[]:unserialize($visits);
    
            if (empty($visitsArr)) {
                return true;
            }
    
            //将浏览数据写入数据库
            foreach ($visitsArr as $k=>$v)
            {
                $goodsModle = Goods::findOne($k);
                $goodsModle->visites += $v;
                //如果数据存储成功则删除对应的数据
                if ($goodsModle->save() !== false) {
                    unset($visitsArr[$k]);
                }
                //延迟2秒防止高频率读取数据库
                sleep(2);
            }
    
            //删除redis中商品浏览数据
            $redisObj->del("goods_visits");
    
            if (empty($visitsArr)) {
                return true;
            }
    
            $redisObj->set('goods_visits',serialize($visitsArr));
    }
    

    四、检测redis是否建立成功
    首先访问商品详情页面,然后进入Linux服务器,(redis安装成功后)执行redis-cli,进入redis控制台,执行get goods_visits(创建的redis名),如果情况如下则刷新商品详情页面

    redis1.jpg

    成功页面如下:

    redis2.png

    到这里就完成了redis同步数据到Mysql的基本步骤,但是每一次的执行需要手动进行访问,所以这里就需要一个能让它自动执行的方法,因为本项目是在linux下运行,所以使用了crontab定时执行任务,如果是windows下则使用任务计划.....

    首先执行crontab -e命令进入linux定时任务设置
    基本格式 :
    * * * * * command(执行的方法地址,如:http://www.xxxx.com/cront/redistomysql)
    分 时 日 月 周 命令
    第1列表示分钟1~59 每分钟用*或者 */1表示
    第2列表示小时1~23(0表示0点)
    第3列表示日期1~31
    第4列表示月份1~12
    第5列标识号星期0~6(0表示星期天)
    第6列要运行的命令

    访问商品详情页面,然后等到设定的时间之后查看数据库中是否数据存在,存在数据那么标识你的redis就已经设置成功了,没有数据那么就需要检查你的代码,或者设置是否正确了,本次redis的使用介绍就到此为止了。

    相关文章

      网友评论

        本文标题:Yii2 redis同步数据到mysql

        本文链接:https://www.haomeiwen.com/subject/ptatkxtx.html