redis快取分類

2021-08-29 10:06:40 字數 3174 閱讀 4766

場景:

前端需要根據條數num限制獲取分類,快取為8小時,減少訪問效能

實現原理:

獲取分類列表時,先判斷是否能在快取中得到資料,如果有直接展示,如果沒有,要先去查資料,然後再快取。新增分類時要重新處理快取,新增成功後,先把清理快取,再查詢資料庫快取新的資料。

遇到問題:

當新增成功後,快取為10條資料,這個獲取快取想要得到的6條資料

解決方案:

1、在快取時根據key+條數作為新的key,

2、直接在讀取快取資料中擷取想要的條數

解決方案1的**:

class messagecategory extends messagecategorymodel

/*** 新增分類方法

* @param varchar $name 分類名稱

* @param bool $cid 繫結分類id

* @return array $data 響應資料

*/public function addmessagecategory()

/*** 插入資料到資料庫

*/$info = db_find("message_category", $fields = "*",$where = ['name'=>$validateresult['name']]);

if($info)

$result=$this->insertmessagecategory($validateresult);

if($result)else

/**

*獲取分類列表

* @function

*/public function getmessagecategorylistall()

//先判斷是否有條件限制,有的話,快取key:key+num,沒有的話,key:key

if (!empty($validateresult['num']))

//是否存在新的key

$has_msg_key = redispage::instance()->get(self::$msg_key);

if (!empty($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))else

$value = redispage::instance()->serialize($result);

redispage::instance()->setex(self::$key, $redisconfig['message_category_expire_time'], $value);

}if($result)else

}/**

* 刪除分類

* @param int id 分類id

* @return array $data 響應資料

*/public function delmessagecategory()

/*** 刪除資料

*/$result=$this->deletemessagecategory($validateresult);

if($result)else

}}

解決方案2的**

class messagecategory extends messagecategorymodel

/*** 新增分類方法

* @param varchar $name 分類名稱

* @param bool $cid 繫結分類id

* @return array $data 響應資料

*/public function addmessagecategory()

/*** 插入資料到資料庫

*/$info = db_find("message_category", $fields = "*",$where = ['name'=>$validateresult['name']]);

if($info)

$result=$this->insertmessagecategory($validateresult);

if($result)else

/** 獲取分類列表

* @function

*/public function getmessagecategorylistall()

//先查詢快取,如果沒有查資料庫後再快取

$message_career_category = redispage::instance()->get(self::$key);

if (!empty($message_career_category))else

$redisconfig = conf::all('redis');

$value = redispage::instance()->serialize($result);

redispage::instance()->setex(self::$key, $redisconfig['message_category_expire_time'], $value);

}if($result)else

return $this->returnmessage(1001,'響應成功',$data);

}else

}/**

* 刪除分類

* @param int id 分類id

* @return array $data 響應資料

*/public function delmessagecategory()

/*** 刪除資料

*/$result=$this->deletemessagecategory($validateresult);

if($result)else

}}

快取 redis 快取穿透

哪一些因素 考慮使用redis,畢竟 redis 也要增加成本 1 熱點資料 2 讀的成本非常大 3 讀多寫少 4 對資料一致性要求 沒有那麼嚴格 可以出現資料與資料庫不一致 1 秒殺場景 3 物流查詢軌跡 熱點資料 啟用的資料是被快取到redis 當中 快取key 乙個時間點過期的時候,如果快取資...

MySQL快取分類

mysql快取分類 innodb緩衝池 innodb日誌檔案和myisam資料的作業系統快取 myisam鍵快取 查詢快取 無法手工配置的快取,例如 二進位制日誌,表定義檔案的作業系統快取 其它快取,通常不需要太多記憶體 innodb緩衝池 innodb buffer pool size 作用 1....

MySQL快取分類

mysql快取分類 innodb緩衝池 innodb日誌檔案和myisam資料的作業系統快取 myisam鍵快取 查詢快取 無法手工配置的快取,二進位制日誌,表定義檔案的作業系統快取 其它快取,通常不需要太多記憶體 innodb緩衝池 作用 1.快取的物件包括 資料行,索引,插入緩衝,鎖,以及內部資...