V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
levon
V2EX  ›  问与答

关于缓存,诸多疑问

  •  
  •   levon · 2011-04-13 21:03:17 +08:00 · 5072 次点击
    这是一个创建于 5006 天前的主题,其中的信息可能已经有所发展或是发生改变。
    我是一个前端程序员,稍微涉及些后端,对缓存一概念有诸多疑问。

    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开发中有哪些形式的缓存,各种类型缓存的实现辅助的组件等等
    16 条回复    1970-01-01 08:00:00 +08:00
    chone
        1
    chone  
       2011-04-13 21:17:45 +08:00
    1,有关系,本地缓存虽然是浏览器来实现的,但是是否缓存已经何时更新是由 Header 的相关参数来控制的。

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

    3,基本上是这样。

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

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

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