CI源码分析(四)—DB查询缓存

(一) 使用

创建缓存文件目录, 保证目录可写

在config/database.php中配置缓存路径 : db[‘default′][‘cachedir′]=‘path/to/cache/dir′启用||关闭缓存:可以使用代码控制,只对部分代码生效–this->db->cache_on(), this?>db?>cacheoff();也可以通过配置文件配置,对所有代码生效—db[‘default’][‘cache_on’] = true; 建议在配置文件中关闭,然后在使用的地方自己打开,使用完毕后立刻关闭

删除缓存: $this->db->cache->delete()

(二) 原理

如果执行的sql是查询类型(包含select关键字), 则可以从缓存中获取,查询完毕后也需要缓存

缓存目录按照cache_dir/控制器.方法名/md5($sql)的目录来管理,文件中存储serialize之后的查询结果

如果是write类型的sql, 需要删除相关缓存(控制器.方法名)(/^\s*”?(SET|INSERT|UPDATE|DELETE|REPLACE|CREATE|DROP|TRUNCATE|LOAD DATA|COPY|ALTER|GRANT|REVOKE|LOCK|UNLOCK)\s+/i)都算作write类型

(三) 扩展

暂时还没实现,主要想解决两个问题

缓存到文件或者redis可选

缓存过期策略

 缓存到redis思路

database.php增加cache_from选项

重写db_drvier中的_cache_init()方法,根据cache_from选项加载不同的cache类

 缓存过期策略思路

缓存过期可以是主动删除或者设置过期时间,需要根据不同业务场景实现

现有的策略是手动删除或者当前url有write类型的sql执行,则删除当前url下的所有缓存。坏处是,很多write操作都是跟select不在一个action的。所以只能人为控制,write之后,需要更新哪些缓存

过期时间一定要加上,一旦手动删除缓存漏掉,起码不会造成缓存长时间存在

最好是手动删除+过期时间配合使用

有个一思路是:write类型的sql发生时,找到所有跟这个被write的table相关的缓存,删除。现在这个查找的策略没想好

(四)缓存的效果

只有在数据库读负载很高,并且多数读取内容的更新频率比较低的时候开启读取缓存效果比较明显

160万数据

简单查询

select * from test limit 10000,10;

apache ab test结果

不开启缓存

Requests per second: 90.23 [#/sec] (mean)

Time per request: 110.830 [ms] (mean)

Time per request: 11.083 [ms] (mean, across all concurrent requests)

开启(cache from file)

Requests per second: 151.28 [#/sec] (mean)

Time per request: 66.104 [ms] (mean)

Time per request: 6.610 [ms] (mean, across all concurrent requests)

开启(cache from redis)

Requests per second: 119.10 [#/sec] (mean)

Time per request: 83.960 [ms] (mean)

Time per request: 8.396 [ms] (mean, across all concurrent requests)

结论:

如果数据库负载比较高的话,开启缓存会起到一定作用。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-11-10 20:31:28

CI源码分析(四)—DB查询缓存的相关文章

CI源码分析(三)—DB事务

(0) 使用方法 可以使用系统提供的方法: $this->db->trans_start(); // 开始事务 $this->db->query(); // 执行sqls $this->db->trans_complete(); // 结束事务(不需要关心是否回滚) if !$this->db->trans_status do something; // 错误处理 也可以自己处理commit和rollback: $this->db->trans_

Solr4.8.0源码分析(5)之查询流程分析总述

Solr4.8.0源码分析(5)之查询流程分析总述 前面已经写到,solr查询是通过http发送命令,solr servlet接受并进行处理.所以solr的查询流程从SolrDispatchsFilter的dofilter开始.dofilter包含了对http的各个请求的操作.Solr的查询方式有很多,比如q,fq等,本章只关注select和q.页面下发的查询请求如下:http://localhost:8080/solr/test/select?q=code%3A%E8%BE%BD*+AND+l

baksmali和smali源码分析(四)

baksmali 首先执行的第一个main 函数     public static void main(String[] args) throws IOException {         Locale locale = new Locale("en", "US");         Locale.setDefault(locale);         CommandLineParser parser = new PosixParser();         C

Nouveau源码分析(四):NVIDIA设备初始化之nouveau_drm_load (1)

Nouveau源码分析(四) probe函数成功返回之后,DRM模块就会调用struct drm_driver的load函数,对应nouveau的nouveau_drm_load. 这个函数虽然看起来不是特别长,但每一个调用的函数展开后就会变得非常长了! // /drivers/gpu/drm/nouveau/nouveau_drm.c 364 static int 365 nouveau_drm_load(struct drm_device *dev, unsigned long flags)

mybatis源码分析(四) mybatis与spring事务管理分析

mybatis源码分析(四) mybatis与spring事务管理分析 一丶从jdbc的角度理解什么是事务 从mysql获取一个连接之后, 默认是自动提交, 即执行完sql之后, 就会提交事务. 这种事务的范围是一条sql语句. 将该连接设置非自动提交, 可以执行多条sql语句, 然后由程序决定是提交事务, 还是回滚事务. 这也是我们常说的事务. Connection connection = dataSource.getConnection(); // connection.setTransa

Mybatis源码分析之Cache二级缓存原理 (五)

一:Cache类的介绍 讲解缓存之前我们需要先了解一下Cache接口以及实现MyBatis定义了一个org.apache.ibatis.cache.Cache接口作为其Cache提供者的SPI(ServiceProvider Interface) ,所有的MyBatis内部的Cache缓存,都应该实现这一接口 Cache的实现类中,Cache有不同的功能,每个功能独立,互不影响,则对于不同的Cache功能,这里使用了装饰者模式实现. 看下cache的实现类,如下图: 1.FIFOCache:先进

mybatis源码分析之05一级缓存

首先需要明白,mybatis的一级缓存就是指SqlSession缓存,Map缓步! 通过前面的源码分析知道mybatis框架默认使用的是DefaultSqlSession,它是由DefaultSqlSessionFactory创建的,下面是源码 private SqlSession openSessionFromDataSource(ExecutorType execType, TransactionIsolationLevel level, boolean autoCommit) { Tran

mybatis缓存源码分析之浅谈缓存设计

一般我们用到缓存的时候,只知道他很快,很强,还能持久,但是为什么他可以做到这些呢,有人会说这是天赋,遗传的,是的,你想的没错,确实是大佬们在构造这些的时候,赋予他这些能力,那今天我们就来剖析一下,大佬们干了啥,区区缓存就能这么厉害. 去大厂面试的时候,面试官总会喜欢问为什么,一开始,完全搞不懂我就去拧个螺丝,你问我造火箭怎么造我咋知道,后来在工作中遇到各种各样的问题,解决不了的时候,看着身边大佬们一层层点进去看源码分析问题的时候,瞬间觉得这多牛逼啊,或许一开始有动力看源码,了解为什么就是因为这个

ABP源码分析四十七:ABP中的异常处理

ABP 中异常处理的思路是很清晰的.一共五种类型的异常类. AbpInitializationException用于封装ABP初始化过程中出现的异常,只要抛出AbpInitializationException异常就可以,无须做额外处理.这类异常往往是需要维护人员介入分析的. 其他四个异常都在AbpController中被集中处理,处理分为两步:一,通过EventBus触发异常事件,相应的异常处理函数则处理异常.而针对AbpValidationException,UserFriendlyExce