缓存系列文章–无底洞问题-java开发java经验技巧

缓存系列文章–无底洞问题-java开发java经验技巧

ID:30920683

大小:243.56 KB

页数:13页

时间:2019-01-04

缓存系列文章–无底洞问题-java开发java经验技巧_第1页
缓存系列文章–无底洞问题-java开发java经验技巧_第2页
缓存系列文章–无底洞问题-java开发java经验技巧_第3页
缓存系列文章–无底洞问题-java开发java经验技巧_第4页
缓存系列文章–无底洞问题-java开发java经验技巧_第5页
资源描述:

《缓存系列文章–无底洞问题-java开发java经验技巧》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库

1、缓存系列文章-无底洞问题・编程开发技术缓存系列文章-无底洞问题原文出处:carlosfu、冃尽1・?什么是缓存无底洞问题:Facebook的工作人员反应2010年已达到3000个memcached节点,储存数千G的缓存。他们发现一个问题-memcached的连接效率下降了,于是添加memcached节点,添加完Z后,并没有好转。称为“无底洞”现象。2.缓存无底洞产生的原因键值数据库或者缓存系统,rtT丁通當采用hash函数将key映射到对应的实例,造成key的分布与业务无关,但是由于数据量、访问量的需求,需要使用分布式后(无论是客户端一致性哈性、rcdis-

2、cluster、codis),批量操作比如批量获取多个key(例如redis的mget操作),通常需要从不同实例获取key值,相比于单机批量操作只涉及到一次网络操作,分布式批量操作会涉及到多次网络ioo3.无底洞问题带来的危害(1)客户端一次批量操作会涉及多次网络操作,也就意味着批量操作会随着实例的增多,耗时会不断增大。(1)服务端网络连接次数变多,对实例的性能也有一定影响。4.结论用一句通俗的话总结:更多的机器不代表更多的性能,所谓“无底洞”就是说投入越多不一定产出越多。分布式乂是不可以避免的,因为我们的网站访问量和数据量越來越大,一个实例根木坑不住,所以

3、如何高效的在分布式缓存和存储批量获取数据是一个难点。二、哈希存储与顺序存储在分布式存储产品屮,哈希存储与顺序存储是两种重要的数据存储和分布方式,这两种方式不同也直接决定了批量获取数据的不同,所以这里需要对这两种数据的分布式方式进行简要说明:1.hash分布hash分布应用丁•大部分key-value系统屮,例如memcache,redis-cluster,twemproxy,即使像mysql在分库分表时候,也经常会用user%100这样的方式。hash分布的主要作用是将key均匀的分布到各个机器,所以它的一个特点就是数据分散度较高,实现方式通常是hash(k

4、ey)得到的整数再和分布式节点的某台机器做映射,以rcdis-clustcr为例了:问题:和业务没什么关系,不支持范围查询。2•顺序分布rowkey1,rowkey2rowkey10000rowkey40001,rowkey40002rowkey50000RegionRegionrowkey50001,rowkey50002rowkey60000Regionrowkey60001,rowkey60002rowkey60000Regionrowkey70001,rowkey70002rowkey80000Region?3・两种分布方式的比较方式特点典型产品哈希

5、I.数据分散度高2.键值分布与业务无关3.无法一致性哈希mcmcachcrcdisClustcr其分布顺序访问4.支持批量操作他缓存产品BigTableHBase顺序1.数据分散度易倾斜2.键值分布与业务相关3.分布可以顺序访问4.支持批量操作三、分布式缓存/存储四种Mget解决方案1.io的优化思路(1)命令本身的效率:例如sql优化,命令优化(1)网络次数:减少通信次数(2)?降低接入成木:长连/连接池,NIO等。(3)?10访问合并:0(n)到0(1)过程:批量接口(mget),2.?如果只考虑减少网络次数的话,mget会有如下模型3.四种解决方案(1

6、).串行mget将Mget操作(n个key)拆分为逐次执行N次get操作,很明显这种操作吋间复朵度较高,它的操作时间二n次网络时间+n次命令时间,网络次数是n,很显然这种方案不是最优的,但是足够简单。(2).串行IO将Mget操作(n个key),利用已知的hash函数算出key对应的节点,这样就可以得到一个这样的关系:Map,也就是每个节点对应的一些keys它的操作时间=nodc次网络时间+n次命令时间,网络次数是node的个数,很明显这种方案比第一种要好很多,但是如果节点数足够多,述是冇一定的性能问题。(2).串行IO将Mge

7、t操作(n个key),利用已知的hash函数算出key对应的节点,这样就可以得到一个这样的关系:Map,也就是每个节点对应的一些keys它的操作时间=nodc次网络时间+n次命令时间,网络次数是node的个数,很明显这种方案比第一种要好很多,但是如果节点数足够多,述是冇一定的性能问题。合并keynode->keysnodeMGelkeysnode->keysnode->keysnodenode(1).并行10此方案是将方案(2)小的最后一步,改为多线程执行,网络次数虽然还是nodes.sizeO,但网络时间变为o(l),但是这种

8、方案会增加编程的复杂度。它的操作时间二1次网络时间+

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。