MoSonic:对SubSonic的分布式存储、缓存改进尝试(2)
接上文。
Cache Money真正牛X的地方是在Vector Cache。在生产环境中,它不仅相对Object Cache命中率较更高,带来的性能飞跃更是可观。
在MoSonic的性能测试中,得到了有10倍的性能提高。
Vector Cache性能恐怖,但它对表结构,查询类型,有相当的严格的要求;列举如下:
- 表必须以自增数字(int / long)id为主键
- 查询的where中必须是 = 等于条件,如where user_id=1
- 多个where条件的话,相互关系必须是And,如where user_id=1 and id_deleted=0
- 查询结果仅能是数据id,如 select id from users where ... 不可以是 select user_name from users where ...
- 也可以是 select count(*) from users where ...
- 查询结果支持分页
- 查询结果必须以id排倒序,也就是order by id desc
只有完全符合上面五个条件,Vector Cache才可以生效;幸运的是,在web 2.0网站中,这类结构/查询正好是最常见的。
以博客为例,博客文章列表显示,分类文章数量,评论显示等等,基本都符合上述的查询。
比方说,要获得等级为1的用户时,需要使用下面的两个查询:
- select id from users where level=1
- select * from users where id in (....)
两个查询cache money都可以完全缓存,如果直接使用:
- select * from users where level=1
的话,cache money则会完全失效。
对于两种风格的查询孰优孰劣,可以参考JavaEye老大Robin之前写的:为什么ORM性能比iBATIS好?
=============
因为要求了查询结果必须是id,并且排倒序,Vector Cache实际上是可以做到实时自动更新,而不是自动过期。
考虑这样的调用:
- select count(id) from photos where album_id=1 order by id desc limit 1, 100
- select id from photos where album_id=1 order by id desc limit 1, 100
- insert into photos (album_id)values(1)
- select count(id) from photos where album_id=1 order by id desc limit 1, 100
- select id from photos where album_id=1 order by id desc limit 1, 100
显示列表,插入数据,再次显示列表;这是相当典型调用。
第1/2步查询会有缓存(即便是没有缓存,查询之后,缓存也会自动被生成,也就是所谓的直读)。
第3步插入数据时,获得数据库自增的ID后,可以直接将此id追加到第1/2步查询缓存结果中。
第4/5步查询直接命中第3步写数据时更新的缓存;完全无需查询数据库。
在查询、应用场景符合的理想情况下,有了Vector Cache,数据库读可以变成恐怖的0读取。
数据库仅需要承担写压力,100%的读都有Memcache的自动缓存。
这才是Cache Money的Vector Cache带来读性能飞跃的原因。
所有的数据库查询都变成了memcache get;memcache单机时在读能力,并发负荷能力上都要比传统关系型数据库高一个数量级;而且其shared nothing的架构,又可以水平扩张。
在高并发,多机缓存的情况下,可以预料Cache Money带来的读性能提高远不止10倍。
==============
Twitter的工程师对Cache Money的实现相当巧妙,他们针对一个限制多多的场景做到了100%的读缓存;而这个“限制多多”又恰恰是web 2.0网站中的最典型场景。
我在MoSonic中实现Vector Cache时,完全照搬了Cache Money的实现算法;就是C#的代码量比ruby膨胀了几倍。
:)
下篇会继续讲MoSonic对FriendFeed分布式数据库设计的引用。
本文转自 Wuvist 51CTO博客,原文链接:http://blog.51cto.com/wuvist/847728
MoSonic:对SubSonic的分布式存储、缓存改进尝试(2)相关推荐
- QQ超市最佳路径寻路算法改进尝试3
今天是个可喜的日子! 经过一系列的改进,1店5口计算时间从之前的近20分钟减少至99秒-- 改进内容如下 1.取消链表搜索: 搜索过程和计算过程中,都需要判断目标节点是否在路径链表中,用的是Linke ...
- ASP.NET 2.0 中改进的缓存功能
摘要:本文中,Stephen Walther 将重点介绍 ASP.NET 2.0 中新增的缓存功能,以及如何使用这些新功能改进 ASP.NET 应用程序的性能和可扩展性.(本文包含一些指向英文站点的链 ...
- Google guava第一讲:guava缓存实战/使用场景/缓存清理/最佳实践/caffeine实战
Guava缓存实战及使用场景 摘要:本文是Google guava 第一件,本文先介绍了为什么使用Guava Cache缓存,然后讲解了使用方法及底层数据结构,结合实际业务,讲解使用guava过程中踩 ...
- 浅析 vSAN 磁盘组架构和缓存盘的“消亡”
一.vSAN 中的 DiskGroup 架构的问题与应对思路回顾 如何将分散在多个服务器中的本地盘资源整合成集群范围可用的"共享存储资源池",是超融合架构中的一项关键技术.在 vS ...
- Facebook 是怎么保证缓存一致性的
缓存有助于减少延迟,提高重读工作负载的可扩展性,并且节省成本.实际上缓存是无处不在的,它也在你的手机和你的浏览器中运行.例如,CDN和DNS本质上是地理复制的缓存.正是由于许多缓存在幕后工作,你现在才 ...
- 解读JVM级别本地缓存Caffeine青出于蓝的要诀 —— 缘何会更强、如何去上手
大家好,又见面了. 本文是笔者作为掘金技术社区签约作者的身份输出的缓存专栏系列内容,将会通过系列专题,讲清楚缓存的方方面面.如果感兴趣,欢迎关注以获取后续更新. 在前面的几篇文章中,我们一起聊了下本地 ...
- 缓存级别与缓存更新问题
缓存失效问题被认为是计算机科学中最难的两件事之一,这篇文章来自翻译,内容主要包括缓存级别与缓存更新常见的几种模式. 缓存应用模式 常见缓存应用模式 缓存常用来加快页面的加载速度,减少服务器或数据库服务 ...
- SpringCloud实战4-Hystrix线程隔离请求缓存请求合并
接着上一篇的Hystrix进行进一步了解. 当系统用户不断增长时,每个微服务需要承受的并发压力也越来越大,在分布式环境中,通常压力来自对依赖服务的调用,因为亲戚依赖服务的资源需要通过通信来实现,这样的 ...
- HTTP缓存相关知识介绍
1.概述 HTTP协议的缓存是通过6个报文头完成的,通过两层协商使web资源能够不那么频繁地在服务器与客户端之间传递,从而节约了流量,提高浏览速度.以从客户端到服务器的顺序,第一层协商为Cache-C ...
最新文章
- 计算机视觉研究入门全指南----新手博士需要准备的资料
- 阿里云OSS Multipart Upload上传实例
- MySQL批量更改数据库表结构字符集
- 简单的for()循环使用方式foreach
- 作业帮电脑版在线使用_作业帮:创新科技驱动在线教育新模式
- 大数据技术和python开发工程师
- mysql批量查询版本号最大的_mysql子查询批量找id最大的
- JavaWeb — 获取复选框的值时,要注意不是得到显示的值,而是得到value值
- (转载)make的-j命令(加速Linux程序编译)
- gpgga格式读取MATLAB,gpgga数据格式
- SVN工具介绍- VisualSVN Server与TortoiseSVN
- Excel RibbonUI:editBox控件使用
- 元的符号在计算机怎么打出来,告诉你电脑上特殊符号怎么打出来?
- EXCEL中文转英文首字母拼写
- 自我成长的9个小贴士
- OS学习笔记-6(清华大学慕课) 非连续内存分配管理
- 【水晶报表】中如何打印条形码?
- UG NX 12 组合投影曲线
- maven本地仓库的更新
- SmallTalkEDI程序