场景:
前端需要根据条数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);
}
}
}