(一) 使用
创建缓存文件目录, 保证目录可写
在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)
结论:
如果数据库负载比较高的话,开启缓存会起到一定作用。
版权声明:本文为博主原创文章,未经博主允许不得转载。