redis缓存分类

场景:
前端需要根据条数num限制获取分类,缓存为8小时,减少访问性能
实现原理:
获取分类列表时,先判断是否能在缓存中得到数据,如果有直接展示,如果没有,要先去查数据,然后再缓存。添加分类时要重新处理缓存,添加成功后,先把清理缓存,再查找数据库缓存新的数据。
遇到问题:
当添加成功后,缓存为10条数据,这个获取缓存想要得到的6条数据
解决方案:
1、在缓存时根据key+条数作为新的key,
2、直接在读取缓存数据中截取想要的条数

解决方案1的代码:

class MessageCategory extends MessageCategoryModel
{
    private static $key = 'message_category';
    /**
     * 保存$key 的key
     * @var string
     */
    private static $msg_key = 'msg_key';
    public function __construct()
    {
        /**
         * 验证APP_TOKEN
         */
        $this->vaildateAppToken();

    }

    /**
     * 添加分类方法
     * @param varchar  $name   分类名称
     * @param bool $cid 绑定分类id
     * @return array $data   响应数据
     */
    public function addMessageCategory(){
        /**
         *get 字段参数验证是否符合条件
         */
        $validate = new MessageCategoryValidate();
        $validateResult=$validate->addMessageCategoryValidate($this->get);
        /**
         * 判断验证是否有报错信息
         */
        if(@$validateResult->code==2001){
            return $validateResult;
        }

        /**
         * 插入数据到数据库
         */

        $info = db_find("message_category", $fields = "*",$where = ['name'=>$validateResult['name']]);
        if($info){
            return $this->returnMessage(1002,'响应成功',"该分类名称已存在");
        }
        $result=$this->insertMessageCategory($validateResult);
        if($result){
            //添加成功后先删除缓存,再做缓存处理
            $msgKey = RedisPage::instance()->get(self::$msg_key);
            RedisPage::instance()->del($msgKey);

            $redisConfig = Conf::all('redis');
            $where = [];
            $results = $this->selectMessageCategory($where);
            $value = RedisPage::instance()->serialize($results);
            RedisPage::instance()->setex(self::$key, $redisConfig['message_category_expire_time'], $value);

            return $this->returnMessage(1001,'响应成功',(int)$result);
        }else{
            return $this->returnMessage(2001,'响应错误',$result);

        }
	 /** 
	  *获取分类列表
      * @function
      */
    public function getMessageCategorylistAll(){

        $validator = new MessageCategoryValidate();
        $validateResult = $validator->getMessageCategoryValidate($this->get);
        /**
         * 判断验证是否有报错信息
         */
        if(@$validateResult->code==2001){
            return $validateResult;
        }

        //先判断是否有条件限制,有的话,缓存key:key+num,没有的话,key:key
        if (!empty($validateResult['num'])){
            self::$key = self::$key.$validateResult['num'];
        }
        //是否存在新的key
        $has_msg_key = RedisPage::instance()->get(self::$msg_key);
        if (!empty($has_msg_key)) {
            RedisPage::instance()->del($has_msg_key);
        }
        $redisConfig = Conf::all('redis');
        RedisPage::instance()->setex(self::$msg_key, $redisConfig['message_category_expire_time'], self::$key);
        //先查询缓存,如果没有查数据库后再缓存
        $message_career_category = RedisPage::instance()->get(self::$key);
        if (!empty($message_career_category)){
            $result = RedisPage::instance()->unserialize($message_career_category);
        }else{
            $count = $this->countMessageCategory($validateResult);
            $result = "";
            if($count>0){
                $result = $this->selectMessageCategory($validateResult);
            }
            $value = RedisPage::instance()->serialize($result);
            RedisPage::instance()->setex(self::$key, $redisConfig['message_category_expire_time'], $value);
        }

        if($result){
            $data=$result;
            return $this->returnMessage(1001,'响应成功',$data);

        }else{
            $data=[];
            return $this->returnMessage(2001,'暂无数据',$data);
        }

    }
    /**
     * 删除分类
     * @param int id 分类id
     * @return array $data   响应数据
     */
    public function delMessageCategory(){

        $validate = new MessageCategoryValidate();
        $validateResult=$validate->delMessageCategoryValidate($this->get);
        /**
         * 判断验证是否有报错信息
         */
        if(@$validateResult->code==2001){
            return $validateResult;
        }

        /**
         * 删除数据
         */
        $result=$this->deleteMessageCategory($validateResult);
        if($result){
            //删除成功后清除缓存
            $msgKey = RedisPage::instance()->get(self::$msg_key);
            RedisPage::instance()->del($msgKey);
            return $this->returnMessage(1001,'响应成功',$result);
        }else{
            return $this->returnMessage(2001,'响应错误',$result);
        }
    }
    }

解决方案2的代码

class MessageCategory extends MessageCategoryModel
{
    private static $key = 'message_category';
   
