SlideShare ist ein Scribd-Unternehmen logo
1 von 34
Downloaden Sie, um offline zu lesen
赵劼
jeffz@live.com
   赵劼,网名老赵,洋名Jeffrey Zhao
   博客:http://www.cnblogs.com/JeffreyZhao/
   推特:@jeffz_cn
   InfoQ中文站编辑
   某创业小公司架构师 + 程序员
   希望可以给给初学者以合适引导。坚定的北大青鸟
    反对者,强烈愤慨恶劣的培训机构对于处于懵懂期
    的初学者以误导,强烈抵制各种虚假广告给业界带
    来的不良影响,强烈建议有理想有抱负的从业青年
    放弃北大青鸟,不要做冤大头。
性能        能耗        冰川
降低        增加        融化



     资源        温室        地球
     浪费        效应        毁灭
   CPU
   磁盘
   浏览器
   DNS
   网页快照
   ……
   客户端缓存
   表现层缓存
   业务逻辑层缓存
   数据访问层缓存
   数据库缓存
   ……
   HTTP/1.1
    ◦ Expires, Max-Age, ETag...
   Request Header
    ◦ If-Modified-Since
    ◦ If-None-Match
   Response Header
    ◦   Expires
    ◦   Cache-Control
    ◦   Last-Modified
    ◦   ETag
   利用HTTP/1.1的标准(同上)
   使用JavaScript编程时缓存数据:
         window.workWithCache = function(id) {
             var data = window._cache["id_" + id];
             if (data != undefined) work(data);

             makeAjaxRequest(id, window.ajaxCallback);
         }

         window.ajaxCallback = function(id, data) {
             window._cache["id_" + id] = data;
             work(data);
         }
   检查缓存No.1~30
                    请求前   请求后
    ◦ 缓存为空
   发出请求
    ◦ 请求图片No.1~30
   收到回复
    ◦ 缓存图片No.1~30
   显示图片
    ◦ 显示图片No.1~30
   检查缓存No.41~70
                     请求前   请求后
    ◦ 缓存为空
   发出请求
    ◦ 请求图片No.41~70
   收到回复
    ◦ 缓存图片No.41~70
   显示图片
    ◦ 显示图片No.41~70
   检查缓存No.21~50
                     请求前   请求后
    ◦ 发现缓存No.21~30
    ◦ 发现缓存No.41~50
   发出请求
    ◦ 请求图片No.31~40
   收到回复
    ◦ 缓存图片No.31~40
   显示图片
    ◦ 显示图片No.21~50
   便利:
    ◦ 单线程环境,避免许多麻烦
    ◦ 对于生命周期短的页面,无须资源释放
   限制
    ◦ 无法跨页面缓存
    ◦ 刷新后缓存即清空
    ◦ 对于生命周期长的页面,需要制定资源释放策略
     何时释放数据?
     释放哪些数据?
   静态页
    ◦ 粒度过大
    ◦ 几乎无法用于一般Web 2.0系统
   整页动态缓存
    ◦ 灵活性较静态页略高
    ◦ 粒度仍然过大
   页面片断缓存(fragment caching)
class BlogController < ApplicationController
  def list
    unless read_fragment(:action => 'list' )
      @articles = Article.find_recent
    end
  end
end


<% cache do %>   <!- Here's the content we cache ->
  <ul>
    <% for article in @articles -%>
      <li><p><%= h(article.body) %></p></li>
    <% end -%>
  </ul>
<% end %>
   某些时候因为@articles没有初始化而出错
   详见Robin Lu于RubyConf China 2009中的演讲
    “Ruby on Rails Pitfalls”,Page 10
