架构-2,高性能架构之NoSQL和缓存

架构-1:高性能架构之读写分离和分表分库
架构-2:高性能架构之NoSQL和缓存
架构-3:高性能架构之单机高性能和负载均衡
架构-4:高可用架构之存储高可用
架构-5:高可用架构之Paxos和Raft
架构-6:高可用架构之一致性哈希算法和数据分片
架构-7.高可用架构之接口级故障

关系型数据库的局限

NoSQL不是指No SQL而是指No only SQL,关系型数据库非常成熟于强大,但是依然存在一些问题,所以NoSQL时关系型数据库的一种补充而不是替代。

  • 1.只能存储行结构而不能存储更复杂的数据结构,比如某个属性是数组,关系型数据库只能把数组存放到另外一个表或者解析成字符串存储。
  • 2.表结构不易修改。由于强制每一行数据个列都是一样的,对于数据量很大的表来说,修改一个字段都是非常耗时的,而且容易出现错误。
  • 3.大数据量下的I/O,可能导致锁住表很久,即使只是针对某一列进行操作。
  • 4.全文搜索效率低。使用like关键字搜索文本时,效率非常低,一般不推荐使用。

NoSQL解决方案

针对关系型数据库的问题,NoSQL提供了一些解决方案。

  • Redis:提供Key-Value存储,而且提供了string,hash,list,set.sorted set,bitmap等复杂的存储数据结构。而且Redis性能非常高,提供了过期功能,经常被作为缓存使用。但是由于Redis时基于内存操作的,尽管提供了持久化的操作,但是依然不能完全保证数据不丢失。
  • MongoDB:文档型数据库。MongoDB以Json的格式存放数据,并不强制要求每一行数据的格式是一致的,可以存放复杂的数据结构。适用于电商游戏等属性复杂的产品。
  • HBase:列式数据库,区别于关系型数据库的行数据库,HBase是以列存储的数据库。这样在大数据量仅操作某一列的情况下,I/O效率非常高。
  • Elasticsearch:全文搜索引擎,针对关系型数据库全文搜索困难的问题,Elasticsearch使用倒排索引,提供了高效的全文搜索。

高性能缓存

缓存几乎是高性能首先想到的方案,对于以下的情况,缓存能够极大的提升整体的性能。

  • 读多写少的业务:绝大多数在线业务都是都是写少,如微博,淘宝,微信,读业务占据了90%的业务量,几十万条的select对于mysql会产生极大的I/O压力。而诸如Redis和Memcache等基于内存的高性能的缓存能够解决这一难点。
  • 经过复杂计算后的数据:比如淘宝的搜索,大部分的搜索都落在搜索条件的前10页,而获取这些数据需要进行很多运算。把前10页的结果缓存下来,能够极大的提升搜索的效率。

缓存带来的问题

缓存穿透

缓存穿透是指大量的查询命中缓存中不存在的值,导致大量的查询都落在数据库上,造成数据库崩溃。产生这种情况的原因有两种:一种是恶意查询,如黑客故意大量的查询某个不存在的ID。一种是生成耗时较长,导致在缓存没有更新好之前,发生大量的更新缓存的请求直接落在了数据库上。
针对第一种情况,解决方案是针对不存在的值,缓存一个null值或者默认值,过期时长可以设置短一些,比如5分钟,这样可以防止对应的值被更新为存在的值而导致数据无法查询。
针对第二种情况,可以使用解决缓存雪崩的解决方案。

缓存雪崩

缓存雪崩是指高访问量的缓存过期,导致大量的更新缓存的请求直接落在了数据库上。针对这种情况和生成耗时长的缓存,解决方案是不要通过访问直接更新缓存而是通过中介去更新缓存。
解决方案:

  • 1.使用队列更新,而不是直接更新。当发现缓存失效后,并不直接去访问数据库更新缓存,而是发生一个请求到队列,由队列去更新,然后循环判断数据是否被更新,如果已经更新了则直接返回数据。队列可以过滤重复的请求,不用大量的访问数据库。缺点是,如果缓存更新速度比较慢(比如需要大量运算的结果),会导致访问响应时间变长。
  • 2.使用后台更新。后台运行一个定时任务去更新失效的缓存,这样防止在请求到来时才去更新缓存导致响应时间变长。但是有可能存在已经失效的缓存但是定时任务还未启动的情况,所以要配合方案1一起使用。
  • 3.双Key策略。保存两个key1和key2,当key1失效时,发送一个更新请求到队列,然后直接返回key2的值。然后队列把key1和key2同时更新。优点是没有访问延迟,缺点是占用了两倍的缓存。
缓存热点

比如某明星发了一个恋爱的微博,这个微博会被大量的访问,如果只有一个缓存,会导致大量的请求都落在该缓存上,导致这个缓存服务器崩溃。解决方案是针对可能是热点的缓存,复制副本到多个缓存服务器上,通过Nginx之类的进行负载均衡。比如微博超过100W粉丝的用户的每条微博都会有100份副本缓存。
其中一个细节是:副本不要设置相同的过期时间,会导致缓存雪崩。即使已经做了缓存雪崩的处理,这种超高的访问量也会对更新缓存的服务造成极大的压力。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值