前记:映像中之前工作的时候缓存用的是Tair。 最近看到很多关于Redis缓存的blog。于是在网上搜集了一些资料,下面是整理的读书笔。
why?由于程序直接访问数据库的时间成本很高的,使用缓存可以减少数据库的访问次数,提升程序的响应时间。同时还能降低数据的压力
when? 什么时候使用缓存? 不经常变化的数据;或者从源头读取费时费力的数据都可以放缓存,例如:
case 1: 程序多次访问数据库,但查询结果都相同,把查询结果放在缓存里;
case 2: 数据库访问的结果要进行很复杂费时的计算,把计算结果放在缓存里;
case 3: 网站上每个页面都需要的user id 信息,放在缓存里。
以下内容摘自 腾讯大数据_ 大型web系统数据缓存设计
1. 单表数据量太小: MySql 单表数据条数控制在 2000w条(20 million)
2. TPS太小 :通常情况下,MySql的Transaction Per Second只有1500
3. 响应时间: 通常情况下,MySql的响应时间在10ms以内,
常见日均PV 千万 (200 million) 的大型web 网站挑战:
每个PV(page view) 所产生的数据库读写量可能要超出几倍,这种情况下,每天所有的数据读写请求量可能远超出关系型数据的处理能力,更别说在流量峰值的情况下了; 当拥有几亿条数据,1w TPS的时候,响应时间也要在10ms以内,这几乎是任何一款关系型数据都无法做到的。 那么这个问题如何解决呢?最简单有效的办法当然是缓存!
1天有24*3600 = 2,073,600 ~ 2 million seconds;
1. 本地缓存:不管是本地内存还是磁盘,其速度快,成本低,在有些场合非常有效。但不适用于web系统的集群负载均衡结构
2. 数据库缓存: 主要是指数据库的查询缓存,大部分数据库都是会提供。基本的原理就是用查询语句的hash值做key,对结果集进行缓存;如果利用的好,可以很大的提高数据库的查询效率!
3. 客户端缓存:浏览器cookie,浏览器本地缓存,html5缓存
4. 分布式缓存: 分布式缓存存在的目的就是为了提供比RDB更高的TPS和扩展性,同时又帮你承担了数据同步的痛苦;优秀的分布式缓存系统有大家所熟知的Memcached、Redis,阿里的Tair. 对比关系型数据库和缓存存储,其在读和写性能上的差距可谓天壤之别;memcached单节点已经可以做到15w以上的TPS、Redis、google的levelDB也有不菲的性能,而实现大规模集群后,性能可能会更高! 所以,在技术和业务都可以接受的情况下,我们可以尽量把读写压力从数据库转移到缓存上,以保护看似强大,其实却很脆弱的关系型数据库。
5. 阿里Tair缓存
Tair是提供快速访问的内存(MDB引擎)/持久化(LDB引擎)存储服务,基于高性能、高可用的分布式集群架构,满足读写性能要求高及容量可弹性伸缩的业务需求。
Tair 支持 MDB,RDB和LDB三款产品,可适合于各种常见的存储场景.
阿里资深技术专家:如何在双11万亿流量下保持系统稳定?
1. Redis的数据类型,数据结构和code example
2. 同为分布式缓存,为何Redis更胜一筹?
本文主要引入Memcached和Redis与淘宝开源Tair分布式存储进行对比测试,由于各自适用场景不同,且每个产品的可配置参数繁多,涉及缓存策略、分布算法、序列化方式、数据压缩技术、通信方式、并发、超时等诸多方面因素,都会对测试结果产生影响,单纯的性能对比存在非常多的局限性和不合理性,所以不能作为任何评估依据,仅供参考,加深对各自产品的理解。
1. 腾讯大数据_ 大型web系统数据缓存设计
2. 阿里Tair github 官方主页
3. Tair, Redis, Memcached性能测试对比