数据库查询结果缓存
为了提高接口访问速度,并减小数据库压力,我重写了 Illuminate\Database\Query\Builder ,将所有的查询结果都缓存在 Redis 里(主要是懒,不想花时间去一个一个找热点数据)。
目前这是我想到的“一招制敌”办法,可以不用花时间找热点数据,还能提高访问速度,减轻 DB 压力,这样做可以吗?还有没有什么更好的 办法 和 工具?
下面是重写的简化代码:
protected function runSelect()
{
if($this->enableCache && $this->isShouldBeCached()){
$caching_key = $this->getCachingKey();
$caching_data = \Redis::get($caching_key);
if($caching_data){
// 命中缓存后延长过期时间
\Redis::expire($caching_key, $this->cachingTime);
return unserialize($caching_data);
}
$caching_data = parent::runSelect();
\Redis::set($caching_key, serialize($caching_data), 'EX', $this->cachingTime);
return $caching_data;
}
return parent::runSelect();
}
顺便发个小广告,我把我想的办法做成了一个插件,希望大佬们可以指点一下:GitHub: laravel-db-caching
这里还有个问题:
怎样可以做到在增 删 改操作后,将新数据刷新到缓存里?
我想到将 SQL 语句保存下来,增删改操作后再重新执行查询。
但这种只针对简单的 where id > {id} 有效。对于 where id in (1,2) 这种 甚至于复杂的查询,就不一定能起作用了,导致重新查询的结果没有变化。希望大佬们能给我指点下。
关于 LearnKu
推荐文章: