CI源码分析(四)—DB查询缓存
来源:互联网 发布:毕业设计java贪吃蛇 编辑:程序博客网 时间:2024/05/04 23:28
(一) 使用
0. 创建缓存文件目录, 保证目录可写
1. 在config/database.php中配置缓存路径 :
$db['default']['cache_dir'] = ‘path/to/cache/dir'
2.启用||关闭缓存 :
(a) 可以使用代码控制,只对部分代码生效
// 开启$this->db->cache_on();// 关闭$this->db->cache_off();
(b)也可以通过配置文件配置,对所有代码生效
$db[‘default’][‘cache_on’] = true;
建议在配置文件中关闭,然后在使用的地方自己打开,使用完毕后立刻关闭
3.删除缓存: $this->db->cache->delete()
(二) 原理
- 如果执行的sql是查询类型(包含select关键字), 则可以从缓存中获取,查询完毕后也需要缓存
- 缓存目录按照cache_dir/控制器.方法名/md5($sql)的目录来管理,文件中存储serialize之后的查询结果
- 如果是write类型的sql, 需要删除相关缓存(控制器.方法名)
// 下面都算作write类型/^\s*"?(SET|INSERT|UPDATE|DELETE|REPLACE|CREATE|DROP|TRUNCATE|LOAD DATA|COPY|ALTER|GRANT|REVOKE|LOCK|UNLOCK)\s+/i)
(三) 扩展
暂时还没实现,主要想解决两个问题
- 缓存到文件或者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)
结论:
如果数据库负载比较高的话,开启缓存会起到一定作用。
- CI源码分析(四)—DB查询缓存
- CI源码分析(三)—DB事务
- CodeIgniter(CI)缓存分析
- ci连接数据库db是否影响缓存
- OkHttp 3.7源码分析(四)——缓存策略
- OkHttp 3.7源码分析(四)——缓存策略
- Guava缓存器源码分析——数据查询
- CI框架源码阅读---------DB.php
- CI框架 DB缓存注意:手动开关缓存
- php ci框架 sql查询缓存
- CI源码分析(一)—config配置文件模块
- CI源码分析(二)—Log, 日志模块
- 原理分析之四:一次SQL查询的源码分析
- 原理分析之四:一次SQL查询的源码分析
- 原理分析之四:一次SQL查询的源码分析
- 原理分析之四:一次SQL查询的源码分析
- 原理分析之四:一次SQL查询的源码分析
- jQuery-1.9.1源码分析系列(四) 缓存系统
- Java中的参数传递方式
- [华为机试练习题]21.二维数组的列排序
- DateDiff 函数——计算两个日期之间的时间间隔
- android手机之-------64位操作系统 与 64位处理器
- JSONArray构造方法在不同API上的区别
- CI源码分析(四)—DB查询缓存
- springmvc+spring+jpa(hibernate)+redis+maven配置
- textField.placeholder 设置颜色
- 【hadoop】14、hadoop2.5的mapreduce的 配置
- C++中函数指针的使用
- MYSQL主从同步
- 105.对实数型数保留2位小数
- 嵌入式Linux开发流程
- 在项目里交叉使用Swift和OC