同事的QCON会议记录分享

新浪微博Redis应用实践

 

Redis(http://redis.io/)是一个key-value存储系统、类似于Memcached、但相比前者有一定的优势(如支持更多的Value、性能更好等)

新浪大量使用Redis、其中一个重要使用场景是计数器、微博有大量需要实时计数的场景、如:微博数,粉丝数和关注数等等、

在新浪微博如此海量的数据和高并发场景(如一条微博在短时间内会被迅速转发N次)去count和Update DB显然不靠谱。

Offer这边也有很多使用数字的场景:如重发的400限制条数、普及版会员的优先展示Offer数等、

当前是采用MC(memcached)+Mysql的方式、但MC的穿透问题、高并发导致和DB数据不一致的问题、以往也引起过不少投诉。

而使用Redis可以很好的解决这些问题。当然新浪的经验也告诉我们Redis不是说用了肯定就合适、需要看具体的业务和使用场景。

 

eBay技术平台

 

同为B2B站点、发现Ebay的技术架构和我们有不少的共同点、技术上面临的挑战也跟我们有很大的相似

 

eBay的一些数据

 

1、数据总存储量达到9P

2、10000台应用服务器

3、4400万行代码

4、20亿张图片

5、可用性99.94%

 

架构特点:

 

1、数据库、应用层、搜索引擎等都进行了拆分、保证可扩展性

2、应用间的Session无状态化(类似于Session服务化)、应用服务器的无状态化

3、在容错和监控方面:有Logging中心、Mark downs(自动发现哪些应用不可用、一旦发现就不再请求到该应用)

4、服务化大规模使用(但主要采用Webservice的方式、和amazon类似)

 

面临的挑战和一些解决方案:

 

1、代码业务逻辑太复杂(4400万行代码、4000多个Jar包)、应用间依赖太多、耦合很高、开发效率很低

  

   OSGi模块化、封装内部逻辑、约定好模块之间的边界和耦合方式

 

2、服务的数据格式很多、服务(Webservice)大量使用带来的延迟问题

 

   将各种数据格式统一转换成JAXB、采用二进制格式(Google的protocol buf)替代XML和JSON等

 

3、服务调用中的N+1问题、服务返回数据利用率问题(有时只是获取服务返回对象的某一个字段、其他都浪费掉了)、服务串行调用延迟太高(如何能够实现并行调用)

 

  自主开发了ql.io(即将开源)、能够像写SQL那样调用服务、可以有类似于SQL那样的Where、Filter、Join、Order By等条件、只取出想要的数据、也可以并行调用服务。

 

大众点评网的技术变迁之路

 

总体讲的都是通用的技术、Memcached的使用经验方面讲的比较细致:

 

1、缓存对象粒度的控制、便于缓存的更新删除

 

有时需要缓存一个列表、通用的方式是把整个列表对象全部放到缓存里面、但是这样List里的对象只要有一个发生变更整个列表就需要更新或者删除

改进的方式是:比如原来是缓存List<Shop>、现在首先缓存一个List<ShopIndexId>、里面的Key只是一个Shop的Id、然后分别缓存每个Shop对象、这样的

好处是每个Shop对象本身可以直接通过缓存读取、当单个Shop对象变更时不需要清除整个List、List里只有Id、而这一般都不会改变、通过Memcached的

Mget()可以一次性获取整个列表

 

2、大批量缓存的清除

 

如果缓存的数据格式变化较大时、为了防止缓存的脏数据问题;一般可以采用新建Region让原来的缓存自动过期而不是手动清除(Lazy Delete)

如果缓存的数据大体跟原来相同、只是某个字段变化的话可以采用给Key加版本号的方式来控制、大众点评网写了一个通用的Cache Provider组件来

自动管理Key的版本号、避免了开发自己去维护版本号

 

3、缓存序列化和反序列化对CPU和网络的开销

 

可以采用一些相对高效的数据交换格式如Google Protocol Buffer(空间利用率和序列化性能比XML、Json、Java对象序列等好很多)

 

4、多Memcached服务器下的分布式算法

 

采用业界通用的一致性哈希算法(我们还用模取余的方式、说是为了兼容老代码)

 

5、在数据访问层DAO实现自动缓存

 

通过AOP来实现、确实很多时候只是缓存DAO层返回的对象、实现方式一般都差不多的、通过AOP来自动处理可以减少很多重复代码

 

6、缓存雪崩问题

 

指的是缓存大量失效导致DB负载瞬间上升的问题(这个我们以前也碰到过)、大众点评网原来是采用双缓存的策略、但是这样维护起来比较麻烦、且容易造成缓存错乱的情况

后面准备采用Redis来替代Memcached也解决这个问题(其他方面:复制分发、对象的部分读取、高并发下的性能更好)。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值