当前位置:Gxlcms > PHP教程 > 一直不太理解为什么用了smarty还要用memcache

一直不太理解为什么用了smarty还要用memcache

时间:2021-07-01 10:21:17 帮助过:11人阅读

都说smarty + memcache配合用是很好的优化组合,但我不明白为什么用了smarty还要用memcache~
因为smarty不是有页面缓存吗,比如现在有个页面A,我规定它缓存的时间是10分钟,那它只要每十分钟逻辑运算一次就可以了。还要memcache有什么用呢?

能给我举个小例子说明smarty和memcache在什么情况下配合使用吗?

谢谢各位!


回复讨论(解决方案)

存的地方不一样,memcache是存到内存中的,smarty是存到硬盘上的,读数据肯定是从内存中读取快,你看哈这2个的原理吧

存的地方不一样,memcache是存到内存中的,smarty是存到硬盘上的,读数据肯定是从内存中读取快,你看哈这2个的原理吧



这个我知道啊。。
你的一色就是说:memcache比smarty静态缓存要快,对吗?

既然smarty可以cache了。为什么还要用 memcache ?

这个道理很简单:由于运行机制和适用范围的不同,smarty 只被少数初级php程序员使用;而 memcache 被广泛的采纳,并由此衍生出基于内存的数据库系统

既然smarty可以cache了。为什么还要用 memcache ?


那是两种优化一般不一块使吗?

这个道理很简单:由于运行机制和适用范围的不同,smarty 只被少数初级php程序员使用;而 memcache 被广泛的采纳,并由此衍生出基于内存的数据库系统


啊?静态页缓存现在不是挺流行的吗?

一个是针对数据,一个针对的被访问的页面,例如最长用的方式将查询出来的条数据存入memcache,而有些页面实时刷新要求不高的那么就smarty的缓存了,作用的范围不同,就像你吃了胡萝卜还要吃西瓜差不多,吃胡萝卜是增加维生素C,吃西瓜是增加维生素D,这个如果还迷糊,你可以先不必纠结,等以后慢慢就知道了

一个是针对数据,一个针对的被访问的页面,例如最长用的方式将查询出来的条数据存入memcache,而有些页面实时刷新要求不高的那么就smarty的缓存了,作用的范围不同,就像你吃了胡萝卜还要吃西瓜差不多,吃胡萝卜是增加维生素C,吃西瓜是增加维生素D,这个如果还迷糊,你可以先不必纠结,等以后慢慢就知道了


嗯,那比如现在有一个页面,要求5分钟一刷新就可以,其中有三条从数据库获取的结果集。
那我就将这个页面设置成5分钟静态缓存更新一次。

比如这种情况,那用不用memcache不是一样的吗?

引用 7 楼 的回复:

一个是针对数据,一个针对的被访问的页面,例如最长用的方式将查询出来的条数据存入memcache,而有些页面实时刷新要求不高的那么就smarty的缓存了,作用的范围不同,就像你吃了胡萝卜还要吃西瓜差不多,吃胡萝卜是增加维生素C,吃西瓜是增加维生素D,这个如果还迷糊,你可以先不必纠结,等以后慢慢就知道了

嗯,那比如现在有一个页面,要求5分钟一刷新就可以,其中有三……


不一样,因为就算你页面缓存了,但是你每次刷新页面后台都要select数据库,只是前台页面没有变化而已,但是如果你用了memcache,例如时间也是5分钟,那么在这5分钟时间里是不会查询数据库的,这样数据库资源就节省了,是不是啊,而smarty的缓存不过是省下了解析模板变量的作用,其实这两者之间的关系并不太大,唯一共同点就是都叫缓存,其他的根本就不能进行对比

引用 8 楼 的回复:

引用 7 楼 的回复:

一个是针对数据,一个针对的被访问的页面,例如最长用的方式将查询出来的条数据存入memcache,而有些页面实时刷新要求不高的那么就smarty的缓存了,作用的范围不同,就像你吃了胡萝卜还要吃西瓜差不多,吃胡萝卜是增加维生素C,吃西瓜是增加维生素D,这个如果还迷糊,你可以先不必纠结,等以后慢慢就知道了

嗯,那比如现在有一个页面,……


啊???
smarty不是有一个判断当前页面是否缓存了的函数吗:is_cached()
用它判断一下,如果已经有缓存了且没过期,就不用查数据库了啊,直接读静态文件了。

两个不同的东西...像kyzy说的。虽然都说是为缓存服务,但是缓存的具体对象和实现方法不太一样。虽然经过各种SM后也能够彼此通融些,但是就有点脱裤子了。

简单说smarty缓存最终的结果.memcache缓存中间的部分.当然这样说也比较笼统,但多少你能知道他们不是为了解决相同问题的交集。

smarty 的 cache 是基于文件的,可称为 filecache
访问文件肯定要比访问内存要慢
所以才有 smarty + memcache 一说
也就是说可以修改 smarty 将 cache 放到 memcache 中去

至于用什么,怎么用,那都是方案问题。与实现技术无关

啊???
smarty不是有一个判断当前页面是否缓存了的函数吗:is_cached()
用它判断一下,如果已经有缓存了且没过期,就不用查数据库了啊,直接读静态文件了。



你总不能每个方法都判断吧

嗯大家说的这两个东西的区别我了解了,谢谢大家!
但是,我现在最困惑的就是不知道在什么情况下两者可以配合用,就比如我刚才说的那个例子:

有一个页面,要求每5分钟刷新一次,其中有三条从数据库获取的结果集。
我将这个页面用smarty设置静态缓存,且缓存周期是5分钟。
然后用smarty的is_cached()方法判断是否有缓存且未过期,如果条件成立,就可以直接读取静态文件,反之则重新获取值。

那像这种情况,即便用memcache保存这三条结果集,是不是也没什么效果了?
那什么情况两者能配合着用呢?我只是想知道一个小例子。
谢谢大家!

引用 10 楼 的回复:
啊???
smarty不是有一个判断当前页面是否缓存了的函数吗:is_cached()
用它判断一下,如果已经有缓存了且没过期,就不用查数据库了啊,直接读静态文件了。


你总不能每个方法都判断吧


你是指的在每个控制器的方法里吗?
我觉得可以用吧~~~~每个方法里都用有什么不好的地方吗?

其实就是缓存存储位置的区别,当你is_cached()判断可以读取缓存之后,smarty就会去读缓存,问题是这个缓存在磁盘上,而磁盘是个比较慢的东西,当访问量很大时,大量的磁盘读取就会堵塞,系统的性能就会大幅下降.而memcache在内存中,比磁盘要快上几个数量级,不太会堵塞.

这个道理很简单,

人气教程排行