[讨论]:万物皆可缓存,浅谈缓存之道
时间:2009-05-26
来源:互联网
[构想]:我们可以将用户查询的结果或者经常用到的一些数据或者是一些中间变量缓存至CACHE,在TP中建立了比较完善的cache机制,有文件和其它的第三方控制的缓存机制,这样便于我们灵活的掌握以结省效率。
这里只提出两类构想,第一类我这里称为:db->arrray 即数据库缓存至数组,先放出代码,各位大侠指点一下。
- function dbtoary($table,$condition='',$encache=1,$cache_life=5){
- if($table==''){return false;}
- $cache_life=($cache_life<0)?-1:$cache_life*60;//以分钟为单位
- $table=ucfirst($table);
- $my_cond=(is_array($condition))?array_string($condition,' and '):$condition;//array_string是将数据的键和值变成字符串
- $is_cache=($encache==0)?true:false;
- if(1==$encache)
- {$temp_data = S('temp_'.$table.$my_cond);
- if($temp_data['condition']==$my_cond and ($temp_data['cache_life']==-1 or $temp_data['cache_life']>time()))
- {$is_cache=true;return $temp_data['data'];}
- }
- $Dao = D("$table");
- $list = $Dao->where($my_cond)->select();
- if(false===$list){return false;}
- if($encache>1 or false==$is_cache)
- {$data['condition']=$my_cond;
- $data['cache_life']=($cache_life<=0)?-1:time()+$cache_life;//以分钟为单位;
- $data['data']=$list;
- S('temp_'.$table.$my_cond,$data,$cache_life);
- }
- return $list;
- }
$data = dbtoary("User",array('sex'=>1));
来进行读取数据,函数默认为5分钟,可以根据具体情况进行调整缓存时间,如置为-1则永久缓存。
函数存储了用户的条件请求,数据表,以数据表,条件请求为结果,进行缓存。
函数存储了用户的条件,有效期时间(其实这项也可以省略,但我本人的项目因为缓存比较多,所以存储这项以免一些不毕要的载入cache错误,此项可根据需要进行修改)过期则重新载入。
此种方法的缺点:如果客户找不到数据则此项会做的工作比直接读取数据来得更麻烦,所以针对须要的做是最好的。
[注]:此方法适用于变化不是太大的非实时环境下使用,如果是实时环境,并且客户端要求实时更新而非间歇性更新的话,此方法慎用
[后续思路]:我们还可以将一些常用的东西进行缓存以后直接读取,免得再找数据库麻烦,个人认为文件操作要比数据库操作快(当然如果是分步式的数据库例外),如果有条件可以设置memcached等缓存机制,直接放在内存中肯定是最快的。
我上面只是举了个例子将数据库存为数组,很多时候我们可能要应用到db->select的操作即数据库中的某个值存为前端显示的select选择项的操作,这点也是类例的。当然其它的概念还有很多,这里只是列出个思路。
呵呵,还有些比较疯狂的想法(个人还没有实现),如果有可能所有的数据库中的数据都可以建立一次缓存(呵呵,这样要数据库就没用了,呵呵,数据库只能当做备份),并建立一个数据表数组,例如有数据库中有三个表 user,classroom, teacher .我们就建立一个数组$cache=array('user'=>1,'classroom'=>1,'teacher'=>1);
缓存所有的数据表,将数据表user的值进行改动时致 $cache['user']=0;然后在缓存机制中如果检测到cache中相应的值为0的话重新缓存数据否则就用原来的数据,呵呵。我们的列表,操作什么的就都可以针对此缓存来进行,分页,查找什么的也可以针对这个来进行。当然这种方法适用范围要比较注意,不然可能起到反效果。
说了这么多,只是提出我的一些想法,各位大大多多指正呀。关键是看帖了后一定要回,不然俺都没啥激情了。
作者: leon_studio 发布时间: 2009-05-26
作者: phpquanchao 发布时间: 2009-05-26
呵呵,万物皆可缓存,也许是的,
但我个人觉得,要看项目的特性和实际所需,
如果更新频繁的内容,
或者缓存过程涉及过多逻辑,
我还是主张该怎么样还是怎么样。
任何功能的使用我都觉得 有个度才好
作者: zzguo28 发布时间: 2009-05-26
作者: tdweb 发布时间: 2009-05-26
作者: leon_studio 发布时间: 2009-05-27
作者: ckson 发布时间: 2009-06-03
其实从速度上看还是 大家讨论下 生成到内存中呵呵。。。。
作者: baddull 发布时间: 2009-06-06
作者: leon_studio 发布时间: 2009-06-07
作者: cuish 发布时间: 2009-06-21
作者: di2ci 发布时间: 2009-06-28
个人认为,用到缓存的地方通常是全站共享的数据作为缓冲比较好,打个例子做个购物网,产品分类肯定是核心部件。我们将它 unserialize() 序列化缓存。修改、新增、删除 产品分类是才触发更新缓存。这样,其他逻辑脚本需要用到产品分类,就直接读取缓存吧。而且,还可以用多种风格的CSS+div 样式来封装这个产品分类,输出千变万化的分类导航菜单。这样,就达到了一点缓存,多点共享的目的。
作者: jianjin712 发布时间: 2009-07-09
至于搜索这样的,还是直接读数据库的好
作者: byyy521 发布时间: 2009-09-17
个人认为,用到缓存 ...
jianjin712 发表于 2009-7-9 19:10
也就是做一个初始作用。
作者: wind4 发布时间: 2010-05-15
作者: Messi 发布时间: 2010-06-03
只看懂一半半
作者: nuan1989 发布时间: 2010-06-24
作者: moore0903 发布时间: 2010-09-02
作者: 541907190 发布时间: 2010-09-07
作者: ayuelee 发布时间: 2010-09-13
作者: wclssdn 发布时间: 2010-09-15
作者: a68460266 发布时间: 2011-06-08
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28