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()

(二) 原理

  1. 如果执行的sql是查询类型(包含select关键字), 则可以从缓存中获取,查询完毕后也需要缓存
  2. 缓存目录按照cache_dir/控制器.方法名/md5($sql)的目录来管理,文件中存储serialize之后的查询结果
  3. 如果是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)

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

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 奥迪q7电瓶没电怎么办 一岁宝宝坐不稳怎么办 2岁宝宝不肯把尿怎么办 踢足球上肢和下肢不协调怎么办 ppt文字放映时重叠怎么办 月子8天腰背疼怎么办 生完五天腰背疼怎么办 生完孩子腰不好怎么办 养了个白眼狼怎么办 孩子学东西很慢怎么办 手不小心碰肿了怎么办 腿中间摩擦的疼怎么办 晚上睡觉时双腿酸胀怎么办 腿擦破皮了怎么办 快速好 宝宝腿擦破皮了怎么办 新生儿睡觉腿喜欢弯曲怎么办 孩子八个月交叉走路怎么办 胫椎引起双腿发热怎么办 婴儿头型睡扁了怎么办 膝盖抻筋了疼怎么办 小腿肚子抻筋了怎么办 后背抻筋了 很疼怎么办 运动膝盖抻着了怎么办 大腿内侧抻着了怎么办 大腿抻筋了 很疼怎么办 小腿肚子聚筋了怎么办 6个月婴儿腿弯怎么办 胳膊抻筋拉伤了怎么办 宝宝抻着了怎么办妙招 拎东西胳膊抻了怎么办 小臂一用力筋疼怎么办 摔破胳膊很痛怎么办 胳膊的筋扭伤了怎么办 小孩胳膊抻筋了怎么办 肩膀抻着了怎么办妙招 右边肩膀抻着了怎么办 胳膊因劳累很痛怎么办 宝宝胳膊摔了疼怎么办 宝宝胳膊抻筋了怎么办 孕妇胳膊筋伤了怎么办 刚进公司就怀孕怎么办