软考 - 04 分布式缓存系统
文章目录
题目
某初创企业的主营业务是为用户提供高度个性化的商品订购业务,其业务系统支持PC端、手机App等多种访问方式。系统上线后受到用户普遍欢迎,在线用户数和订单数量迅速增长,原有的关系数据库服务器不能满足高速并发的业务要求。 为了减轻数据库服务器的压力,该企业采用了分布式缓存系统,将应用系统经常使用的数据放置在内存,降低对数据库服务器的查询请求,提高了系统性能。在使用缓存系统的过程中,企业碰到了一系列技术问题。
【问题1】
该系统使用过程中,由于同样的数据分别存在于数据库和缓存系统中,必然会造成数据同步或数据不一致性的问题。该企业团队为解决这个问题,提出了如下解决思路:应用程序读数据时,首先读缓存,当该数据不在缓存时,再读取数据库;应用程序写数据吋,先写缓存,成功后再写数据库;或者先写数据库,再写缓存。 王工认为该解决思路并未解决数据同步或数据不一致性的问题,请用100字以内的文字解释其原因。 王工给出了一种可以解决该问题的数据读写步骤如下: 读数据操作的基本步骤: 1.根据key读缓存; 2.读取成功则直接返回; 3.若key不在缓存中时,根据key (a) ; 4.读取成功后,(b) ; 5.成功返回。 写数据操作的基本步骤: 1.根据key值写_(c) ; 2.成功后(d)_ ; 3.成功返回。 . 请填写完善上述步骤中(a)~(d)处的空白内容。
【答案1】
存在双写不一致问题,在写数据时,可能存在缓存写成功,数据库写失败,或者反之,从而造成数据不一致。当多个请求发生时,也可能产生读写冲突的并发问题。
(a)从数据库中读取数据或读数据库 (b)更新缓存中key值或更新缓存 (c)数据库 (d)删除缓存key或使缓存key失效或更新缓存(key值)
【问题2】
缓存系统一般以key/value形式存储数据,在系统运维中发现,部分针对缓存的杳询,未在缓存系统中找到对应的key,从而引发了大量对数据库服务器的查询请求,最严重时甚至导致了数据库服务器的宕机。
经过运维人员的深入分析,发现存在两种情况: (1)用户请求的key值在系统中不存在时,会查询数据库系统,加大了数据库服务器的压力; (2)系统运行期间,发生了黒客攻击,以大量系统不存在的随机key发起了査询请求,从而导致了数据库服务器的宕机。
经过研究,研发团队决定,当在数据库中也未查找到该key时,在缓存系统中为key设置空值,防止对数据库服务器发起重复查询。 请用100字以内文字说明该设置空值方案存在的问题,并给出解决思路。
【答案2】
存在问题:不在系统中的key值是无限的,如果均设置key值为空,会造成内存资源的极大浪费,引起性能急剧下降。
解决思路:查询缓存之前,对key值进行过滤,只允许系统中存在的key进行后续操作(例如采用key的bitmap 进行过滤)。
【问题3】
缓存系统中的key—般会存在有效期,超过有效期则key失效;有时也会根据LRU算法将某些key移出内存。当应用软件查询key时,如key失效或不在内存,会重新读取数据库,并更新缓存中的key。
运维团队发现在某些情况下,若大量的key设置了相同的失效时间,导致缓存在同一时刻众多key同时失效,或者瞬间产生对缓存系统不存在key的大量访问,或者缓存系统重启等原因,都会造成数据库服务器请求瞬时爆量,引起大量缓存更新操作,导致整个系统性能急剧下降,进而造成整个系统崩溃。 请用100字以内文字,给出解决该问题的两种不同思路。
【答案3】
思路 1:缓存失效后,通过加排它锁或者队列方式控制数据库写缓存的线程数量,使得缓存更新串行化;
思路 2:给不同key设置随机或不同的失效时间,使失效时间的分布尽量均匀;
思路 3:设置两级或多级缓存,避免访问数据库服务器。
相关文章
- 技术硬实力,分布式缓存如何与本地缓存配合,提高系统性能?
- 读猿码系列——6.Golang中用幂等思路解决缓存击穿的方案:singleflight
- 使用内存缓存优化 WordPress 自动草稿功能
- 如何高效使用Redis作为LRU缓存
- 使用Redis和Codis创建可扩展的分布式缓存系统(rediscodis)
- Redis:实现高效的缓存系统(redis作为缓存)
- 使用Redis实现高效缓存调用(redis调用)
- 深入浅出 Redis 缓存技术(redis缓存介绍)
- 利用Redis缓存提升系统性能(redis缓存如何使用)
- SQL Server缓存池:重塑系统性能(sqlserver缓存池)
- Redis缓存,提高系统性能(redis缓存)
- 构建可靠的支付回调接口使用Redis缓存断点续传(支付回调接口redis)
- 为项目增添更快速之缓存系统Redis实现(为项目添加redis缓存)
- 加快系统效率引入Redis缓存(加redis缓存)
- 缓存池改善系统性能使用Redis缓存池进行创建(创建一个redis)
- 系统基于Redis的可持久化可兼容缓存系统(兼容redis的缓存)
- 如何自己搭建基于Redis的分布式缓存系统(如何自己实现redis)
- 深入Redis如何查询缓存(怎么查redis缓存)
- Redis缓存提升系统性能的利器(redis 缓存的使用)
- 利用Redis缓存极大优化系统性能时间(redis缓存 存在时间)