关于缓存,诸多疑问

2011-04-13 21:03:17 +08:00
 levon
我是一个前端程序员,稍微涉及些后端,对缓存一概念有诸多疑问。

1.浏览器缓存,这个是浏览器自己的功能吧,跟web server怎么设置是没关系吧

2.web server设置某个文件的过期时间,apace 中在htaccess中设置一些静态文件的过期时间,这个是什么意思,比如http://l.yimg.com/a/i/mntl/ww/events/p.gif设置了过期时间是2012年12月,是不是这个图片就在服务器的内存中存放着呢,还是在客户端存放着,当客户端再次发出请求是忽略被缓存的项,直接从本地提取?

3.像Memcached这样的软件只能是对某一个对象的缓存是吗,把对象通过程序放在内存中而不是硬盘或者数据库,比如从数据库读回一个实体列表后保存在内存中,当程序再获取时就从内存中读,而不是数据库。是这样理解吗?

4.squid又是什么用途,是不是跟语言程序不挂钩的,直接对网页或者一些图片的缓存,比如当客户端请求一个sample.php的时候,网页的html代码,html代码涉及到的内容都是从内存读取吗?(当然假定已读取过,缓存没到期)


真的想好好了解下缓存,在web开发中有哪些形式的缓存,各种类型缓存的实现辅助的组件等等
4949 次点击
所在节点    问与答
16 条回复
chone
2011-04-13 21:17:45 +08:00
1,有关系,本地缓存虽然是浏览器来实现的,但是是否缓存已经何时更新是由 Header 的相关参数来控制的。

2,Expires就是1里说的相关参数。

3,基本上是这样。

4,squid主要是用来做代理的。

不要把浏览器缓存,和服务器的缓存混在一起,这两个不是一个东西,前者是在client端缓存文件,后者是在sever缓存数据(一般用来减少数据库的访问)。他们没有直接联系。
SuperOS
2011-04-13 21:21:02 +08:00
再多科普点撒
squid / memcached
levon
2011-04-13 21:40:26 +08:00
@chone 感谢,

再问个问题,比如就拿blog来说,每篇blog,一整个网页,这样一个页面级的(包括页面中包含的css, js, image等元素)要做缓存一般是如何实现呢,用Memcached这个级别好像不符合(适合的是从数据库读取blog内容),而页面级更多是基于把硬盘的数据读到内存缓存着,这种级别的怎么做到呢
TheOnly92
2011-04-13 21:42:39 +08:00
一般个别文件 (css, js) 都是让客户端缓存,这个可以在 apache 或者其他 webserver 设置。memcache 一般用来缓存数据查询等经过处理的数据。
chone
2011-04-13 21:47:21 +08:00
@levon 对于静态文件设置一个正确的Expires值,细节可以google一下
levon
2011-04-13 21:54:31 +08:00
@TheOnly92 这样一个场景,比如我刚访问了一个blog/foo.php,这个页面是诸多次读取数据库的结果,我想等第二次访问,第三次访问的人不要读数据库(由于对象很多,用memcache来存很麻烦),直接从内存中读取整个页面的内容,这种解决方案是什么呢。
shanghaikid
2011-04-13 21:58:14 +08:00
还有html5 localstorage 可以用来做缓存 你可以去看看google mobile 的源码,不过这个也是前后端配合才能实现的
TheOnly92
2011-04-13 22:00:55 +08:00
这还得看,有些地方如果要花很多时间处理就最好缓存,有些地方不需要的话也不用缓存。比较理想的缓存对象是大家都会用到的,而且要花很多时间处理的查询。
levon
2011-04-13 22:05:27 +08:00
还有一点,我曾经在的一个公司,公司网站是.net做的,托管的是windows server,但是公司还有5,6十台的Linux服务器,那linux在这扮演什么角色呢
chone
2011-04-13 22:06:04 +08:00
@levon 这样只能用memcache这样的服务端缓存,要么就是用squid来实现的缓存服务器。你可以把最后生成的数据或者是页面放到服务器缓存里。
hooopo
2011-04-13 22:08:38 +08:00
这本书对前端工程师很有用:http://book.douban.com/subject/3132277/
hooopo
2011-04-13 22:26:58 +08:00
3.其实把对象存在db/文件系统/memcached的前提是对象需要能够被序列化和反序列化的。虽然也叫内存,但是和应用程序的环境是隔离的。memcached的优点是get/set速度快,并且可以分布式。缺点是不能持久化。
TheOnly92
2011-04-13 22:31:41 +08:00
那要看在 linux 装了什么软件吧。
hooopo
2011-04-13 22:38:35 +08:00
@levon 你上面说的那个场景用解决方案很多的。用memcache也很简单:把第一次生成的整个页面存到里面。第二次读取的时候直接从memcache里面取数据就是了。至于清理缓存方式是基于时间还是基于model这个由你的业务逻辑决定。
SuperOS
2011-04-13 23:45:10 +08:00
@hooopo 像v2ex这种,大量写入同时大量读取的时候,怎么权衡数据的缓存和更新呢?
icyflash
2011-04-13 23:52:00 +08:00
会在写入后,立即通知缓存更新

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/11419

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX