基于redis的缓存系统设计
1. 缓存的目的
使用缓存系统的目的是为高并发的访问提供高质量的、实时的反馈。一般的缓存系统,都是按照 key-value 去查询缓存层(如 redis),如果 key 不存在,就应该去后端持久层DB(如 HBase,MySQL)中查找 。这个时候,如果请求的并发量很大,就会对后端的DB系统造成很大的压力。这就叫做缓存穿透。
造成的原因
1.业务自身代码或数据出现问题
2.一些恶意攻击、爬虫造成大量空的命中,此时会对数据库造成很大压力
3.缓存崩溃
解决方法
如果一个查询返回的数据为空,不管是数据不存在还是系统故障,我们仍然把这个结果进行缓存,但是设置一个较短的过期时间。
2. 缓存系统设计
这里假定使用 redis 作为缓存层,hbase 作为 DB 层,kafka 作为队列层。每层的软件正好符合其特性。以下分写入和读取2个客户端的操作加以说明。由于业务的不同,对数据持久化的强度要求也不同。比如充值,购买等行为,要求强持久性(2.2),对速度和性能的要求就相应降低。而对话,聊天,游戏互动等行为,要求强实时性(2.1),对速度要求极高,相应地对持久化可靠性要求就可以低一些。
(更安全的设计是保证数据的强一致性,这是通过关系数据库的分布式事务来实现的:即在某个帐号的一笔事务期间,