    public function __construct()
    {
        /**
         * 验证APP_TOKEN
         */
        $this->vaildateAppToken();

    }

    /**
     * 添加分类方法
     * @param varchar  $name   分类名称
     * @param bool $cid 绑定分类id
     * @return array $data   响应数据
     */
    public function addMessageCategory(){
        /**
         *get 字段参数验证是否符合条件
         */
        $validate = new MessageCategoryValidate();
        $validateResult=$validate->addMessageCategoryValidate($this->get);
        /**
         * 判断验证是否有报错信息
         */
        if(@$validateResult->code==2001){
            return $validateResult;
        }

        /**
         * 插入数据到数据库
         */

        $info = db_find("message_category", $fields = "*",$where = ['name'=>$validateResult['name']]);
        if($info){
            return $this->returnMessage(1002,'响应成功',"该分类名称已存在");
        }
        $result=$this->insertMessageCategory($validateResult);
        if($result){
            //添加成功后先删除缓存,再做缓存处理
            RedisPage::instance()->del(self::$key);

            $redisConfig = Conf::all('redis');
            $where = [];
            $results = $this->selectMessageCategory($where);
            $value = RedisPage::instance()->serialize($results);
            RedisPage::instance()->setex(self::$key, $redisConfig['message_category_expire_time'], $value);

            return $this->returnMessage(1001,'响应成功',(int)$result);
        }else{
            return $this->returnMessage(2001,'响应错误',$result);

        }
		/** 获取分类列表
     * @function
     */
    public function getMessageCategorylistAll(){

        $validator = new MessageCategoryValidate();
        $validateResult = $validator->getMessageCategoryValidate($this->get);
        /**
         * 判断验证是否有报错信息
         */
        if(@$validateResult->code==2001){
            return $validateResult;
        }

        //先查询缓存,如果没有查数据库后再缓存
        $message_career_category = RedisPage::instance()->get(self::$key);

        if (!empty($message_career_category)){
            $result = RedisPage::instance()->unserialize($message_career_category);
        }else{
            $count = $this->countMessageCategory($validateResult);
            $result = "";
            if($count>0){
                $result = $this->selectMessageCategory($validateResult);
            }
            $redisConfig = Conf::all('redis');
            $value = RedisPage::instance()->serialize($result);
            RedisPage::instance()->setex(self::$key, $redisConfig['message_category_expire_time'], $value);
        }

        if($result){
            if (!empty($validateResult['num'])){
                $data = array_slice($result, 0, $validateResult['num']);
            }else{
                $data=$result;
            }
            return $this->returnMessage(1001,'响应成功',$data);

        }else{
            $data=[];
            return $this->returnMessage(2001,'暂无数据',$data);
        }

    }
    /**
     * 删除分类
     * @param int id 分类id
     * @return array $data   响应数据
     */
    public function delMessageCategory(){

        $validate = new MessageCategoryValidate();
        $validateResult=$validate->delMessageCategoryValidate($this->get);
        /**
         * 判断验证是否有报错信息
         */
        if(@$validateResult->code==2001){
            return $validateResult;
        }

        /**
         * 删除数据
         */
        $result=$this->deleteMessageCategory($validateResult);
        if($result){
            //删除成功后清除缓存
            RedisPage::instance()->del(self::$key);
            return $this->returnMessage(1001,'响应成功',$result);
        }else{
            return $this->returnMessage(2001,'响应错误',$result);
        }
    }
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值