public class BlogController : Controller {
    public ActionResult List() {
        var model = LazyBuilder.Create<Model>()
            .Setup(m => m.Articles, () => Article.FindRecent())
            .Instance;
        return View(model);
    }
}
<% Html.Cache("recent-articles", () => { %>
    <ul>
        <% foreach (var article in Model.Articles) { %>
            <li><p><%= article.Body %></p></li>
        <% } %>
    </ul>
<% } %>
   使用相对方便,性能优势明显
   粒度较大,适用面相对较窄
    ◦ “即时性”往往不够
   与业务密切相关的缓存
    ◦ 推荐好友
    ◦ 最新文章
    ◦ ……
   一般用于缓存实体对象
   控制灵活
    ◦ 相对容易设计“即时”的缓存
   复用概率大
    ◦ 命中率
Cache




Page
Cache




Page
   站内短消息列表
    ◦ 帖子列表
    ◦ 回复列表
    ◦ 好友列表
   分页显示
   即时更新
   缓存每页数据时,附带获取数据时的时间戳
    ◦ data + read_timestamp
   在发生更新时,刷新时间戳
    ◦ last_updated_timestamp
   读取缓存时,比较数据获取时间与最后更新时间
    ◦ 如read_timestamp > last_updated_timestamp,则
      cache hit
    ◦ 如read_timestamp < last_updated_timestamp,则
      cache miss
Comment[] GetComments(int articleId, int page) {
    DateTime lastUpdated;
    var cached = GetFromCache(articleId, page, out lastUpdated);

    if (cached == null || cached.TimeStamp < lastUpdated) {
        var data = GetFromDatabase(articleId, page);
        cached = new CacheEntry(data, DateTime.Now);
        SetToCache(articleId, page, cached);
    }

    return cached;
}

void AddComment(Comment comment) {
    ... // write to database
    SetLastUpdatedToCache(comment.ArticleID, DateTime.Now);
}
   共享引用问题
   并发环境下的缓存操作
    ◦ 博客园评论列表
   缓存数据大小
   是否每个数据都要缓存?
    ◦ 爬虫访问?
    ◦ N年前的数据?
   是否每种数据的缓存策略都相同?
    ◦ 存储方式?
    ◦ 过期策略?
Data Access Layer



R
                   W




       RDBMS
   手机之家数据访问组件(引用自许超前的博文)
   是否透明?
    ◦ 多种数据库
    ◦ 多存储方式(RDBMS,K/V存储)
   即时性如何?
    ◦ 数据复制
    ◦ CAP
   是否能够应对所有形式的查询?
    ◦ 功能 vs. 复杂度
   是否一定需要缓存?
    ◦ 复杂查询
    ◦ 并发操作
   手机之家新系统介绍及架构分享
   数据库缓存优化:拆表
   避免缓存滥用
    ◦ 缓存不是万能的
    ◦ 缓存带来复杂度
   业务为技术让步
    ◦ e.g. 难道“即时”就那么重要吗?
   Consistent Hash
Web开发中的缓存
Web开发中的缓存
Web开发中的缓存
Web开发中的缓存

Weitere ähnliche Inhalte

Was ist angesagt?

nodejs在微博前端开发中的应用
nodejs在微博前端开发中的应用nodejs在微博前端开发中的应用
nodejs在微博前端开发中的应用dong yuwei
 
Template mb-kao
Template mb-kaoTemplate mb-kao
Template mb-kaoxwcoder
 
DBA学院课程之:MySQL故障诊断案例
DBA学院课程之:MySQL故障诊断案例DBA学院课程之:MySQL故障诊断案例
DBA学院课程之:MySQL故障诊断案例Hui Liu
 
Proxy解說
Proxy解說Proxy解說
Proxy解說Tony Yeh
 
前端静态文件部署
前端静态文件部署前端静态文件部署
前端静态文件部署Charles Wu
 
資料庫應用與實際操作
資料庫應用與實際操作資料庫應用與實際操作
資料庫應用與實際操作阿狗 郭
 
如何建立有效的快取
如何建立有效的快取如何建立有效的快取
如何建立有效的快取Ricky Su
 
六角學院 - 資料庫與他們的小夥伴們
六角學院 - 資料庫與他們的小夥伴們六角學院 - 資料庫與他們的小夥伴們
六角學院 - 資料庫與他們的小夥伴們Hao Wei Liou
 
无数据库日志文件恢复数据库方法两则
无数据库日志文件恢复数据库方法两则无数据库日志文件恢复数据库方法两则
无数据库日志文件恢复数据库方法两则wensheng wei
 
Ch04 會話管理
Ch04 會話管理Ch04 會話管理
Ch04 會話管理Justin Lin
 
111030 gztechparty-小路-云时代的mysql
111030 gztechparty-小路-云时代的mysql111030 gztechparty-小路-云时代的mysql
111030 gztechparty-小路-云时代的mysqlZoom Quiet
 
腾讯大讲堂18 让我们戴上有色眼镜--qzone前台架构的优化分享
腾讯大讲堂18 让我们戴上有色眼镜--qzone前台架构的优化分享腾讯大讲堂18 让我们戴上有色眼镜--qzone前台架构的优化分享
腾讯大讲堂18 让我们戴上有色眼镜--qzone前台架构的优化分享areyouok
 
HDInsight for Hadoopers
HDInsight for HadoopersHDInsight for Hadoopers
HDInsight for HadoopersKuo-Chun Su
 
NHibernate分享(1) share
NHibernate分享(1) shareNHibernate分享(1) share
NHibernate分享(1) shareXu Huang
 
几种Nosql介绍
几种Nosql介绍几种Nosql介绍
几种Nosql介绍taotao1240
 
高性能No sql数据库redis
高性能No sql数据库redis高性能No sql数据库redis
高性能No sql数据库redispaitoubing
 
第六章解答
第六章解答第六章解答
第六章解答jiannrong
 
Windows 10 install mysql 8.0.16
Windows 10 install mysql 8.0.16Windows 10 install mysql 8.0.16
Windows 10 install mysql 8.0.16songwenxuan2020
 
NoSQL误用和常见陷阱分析
NoSQL误用和常见陷阱分析NoSQL误用和常见陷阱分析
NoSQL误用和常见陷阱分析iammutex
 
jsdoc-toolkit
jsdoc-toolkitjsdoc-toolkit
jsdoc-toolkitsatans17
 

Was ist angesagt? (20)

nodejs在微博前端开发中的应用
nodejs在微博前端开发中的应用nodejs在微博前端开发中的应用
nodejs在微博前端开发中的应用
 
Template mb-kao
Template mb-kaoTemplate mb-kao
Template mb-kao
 
DBA学院课程之:MySQL故障诊断案例
DBA学院课程之:MySQL故障诊断案例DBA学院课程之:MySQL故障诊断案例
DBA学院课程之:MySQL故障诊断案例
 
Proxy解說
Proxy解說Proxy解說
Proxy解說
 
前端静态文件部署
前端静态文件部署前端静态文件部署
前端静态文件部署
 
資料庫應用與實際操作
資料庫應用與實際操作資料庫應用與實際操作
資料庫應用與實際操作
 
如何建立有效的快取
如何建立有效的快取如何建立有效的快取
如何建立有效的快取
 
六角學院 - 資料庫與他們的小夥伴們
六角學院 - 資料庫與他們的小夥伴們六角學院 - 資料庫與他們的小夥伴們
六角學院 - 資料庫與他們的小夥伴們
 
无数据库日志文件恢复数据库方法两则
无数据库日志文件恢复数据库方法两则无数据库日志文件恢复数据库方法两则
无数据库日志文件恢复数据库方法两则
 
Ch04 會話管理
Ch04 會話管理Ch04 會話管理
Ch04 會話管理
 
111030 gztechparty-小路-云时代的mysql
111030 gztechparty-小路-云时代的mysql111030 gztechparty-小路-云时代的mysql
111030 gztechparty-小路-云时代的mysql
 
腾讯大讲堂18 让我们戴上有色眼镜--qzone前台架构的优化分享
腾讯大讲堂18 让我们戴上有色眼镜--qzone前台架构的优化分享腾讯大讲堂18 让我们戴上有色眼镜--qzone前台架构的优化分享
腾讯大讲堂18 让我们戴上有色眼镜--qzone前台架构的优化分享
 
HDInsight for Hadoopers
HDInsight for HadoopersHDInsight for Hadoopers
HDInsight for Hadoopers
 
NHibernate分享(1) share
NHibernate分享(1) shareNHibernate分享(1) share
NHibernate分享(1) share
 
几种Nosql介绍
几种Nosql介绍几种Nosql介绍
几种Nosql介绍
 
高性能No sql数据库redis
高性能No sql数据库redis高性能No sql数据库redis
高性能No sql数据库redis
 
第六章解答
第六章解答第六章解答
第六章解答
 
Windows 10 install mysql 8.0.16
Windows 10 install mysql 8.0.16Windows 10 install mysql 8.0.16
Windows 10 install mysql 8.0.16
 
NoSQL误用和常见陷阱分析
NoSQL误用和常见陷阱分析NoSQL误用和常见陷阱分析
NoSQL误用和常见陷阱分析
 
jsdoc-toolkit
jsdoc-toolkitjsdoc-toolkit
jsdoc-toolkit
 

Andere mochten auch

分布式版本管理
分布式版本管理分布式版本管理
分布式版本管理jeffz
 
企业开发领域的语言特性
企业开发领域的语言特性企业开发领域的语言特性
企业开发领域的语言特性jeffz
 
LINQ Inside
LINQ InsideLINQ Inside
LINQ Insidejeffz
 
Ruby Past, Present, Future
Ruby   Past, Present, FutureRuby   Past, Present, Future
Ruby Past, Present, Futureadamfine
 
Jscex:案例、阻碍、体会、展望
Jscex:案例、阻碍、体会、展望Jscex:案例、阻碍、体会、展望
Jscex:案例、阻碍、体会、展望jeffz
 
The Evolution of Async Programming (GZ TechParty C#)
The Evolution of Async Programming (GZ TechParty C#)The Evolution of Async Programming (GZ TechParty C#)
The Evolution of Async Programming (GZ TechParty C#)jeffz
 
JavaScript现代化排错实践
JavaScript现代化排错实践JavaScript现代化排错实践
JavaScript现代化排错实践jeffz
 
大话程序员可用的算法
大话程序员可用的算法大话程序员可用的算法
大话程序员可用的算法jeffz
 
Rabbit mq簡介(上)
Rabbit mq簡介(上)Rabbit mq簡介(上)
Rabbit mq簡介(上)共和 薛
 
QML 與 C++ 的美麗邂逅
QML 與 C++ 的美麗邂逅QML 與 C++ 的美麗邂逅
QML 與 C++ 的美麗邂逅Jack Yang
 
Storm特性
Storm特性Storm特性
Storm特性zyh
 
鐵道女孩向前衝-RubyKaigi心得分享
鐵道女孩向前衝-RubyKaigi心得分享鐵道女孩向前衝-RubyKaigi心得分享
鐵道女孩向前衝-RubyKaigi心得分享Yu-Chen Chen
 
LWC15 典藏數位化-張其昀先生相關資料數位化之應用 報告人:中國文化大學圖書館 吳瑞秀館長
LWC15 典藏數位化-張其昀先生相關資料數位化之應用 報告人:中國文化大學圖書館 吳瑞秀館長LWC15 典藏數位化-張其昀先生相關資料數位化之應用 報告人:中國文化大學圖書館 吳瑞秀館長
LWC15 典藏數位化-張其昀先生相關資料數位化之應用 報告人:中國文化大學圖書館 吳瑞秀館長International Federation for information integration
 
使用.NET构建轻量级分布式框架
使用.NET构建轻量级分布式框架使用.NET构建轻量级分布式框架
使用.NET构建轻量级分布式框架jeffz
 
臺北智慧城市專案辦公室公共住宅智慧社區服務說明書工作會議--智慧圖書館
臺北智慧城市專案辦公室公共住宅智慧社區服務說明書工作會議--智慧圖書館臺北智慧城市專案辦公室公共住宅智慧社區服務說明書工作會議--智慧圖書館
臺北智慧城市專案辦公室公共住宅智慧社區服務說明書工作會議--智慧圖書館Taipei Smart City PMO
 
我編譯故我在:誰說 Node.js 程式不能編成 binary
我編譯故我在:誰說 Node.js 程式不能編成 binary我編譯故我在:誰說 Node.js 程式不能編成 binary
我編譯故我在:誰說 Node.js 程式不能編成 binaryFred Chien
 
LWC14夢醒時分:圖書館建築構想書的實踐成果 以國立臺東大學圖書館為例。報告人:國立臺東大學圖書館 吳錦範組長
LWC14夢醒時分:圖書館建築構想書的實踐成果 以國立臺東大學圖書館為例。報告人:國立臺東大學圖書館 吳錦範組長LWC14夢醒時分:圖書館建築構想書的實踐成果 以國立臺東大學圖書館為例。報告人:國立臺東大學圖書館 吳錦範組長
LWC14夢醒時分:圖書館建築構想書的實踐成果 以國立臺東大學圖書館為例。報告人:國立臺東大學圖書館 吳錦範組長International Federation for information integration
 
Brig:Node.js + QML 華麗大冒險
Brig:Node.js + QML 華麗大冒險Brig:Node.js + QML 華麗大冒險
Brig:Node.js + QML 華麗大冒險Fred Chien
 
基于原型的JavaScript面向对象编程
基于原型的JavaScript面向对象编程基于原型的JavaScript面向对象编程
基于原型的JavaScript面向对象编程zhangdaiping
 
計概:Programming Paradigm
計概:Programming Paradigm計概:Programming Paradigm
計概:Programming ParadigmRex Yuan
 

Andere mochten auch (20)

分布式版本管理
分布式版本管理分布式版本管理
分布式版本管理
 
企业开发领域的语言特性
企业开发领域的语言特性企业开发领域的语言特性
企业开发领域的语言特性
 
LINQ Inside
LINQ InsideLINQ Inside
LINQ Inside
 
Ruby Past, Present, Future
Ruby   Past, Present, FutureRuby   Past, Present, Future
Ruby Past, Present, Future
 
Jscex:案例、阻碍、体会、展望
Jscex:案例、阻碍、体会、展望Jscex:案例、阻碍、体会、展望
Jscex:案例、阻碍、体会、展望
 
The Evolution of Async Programming (GZ TechParty C#)
The Evolution of Async Programming (GZ TechParty C#)The Evolution of Async Programming (GZ TechParty C#)
The Evolution of Async Programming (GZ TechParty C#)
 
JavaScript现代化排错实践
JavaScript现代化排错实践JavaScript现代化排错实践
JavaScript现代化排错实践
 
大话程序员可用的算法
大话程序员可用的算法大话程序员可用的算法
大话程序员可用的算法
 
Rabbit mq簡介(上)
Rabbit mq簡介(上)Rabbit mq簡介(上)
Rabbit mq簡介(上)
 
QML 與 C++ 的美麗邂逅
QML 與 C++ 的美麗邂逅QML 與 C++ 的美麗邂逅
QML 與 C++ 的美麗邂逅
 
Storm特性
Storm特性Storm特性
Storm特性
 
鐵道女孩向前衝-RubyKaigi心得分享
鐵道女孩向前衝-RubyKaigi心得分享鐵道女孩向前衝-RubyKaigi心得分享
鐵道女孩向前衝-RubyKaigi心得分享
 
LWC15 典藏數位化-張其昀先生相關資料數位化之應用 報告人:中國文化大學圖書館 吳瑞秀館長
LWC15 典藏數位化-張其昀先生相關資料數位化之應用 報告人:中國文化大學圖書館 吳瑞秀館長LWC15 典藏數位化-張其昀先生相關資料數位化之應用 報告人:中國文化大學圖書館 吳瑞秀館長
LWC15 典藏數位化-張其昀先生相關資料數位化之應用 報告人:中國文化大學圖書館 吳瑞秀館長
 
使用.NET构建轻量级分布式框架
使用.NET构建轻量级分布式框架使用.NET构建轻量级分布式框架
使用.NET构建轻量级分布式框架
 
臺北智慧城市專案辦公室公共住宅智慧社區服務說明書工作會議--智慧圖書館
臺北智慧城市專案辦公室公共住宅智慧社區服務說明書工作會議--智慧圖書館臺北智慧城市專案辦公室公共住宅智慧社區服務說明書工作會議--智慧圖書館
臺北智慧城市專案辦公室公共住宅智慧社區服務說明書工作會議--智慧圖書館
 
我編譯故我在:誰說 Node.js 程式不能編成 binary
我編譯故我在:誰說 Node.js 程式不能編成 binary我編譯故我在:誰說 Node.js 程式不能編成 binary
我編譯故我在:誰說 Node.js 程式不能編成 binary
 
LWC14夢醒時分:圖書館建築構想書的實踐成果 以國立臺東大學圖書館為例。報告人:國立臺東大學圖書館 吳錦範組長
LWC14夢醒時分:圖書館建築構想書的實踐成果 以國立臺東大學圖書館為例。報告人:國立臺東大學圖書館 吳錦範組長LWC14夢醒時分:圖書館建築構想書的實踐成果 以國立臺東大學圖書館為例。報告人:國立臺東大學圖書館 吳錦範組長
LWC14夢醒時分:圖書館建築構想書的實踐成果 以國立臺東大學圖書館為例。報告人:國立臺東大學圖書館 吳錦範組長
 
Brig:Node.js + QML 華麗大冒險
Brig:Node.js + QML 華麗大冒險Brig:Node.js + QML 華麗大冒險
Brig:Node.js + QML 華麗大冒險
 
基于原型的JavaScript面向对象编程
基于原型的JavaScript面向对象编程基于原型的JavaScript面向对象编程
基于原型的JavaScript面向对象编程
 
計概:Programming Paradigm
計概:Programming Paradigm計概:Programming Paradigm
計概:Programming Paradigm
 

Ähnlich wie Web开发中的缓存

OPOA in Action -- 使用MagixJS简化WebAPP开发
OPOA in Action -- 使用MagixJS简化WebAPP开发OPOA in Action -- 使用MagixJS简化WebAPP开发
OPOA in Action -- 使用MagixJS简化WebAPP开发leneli
 
Mybatis学习培训
Mybatis学习培训Mybatis学习培训
Mybatis学习培训flynofry
 
Node.js在淘宝的应用实践
Node.js在淘宝的应用实践Node.js在淘宝的应用实践
Node.js在淘宝的应用实践taobao.com
 
面向开发的前端性能优化
面向开发的前端性能优化面向开发的前端性能优化
面向开发的前端性能优化li qiang
 
浅析浏览器解析和渲染
浅析浏览器解析和渲染浅析浏览器解析和渲染
浅析浏览器解析和渲染Ailsa126
 
腾讯大讲堂08 可扩展web架构探讨
腾讯大讲堂08 可扩展web架构探讨腾讯大讲堂08 可扩展web架构探讨
腾讯大讲堂08 可扩展web架构探讨George Ang
 
Huangjing renren
Huangjing renrenHuangjing renren
Huangjing renrend0nn9n
 
淘宝商品库MySQL优化实践
淘宝商品库MySQL优化实践淘宝商品库MySQL优化实践
淘宝商品库MySQL优化实践Feng Yu
 
Ria的强力后盾:rest+海量存储
Ria的强力后盾:rest+海量存储 Ria的强力后盾:rest+海量存储
Ria的强力后盾:rest+海量存储 zhen chen
 
淘宝数据魔方的系统架构 -长林
淘宝数据魔方的系统架构 -长林淘宝数据魔方的系统架构 -长林
淘宝数据魔方的系统架构 -长林Shaoning Pan
 
前端性能优化和自动化
前端性能优化和自动化前端性能优化和自动化
前端性能优化和自动化kaven yan
 
腾讯大讲堂08 可扩展web架构探讨
腾讯大讲堂08 可扩展web架构探讨腾讯大讲堂08 可扩展web架构探讨
腾讯大讲堂08 可扩展web架构探讨areyouok
 
腾讯大讲堂08 可扩展web架构探讨
腾讯大讲堂08 可扩展web架构探讨腾讯大讲堂08 可扩展web架构探讨
腾讯大讲堂08 可扩展web架构探讨topgeek
 
SSD在企业级数据库方面的应用
SSD在企业级数据库方面的应用SSD在企业级数据库方面的应用
SSD在企业级数据库方面的应用poerew
 
線上埋碼資料收集實作
線上埋碼資料收集實作線上埋碼資料收集實作
線上埋碼資料收集實作FEG
 
Mysql企业备份发展及实践
Mysql企业备份发展及实践Mysql企业备份发展及实践
Mysql企业备份发展及实践maclean liu
 
Discuz技术交流
Discuz技术交流Discuz技术交流
Discuz技术交流pigso
 
Http Headers 與 Cache 機制(2016)
Http Headers 與 Cache 機制(2016)Http Headers 與 Cache 機制(2016)
Http Headers 與 Cache 機制(2016)振揚 陳
 

Ähnlich wie Web开发中的缓存 (20)

OPOA in Action -- 使用MagixJS简化WebAPP开发
OPOA in Action -- 使用MagixJS简化WebAPP开发OPOA in Action -- 使用MagixJS简化WebAPP开发
OPOA in Action -- 使用MagixJS简化WebAPP开发
 
Mybatis学习培训
Mybatis学习培训Mybatis学习培训
Mybatis学习培训
 
Node.js在淘宝的应用实践
Node.js在淘宝的应用实践Node.js在淘宝的应用实践
Node.js在淘宝的应用实践
 
面向开发的前端性能优化
面向开发的前端性能优化面向开发的前端性能优化
面向开发的前端性能优化
 
浅析浏览器解析和渲染
浅析浏览器解析和渲染浅析浏览器解析和渲染
浅析浏览器解析和渲染
 
腾讯大讲堂08 可扩展web架构探讨
腾讯大讲堂08 可扩展web架构探讨腾讯大讲堂08 可扩展web架构探讨
腾讯大讲堂08 可扩展web架构探讨
 
Huangjing renren
Huangjing renrenHuangjing renren
Huangjing renren
 
淘宝商品库MySQL优化实践
淘宝商品库MySQL优化实践淘宝商品库MySQL优化实践
淘宝商品库MySQL优化实践
 
Ria的强力后盾:rest+海量存储
Ria的强力后盾:rest+海量存储 Ria的强力后盾:rest+海量存储
Ria的强力后盾:rest+海量存储
 
淘宝数据魔方的系统架构 -长林
淘宝数据魔方的系统架构 -长林淘宝数据魔方的系统架构 -长林
淘宝数据魔方的系统架构 -长林
 
前端性能优化和自动化
前端性能优化和自动化前端性能优化和自动化
前端性能优化和自动化
 
腾讯大讲堂08 可扩展web架构探讨
腾讯大讲堂08 可扩展web架构探讨腾讯大讲堂08 可扩展web架构探讨
腾讯大讲堂08 可扩展web架构探讨
 
腾讯大讲堂08 可扩展web架构探讨
腾讯大讲堂08 可扩展web架构探讨腾讯大讲堂08 可扩展web架构探讨
腾讯大讲堂08 可扩展web架构探讨
 
SSD在企业级数据库方面的应用
SSD在企业级数据库方面的应用SSD在企业级数据库方面的应用
SSD在企业级数据库方面的应用
 
線上埋碼資料收集實作
線上埋碼資料收集實作線上埋碼資料收集實作
線上埋碼資料收集實作
 
Mysql企业备份发展及实践
Mysql企业备份发展及实践Mysql企业备份发展及实践
Mysql企业备份发展及实践
 
Discuz技术交流
Discuz技术交流Discuz技术交流
Discuz技术交流
 
big web site
big web site big web site
big web site
 
Http Headers 與 Cache 機制(2016)
Http Headers 與 Cache 機制(2016)Http Headers 與 Cache 機制(2016)
Http Headers 與 Cache 機制(2016)
 
老舊web上雲端
老舊web上雲端老舊web上雲端
老舊web上雲端
 

Mehr von jeffz

Wind.js无障碍调试与排错
Wind.js无障碍调试与排错Wind.js无障碍调试与排错
Wind.js无障碍调试与排错jeffz
 
Jscex:案例、经验、阻碍、展望
Jscex:案例、经验、阻碍、展望Jscex:案例、经验、阻碍、展望
Jscex:案例、经验、阻碍、展望jeffz
 
深入浅出Jscex
深入浅出Jscex深入浅出Jscex
深入浅出Jscexjeffz
 
Mono for .NET Developers
Mono for .NET DevelopersMono for .NET Developers
Mono for .NET Developersjeffz
 
Javascript Uncommon Programming
Javascript Uncommon ProgrammingJavascript Uncommon Programming
Javascript Uncommon Programmingjeffz
 
Jscex: Write Sexy JavaScript (中文)
Jscex: Write Sexy JavaScript (中文)Jscex: Write Sexy JavaScript (中文)
Jscex: Write Sexy JavaScript (中文)jeffz
 
Jscex: Write Sexy JavaScript
Jscex: Write Sexy JavaScriptJscex: Write Sexy JavaScript
Jscex: Write Sexy JavaScriptjeffz
 
单点登录解决方案的架构与实现
单点登录解决方案的架构与实现单点登录解决方案的架构与实现
单点登录解决方案的架构与实现jeffz
 
Documentation Insight技术架构与开发历程
Documentation Insight技术架构与开发历程Documentation Insight技术架构与开发历程
Documentation Insight技术架构与开发历程jeffz
 
Windows Phone应用开发心得
Windows Phone应用开发心得Windows Phone应用开发心得
Windows Phone应用开发心得jeffz
 
针对iPad平台的高性能网站架构
针对iPad平台的高性能网站架构针对iPad平台的高性能网站架构
针对iPad平台的高性能网站架构jeffz
 
The Evolution of Async-Programming on .NET Platform (TUP, Full)
The Evolution of Async-Programming on .NET Platform (TUP, Full)The Evolution of Async-Programming on .NET Platform (TUP, Full)
The Evolution of Async-Programming on .NET Platform (TUP, Full)jeffz
 
The Evolution of Async-Programming on .NET Platform (.Net China, C#)
The Evolution of Async-Programming on .NET Platform (.Net China, C#)The Evolution of Async-Programming on .NET Platform (.Net China, C#)
The Evolution of Async-Programming on .NET Platform (.Net China, C#)jeffz
 
The Evolution of Async-Programming (SD 2.0, JavaScript)
The Evolution of Async-Programming (SD 2.0, JavaScript)The Evolution of Async-Programming (SD 2.0, JavaScript)
The Evolution of Async-Programming (SD 2.0, JavaScript)jeffz
 
面向对象与生活
面向对象与生活面向对象与生活
面向对象与生活jeffz
 
Windows内核技术介绍
Windows内核技术介绍Windows内核技术介绍
Windows内核技术介绍jeffz
 
响应式编程及框架
响应式编程及框架响应式编程及框架
响应式编程及框架jeffz
 
F#语言对异步程序设计的支持
F#语言对异步程序设计的支持F#语言对异步程序设计的支持
F#语言对异步程序设计的支持jeffz
 
大众点评网的技术变迁之路
大众点评网的技术变迁之路大众点评网的技术变迁之路
大众点评网的技术变迁之路jeffz
 
Better Framework Better Life
Better Framework Better LifeBetter Framework Better Life
Better Framework Better Lifejeffz
 

Mehr von jeffz (20)

Wind.js无障碍调试与排错
Wind.js无障碍调试与排错Wind.js无障碍调试与排错
Wind.js无障碍调试与排错
 
Jscex:案例、经验、阻碍、展望
Jscex:案例、经验、阻碍、展望Jscex:案例、经验、阻碍、展望
Jscex:案例、经验、阻碍、展望
 
深入浅出Jscex
深入浅出Jscex深入浅出Jscex
深入浅出Jscex
 
Mono for .NET Developers
Mono for .NET DevelopersMono for .NET Developers
Mono for .NET Developers
 
Javascript Uncommon Programming
Javascript Uncommon ProgrammingJavascript Uncommon Programming
Javascript Uncommon Programming
 
Jscex: Write Sexy JavaScript (中文)
Jscex: Write Sexy JavaScript (中文)Jscex: Write Sexy JavaScript (中文)
Jscex: Write Sexy JavaScript (中文)
 
Jscex: Write Sexy JavaScript
Jscex: Write Sexy JavaScriptJscex: Write Sexy JavaScript
Jscex: Write Sexy JavaScript
 
单点登录解决方案的架构与实现
单点登录解决方案的架构与实现单点登录解决方案的架构与实现
单点登录解决方案的架构与实现
 
Documentation Insight技术架构与开发历程
Documentation Insight技术架构与开发历程Documentation Insight技术架构与开发历程
Documentation Insight技术架构与开发历程
 
Windows Phone应用开发心得
Windows Phone应用开发心得Windows Phone应用开发心得
Windows Phone应用开发心得
 
针对iPad平台的高性能网站架构
针对iPad平台的高性能网站架构针对iPad平台的高性能网站架构
针对iPad平台的高性能网站架构
 
The Evolution of Async-Programming on .NET Platform (TUP, Full)
The Evolution of Async-Programming on .NET Platform (TUP, Full)The Evolution of Async-Programming on .NET Platform (TUP, Full)
The Evolution of Async-Programming on .NET Platform (TUP, Full)
 
The Evolution of Async-Programming on .NET Platform (.Net China, C#)
The Evolution of Async-Programming on .NET Platform (.Net China, C#)The Evolution of Async-Programming on .NET Platform (.Net China, C#)
The Evolution of Async-Programming on .NET Platform (.Net China, C#)
 
The Evolution of Async-Programming (SD 2.0, JavaScript)
The Evolution of Async-Programming (SD 2.0, JavaScript)The Evolution of Async-Programming (SD 2.0, JavaScript)
The Evolution of Async-Programming (SD 2.0, JavaScript)
 
面向对象与生活
面向对象与生活面向对象与生活
面向对象与生活
 
Windows内核技术介绍
Windows内核技术介绍Windows内核技术介绍
Windows内核技术介绍
 
响应式编程及框架
响应式编程及框架响应式编程及框架
响应式编程及框架
 
F#语言对异步程序设计的支持
F#语言对异步程序设计的支持F#语言对异步程序设计的支持
F#语言对异步程序设计的支持
 
大众点评网的技术变迁之路
大众点评网的技术变迁之路大众点评网的技术变迁之路
大众点评网的技术变迁之路
 
Better Framework Better Life
Better Framework Better LifeBetter Framework Better Life
Better Framework Better Life
 

Kürzlich hochgeladen

泽兰应用科学大学毕业证制作/定制国外大学录取通知书/购买一个假的建国科技大学硕士学位证书
泽兰应用科学大学毕业证制作/定制国外大学录取通知书/购买一个假的建国科技大学硕士学位证书泽兰应用科学大学毕业证制作/定制国外大学录取通知书/购买一个假的建国科技大学硕士学位证书
泽兰应用科学大学毕业证制作/定制国外大学录取通知书/购买一个假的建国科技大学硕士学位证书jakepaige317
 
educ6506presentationtc3302771-240427173057-06a46de5.pptx
educ6506presentationtc3302771-240427173057-06a46de5.pptxeduc6506presentationtc3302771-240427173057-06a46de5.pptx
educ6506presentationtc3302771-240427173057-06a46de5.pptxmekosin001123
 
EDUC6506(001)_ClassPresentation_2_TC330277 (1).pptx
EDUC6506(001)_ClassPresentation_2_TC330277 (1).pptxEDUC6506(001)_ClassPresentation_2_TC330277 (1).pptx
EDUC6506(001)_ClassPresentation_2_TC330277 (1).pptxmekosin001123
 
1.🎉“入侵大学入学考试中心修改成绩”来袭!ALEVEL替考大揭秘,轻松搞定考试成绩! 💥你还在为无法进入大学招生系统而烦恼吗?想知道如何通过技术手段更改...
1.🎉“入侵大学入学考试中心修改成绩”来袭!ALEVEL替考大揭秘,轻松搞定考试成绩! 💥你还在为无法进入大学招生系统而烦恼吗?想知道如何通过技术手段更改...1.🎉“入侵大学入学考试中心修改成绩”来袭!ALEVEL替考大揭秘,轻松搞定考试成绩! 💥你还在为无法进入大学招生系统而烦恼吗?想知道如何通过技术手段更改...
1.🎉“入侵大学入学考试中心修改成绩”来袭!ALEVEL替考大揭秘,轻松搞定考试成绩! 💥你还在为无法进入大学招生系统而烦恼吗?想知道如何通过技术手段更改...黑客 接单【TG/微信qoqoqdqd】
 
哪里可以购买日本筑波学院大学学位记/做个假的文凭可认证吗/仿制日本大学毕业证/意大利语CELI证书定制
哪里可以购买日本筑波学院大学学位记/做个假的文凭可认证吗/仿制日本大学毕业证/意大利语CELI证书定制哪里可以购买日本筑波学院大学学位记/做个假的文凭可认证吗/仿制日本大学毕业证/意大利语CELI证书定制
哪里可以购买日本筑波学院大学学位记/做个假的文凭可认证吗/仿制日本大学毕业证/意大利语CELI证书定制jakepaige317
 
EDUC6506_ClassPresentation_TC330277 (1).pptx
EDUC6506_ClassPresentation_TC330277 (1).pptxEDUC6506_ClassPresentation_TC330277 (1).pptx
EDUC6506_ClassPresentation_TC330277 (1).pptxmekosin001123
 
中国文学, 了解王安石变法,熙宁变法,熙盛变法- 中国古代改革的类型- 富国强兵,
中国文学, 了解王安石变法,熙宁变法,熙盛变法- 中国古代改革的类型- 富国强兵,中国文学, 了解王安石变法,熙宁变法,熙盛变法- 中国古代改革的类型- 富国强兵,
中国文学, 了解王安石变法,熙宁变法,熙盛变法- 中国古代改革的类型- 富国强兵,Xin Yun Teo
 

Kürzlich hochgeladen (7)

泽兰应用科学大学毕业证制作/定制国外大学录取通知书/购买一个假的建国科技大学硕士学位证书
泽兰应用科学大学毕业证制作/定制国外大学录取通知书/购买一个假的建国科技大学硕士学位证书泽兰应用科学大学毕业证制作/定制国外大学录取通知书/购买一个假的建国科技大学硕士学位证书
泽兰应用科学大学毕业证制作/定制国外大学录取通知书/购买一个假的建国科技大学硕士学位证书
 
educ6506presentationtc3302771-240427173057-06a46de5.pptx
educ6506presentationtc3302771-240427173057-06a46de5.pptxeduc6506presentationtc3302771-240427173057-06a46de5.pptx
educ6506presentationtc3302771-240427173057-06a46de5.pptx
 
EDUC6506(001)_ClassPresentation_2_TC330277 (1).pptx
EDUC6506(001)_ClassPresentation_2_TC330277 (1).pptxEDUC6506(001)_ClassPresentation_2_TC330277 (1).pptx
EDUC6506(001)_ClassPresentation_2_TC330277 (1).pptx
 
1.🎉“入侵大学入学考试中心修改成绩”来袭!ALEVEL替考大揭秘,轻松搞定考试成绩! 💥你还在为无法进入大学招生系统而烦恼吗?想知道如何通过技术手段更改...
1.🎉“入侵大学入学考试中心修改成绩”来袭!ALEVEL替考大揭秘,轻松搞定考试成绩! 💥你还在为无法进入大学招生系统而烦恼吗?想知道如何通过技术手段更改...1.🎉“入侵大学入学考试中心修改成绩”来袭!ALEVEL替考大揭秘,轻松搞定考试成绩! 💥你还在为无法进入大学招生系统而烦恼吗?想知道如何通过技术手段更改...
1.🎉“入侵大学入学考试中心修改成绩”来袭!ALEVEL替考大揭秘,轻松搞定考试成绩! 💥你还在为无法进入大学招生系统而烦恼吗?想知道如何通过技术手段更改...
 
哪里可以购买日本筑波学院大学学位记/做个假的文凭可认证吗/仿制日本大学毕业证/意大利语CELI证书定制
哪里可以购买日本筑波学院大学学位记/做个假的文凭可认证吗/仿制日本大学毕业证/意大利语CELI证书定制哪里可以购买日本筑波学院大学学位记/做个假的文凭可认证吗/仿制日本大学毕业证/意大利语CELI证书定制
哪里可以购买日本筑波学院大学学位记/做个假的文凭可认证吗/仿制日本大学毕业证/意大利语CELI证书定制
 
EDUC6506_ClassPresentation_TC330277 (1).pptx
EDUC6506_ClassPresentation_TC330277 (1).pptxEDUC6506_ClassPresentation_TC330277 (1).pptx
EDUC6506_ClassPresentation_TC330277 (1).pptx
 
中国文学, 了解王安石变法,熙宁变法,熙盛变法- 中国古代改革的类型- 富国强兵,
中国文学, 了解王安石变法,熙宁变法,熙盛变法- 中国古代改革的类型- 富国强兵,中国文学, 了解王安石变法,熙宁变法,熙盛变法- 中国古代改革的类型- 富国强兵,
中国文学, 了解王安石变法,熙宁变法,熙盛变法- 中国古代改革的类型- 富国强兵,
 

Web开发中的缓存

  • 2. 赵劼,网名老赵,洋名Jeffrey Zhao  博客:http://www.cnblogs.com/JeffreyZhao/  推特:@jeffz_cn  InfoQ中文站编辑  某创业小公司架构师 + 程序员  希望可以给给初学者以合适引导。坚定的北大青鸟 反对者,强烈愤慨恶劣的培训机构对于处于懵懂期 的初学者以误导,强烈抵制各种虚假广告给业界带 来的不良影响,强烈建议有理想有抱负的从业青年 放弃北大青鸟,不要做冤大头。
  • 3. 性能 能耗 冰川 降低 增加 融化 资源 温室 地球 浪费 效应 毁灭
  • 4.
  • 5. CPU  磁盘  浏览器  DNS  网页快照  ……
  • 6. 客户端缓存  表现层缓存  业务逻辑层缓存  数据访问层缓存  数据库缓存  ……
  • 7. HTTP/1.1 ◦ Expires, Max-Age, ETag...  Request Header ◦ If-Modified-Since ◦ If-None-Match  Response Header ◦ Expires ◦ Cache-Control ◦ Last-Modified ◦ ETag
  • 8. 利用HTTP/1.1的标准(同上)  使用JavaScript编程时缓存数据: window.workWithCache = function(id) { var data = window._cache["id_" + id]; if (data != undefined) work(data); makeAjaxRequest(id, window.ajaxCallback); } window.ajaxCallback = function(id, data) { window._cache["id_" + id] = data; work(data); }
  • 9.
  • 10. 检查缓存No.1~30 请求前 请求后 ◦ 缓存为空  发出请求 ◦ 请求图片No.1~30  收到回复 ◦ 缓存图片No.1~30  显示图片 ◦ 显示图片No.1~30
  • 11. 检查缓存No.41~70 请求前 请求后 ◦ 缓存为空  发出请求 ◦ 请求图片No.41~70  收到回复 ◦ 缓存图片No.41~70  显示图片 ◦ 显示图片No.41~70
  • 12. 检查缓存No.21~50 请求前 请求后 ◦ 发现缓存No.21~30 ◦ 发现缓存No.41~50  发出请求 ◦ 请求图片No.31~40  收到回复 ◦ 缓存图片No.31~40  显示图片 ◦ 显示图片No.21~50
  • 13. 便利: ◦ 单线程环境,避免许多麻烦 ◦ 对于生命周期短的页面,无须资源释放  限制 ◦ 无法跨页面缓存 ◦ 刷新后缓存即清空 ◦ 对于生命周期长的页面,需要制定资源释放策略  何时释放数据?  释放哪些数据?
  • 14. 静态页 ◦ 粒度过大 ◦ 几乎无法用于一般Web 2.0系统  整页动态缓存 ◦ 灵活性较静态页略高 ◦ 粒度仍然过大  页面片断缓存(fragment caching)
  • 15. class BlogController < ApplicationController def list unless read_fragment(:action => 'list' ) @articles = Article.find_recent end end end <% cache do %> <!- Here's the content we cache -> <ul> <% for article in @articles -%> <li><p><%= h(article.body) %></p></li> <% end -%> </ul> <% end %>
  • 16. 某些时候因为@articles没有初始化而出错  详见Robin Lu于RubyConf China 2009中的演讲 “Ruby on Rails Pitfalls”,Page 10
  • 17. public class BlogController : Controller { public ActionResult List() { var model = LazyBuilder.Create<Model>() .Setup(m => m.Articles, () => Article.FindRecent()) .Instance; return View(model); } } <% Html.Cache("recent-articles", () => { %> <ul> <% foreach (var article in Model.Articles) { %> <li><p><%= article.Body %></p></li> <% } %> </ul> <% } %>
  • 18. 使用相对方便,性能优势明显  粒度较大,适用面相对较窄 ◦ “即时性”往往不够
  • 19. 与业务密切相关的缓存 ◦ 推荐好友 ◦ 最新文章 ◦ ……  一般用于缓存实体对象  控制灵活 ◦ 相对容易设计“即时”的缓存  复用概率大 ◦ 命中率
  • 22. 站内短消息列表 ◦ 帖子列表 ◦ 回复列表 ◦ 好友列表  分页显示  即时更新
  • 23. 缓存每页数据时,附带获取数据时的时间戳 ◦ data + read_timestamp  在发生更新时,刷新时间戳 ◦ last_updated_timestamp  读取缓存时,比较数据获取时间与最后更新时间 ◦ 如read_timestamp > last_updated_timestamp,则 cache hit ◦ 如read_timestamp < last_updated_timestamp,则 cache miss
  • 24. Comment[] GetComments(int articleId, int page) { DateTime lastUpdated; var cached = GetFromCache(articleId, page, out lastUpdated); if (cached == null || cached.TimeStamp < lastUpdated) { var data = GetFromDatabase(articleId, page); cached = new CacheEntry(data, DateTime.Now); SetToCache(articleId, page, cached); } return cached; } void AddComment(Comment comment) { ... // write to database SetLastUpdatedToCache(comment.ArticleID, DateTime.Now); }
  • 25. 共享引用问题  并发环境下的缓存操作 ◦ 博客园评论列表  缓存数据大小  是否每个数据都要缓存? ◦ 爬虫访问? ◦ N年前的数据?  是否每种数据的缓存策略都相同? ◦ 存储方式? ◦ 过期策略?
  • 27. 手机之家数据访问组件(引用自许超前的博文)
  • 28. 是否透明? ◦ 多种数据库 ◦ 多存储方式(RDBMS,K/V存储)  即时性如何? ◦ 数据复制 ◦ CAP  是否能够应对所有形式的查询? ◦ 功能 vs. 复杂度  是否一定需要缓存? ◦ 复杂查询 ◦ 并发操作
  • 29. 手机之家新系统介绍及架构分享
  • 30. 数据库缓存优化:拆表  避免缓存滥用 ◦ 缓存不是万能的 ◦ 缓存带来复杂度  业务为技术让步 ◦ e.g. 难道“即时”就那么重要吗?  Consistent Hash