数据库查询结果缓存
为了提高接口访问速度,并减小数据库压力,我重写了 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)
这种 甚至于复杂的查询,就不一定能起作用了,导致重新查询的结果没有变化。希望大佬们能给我指点下。
推荐文章: