公司动态
Redis典型应用 - 缓存,缓存更新策略,内存淘汰策略,缓存预热,缓存穿透,缓存雪崩,缓存击穿
目录什么是缓存硬件访问速度:CPU 寄存器 内存 硬盘 网络二八原则:使用 Redis 作为缓存为什么说关系型数据库的性能不高?为什么当访问数据库的并发量上升之后,数据库很容易宕机?Redis 是作为数据库缓存的常用方案从上述过程图中我们可以看出,当客户端发送查询请求时:缓存更新策略:策略一:定期生成:以搜索引擎为例。缺点:策略二:实时生成:通用的内存淘汰策略:缓存常见问题:缓存预热:什么是缓存预热?缓存穿透:什么是缓存穿透?产生原因:解决方法:缓存雪崩:什么是缓存雪崩?key 大规模失效的原因:解决方法:缓存击穿:什么是缓存击穿?解决方法:什么是缓存缓存是计算机中的一个典型概念,意思是把一些数据放到访问速度更快,更容易访问到的地方,这样方便我们随时读取举个例子比如我需要去高铁站坐高铁.我们知道坐高铁是需要反复刷身份证的进入高铁站, 检票, 上车, 乘车过程中, 出站….正常来说, 我的身份证是放在皮箱里的皮箱的存储空间大, 足够能装.但是每次刷身份证都需要开一次皮箱找身份证, 就非常不方便.因此我就可以把身份证先放到衣服口袋里.口袋虽然空间小, 但是访问速度比皮箱快很多.这样的话每次刷身份证我只需要从口袋里掏身份证就行了, 就不必开皮箱了.此时 “口袋” 就是 “皮箱” 的缓存. 使用缓存能够大大提高访问效率.硬件访问速度:CPU 寄存器 内存 硬盘 网络对于计算机硬件来说,访问速度越快的硬件,成本更高,存储空间更小,因此,缓存上只存放热点数据就很重要了二八原则:20%的数据已经够80%的业务请求来使用到使用 Redis 作为缓存在之前的一些开发中,我们常常使用关系型数据库(MySQL)来存储我们所需要的数据但是,关系型数据库的性能不高,进行一次查询操作消耗的系统资源比较多,在高并发场景下很难以支持为什么说关系型数据库的性能不高?数据库把数据存储在硬盘上, 硬盘的 IO 速度并不快. 尤其是随机访问.如果查询不能命中索引, 就需要进行表的遍历, 这就会大大增加硬盘 IO 次数.关系型数据库对于 SQL 的执行会做一系列的解析,校验, 优化工作.如果是一些复杂查询, 比如联合查询, 需要进行笛卡尔积操作, 效率更是降低很多.…为什么当访问数据库的并发量上升之后,数据库很容易宕机?服务器每次处理一个请求都是需要消耗一定的硬件资源的。所谓的硬件资源包括不限于CPU内存硬盘网络带宽……一个服务器的硬件资源本身是有有限的。一个请求消耗一份资源请求多了自然把资源就消耗尽了。后续的请求没有资源可用自然就无法正确处理。更严重的还会导致服务器程序的代码出现崩溃。Redis 是作为数据库缓存的常用方案处理同一个访问请求,Redis 消耗的系统资源更少,支持的并发量更高Redis 将数据存储在内存中,内存的访问速度更快Redis 是简单的key - value存储结构,没有涉及到很复杂的存储规则从上述过程图中我们可以看出,当客户端发送查询请求时:要查询的数据在 Redis 中存在,直接返回,不需要再经过数据库当要查询的数据在 Redis 中不存在时,此时才去数据库中进行查询缓存更新策略:通俗来讲,也就是将什么样的数据放到缓存中,哪些数据才是热点数据?策略一:定期生成:在指定时间间隔内(小时,天,月),通过对访问的数据进行统计,挑选出访问频率最高的前面一部分数据以搜索引擎为例。用户在搜索引擎中会输入一个 “查询词”有些词是属于高频的大家都爱搜(鲜花蛋糕同城交友……)。有些词就属于低频的大家很少搜。搜索引擎的服务器会把哪个用户什么时间搜了啥词都通过日志的方式记录的明明白白。然后每隔一段时间对这期间的搜索结果进行统计日志的数量可能非常巨大这个统计的过程可能需要使用hadoop或者spark等方式完成)。从而就可以得到“高频词表”。缺点:定期生成策略的实时性不高,在一些场合中,例如春晚这个词在过年的时候很高频,但是在平时没什么人来进行搜索策略二:实时生成:给缓存设定容量上限(通过 Redis 配置文件中的maxmemory参数设定)接下来当用户进行查询时:要查询的数据在 Redis 中,直接返回Redis 中不存在要查询的数据,去数据库中进行查询,查询完成后,再把查询得到的数据写回到 Redis 中如果存储的数据接近缓存容量上限,此时会触发内存淘汰策略,把一些不太热门的数据淘汰掉,持续一段时间之后,剩下来的就是 热门数据了通用的内存淘汰策略:FIFO (First In First Out) 先进先出把缓存中存在时间最久的也就是先来的数据淘汰掉。LRU (Least Recently Used) 淘汰最久未使用的记录每个 key 的最近访问时间. 把最近访问时间最老的 key 淘汰掉.LFU (Least Frequently Used) 淘汰访问次数最少的记录每个 key 最近一段时间的访问次数. 把访问次数最少的淘汰掉.Random 随机淘汰从所有的 key 中抽取幸运儿被随机淘汰掉.缓存常见问题:缓存预热:什么是缓存预热?一开始将 Redis 接入的时候,或者 Redis 中大部分 key 失效的时候,此时 Redis 中没有啥可用数据,业务请求都直接打到数据库上,给数据库造成较大压力因此需要将一些热点数据提前存入 Redis 中,给数据库分担压力热点数据可以采用前面介绍过的定期策略来生成,这些热点数据可能不那么准确,但可以帮助数据库抵挡一部分请求,降低数据库的压力,后面随着时间的推移,留下来的数据会慢慢变成热点数据缓存穿透:什么是缓存穿透?访问的 key既不在 Redis 中,也不在数据库上,此时这样的 key 不会被放到缓存上,当后面再有请求来访问这些 key 的时候,请求会直接打到数据库上,给数据库造成较大压力产生原因:业务设计不合理,没有把一些非法的数据(不合法的参数)过滤掉,导致一些非法 key也被进行查询不小心把部分数据从数据库上删了黑客恶意攻击解决方法:针对要查询的参数进行严格的合法性校验针对数据库上不存在的 key 也存储到 Redis 中,将 value 设置成 “”,避免后续频繁访问数据库使用布隆过滤器先判断 key 是否存在,然后再进行查询缓存雪崩:什么是缓存雪崩?短时间内,Redis 上的key 大规模失效,导致数据库压力骤增,甚至宕机key 大规模失效的原因:Redis 挂了Redis 上的大量 key 同时过期解决方法:部署高可用的 Redis 集群,并且完善监控报警体系对 key 设置过期时间的时候,添加随机时间因子缓存击穿:什么是缓存击穿?缓存雪崩的特殊情况,热点 key突然过期了,业务请求直接打到数据库上,数据库压力骤增,甚至宕机解决方法:对热点 key 不设置过期时间进行必要的服务降级,访问数据库的时候使用分布式锁,限制同时请求数据库的并发数