安庆专业网站建设公,网站建设胶州家园,搜索引擎营销简称seo,凡科小程序制作什么是缓存
缓存(Cache)的核心思路就是把一些常用的数据放到访问速度更快的地方#xff0c;方便获取。关于硬件的访问速度来说 CPU寄存器内存硬盘网络 因此常见使用内存作为硬盘的缓存#xff0c;例如redis。使用硬盘作为网络的缓存#xff0c;例如浏览器通过h…
什么是缓存
缓存(Cache)的核心思路就是把一些常用的数据放到访问速度更快的地方方便获取。关于硬件的访问速度来说 CPU寄存器内存硬盘网络 因此常见使用内存作为硬盘的缓存例如redis。使用硬盘作为网络的缓存例如浏览器通过http/https从服务器上获取到数据html,css,js图片视频音频文字像这种体积大又不太会改变的数据就可以保存到浏览器本地后续在打开该网页就不必重新从网络获取上述数据了。根据“二八原则”,20%的热点数据能够应对80%的访问场景。因此只需要把这些少量的热点数据缓存起来就可以应对大多数的场景从而在整体上有明显的性能提升。
使用redis作为缓存
在网站开发中我们经常使用mysql来存储数据。mysql虽然功能强大但是有一个致命的缺点就是性能不高进行一次查询操作要消耗很多系统硬件资源。 :::info 为什么关系型数据库性能不高
硬件原因 数据库把数据存储在硬盘上硬盘的IO速度不快尤其是随机访问如果查询不能命中索引就需要进行表的遍历这就会增加磁盘IO次数 软件原因 关系型数据库对于sql的执行会做一系列解析校验优化工作对于复杂查询比如联合查询需要进行笛卡尔积效率很低 ::: 因此如果访问数据库的并发量很高对于数据库的压力就很大容易使数据库宕机。 :::success 为什么并发量高了就会宕机服务器每次处理一个请求就需要消耗一定的硬件资源例如cpu,内存硬盘网络带宽。而一个服务器的资源是有限的一个请求消耗一份资源当把资源耗尽后续请求就没有资源可用就无法正确处理更严重的还会导致服务器程序的代码崩溃。 ::: 如何让数据库能够承担更大的并发量
开源引入更多机器部署更多数据库构成数据库集群主从复制分库分表节流引入缓存使用其他方式保存经常访问的热点数据从而降低直接访问数据库的请求数量 实际开发中两种方案搭配使用 缓存更新策略 缓存更新策略 定期生成
访问的数据会以日志的形式记录下来我们可以写个程序如python,shell脚本代码针对这些日志进行统计统计这一天/周/月每个词出现的频率在根据频率降序排序取出前20%的词就是“热点词”。将这些“热点词”放大redis中
实时生成
如果在redis中查到就直接返回如果redis中不存在就从数据库查把查到的结果同时写到redis中。经过一段时间“动态平衡”redis中的key就逐渐变成热点数据了。
内存淘汰机制
不停的写入redis就会使redis的内存占用越来越多当达到内存上限就会触发redis的“内存淘汰机制”。
FIFOfirst in first out)先进先出把缓存中存在时间最久的先来的数据淘汰掉LRUleast recently used)淘汰最久未使用记录每个key的最近访问时间把最近访问时间最老的key淘汰掉LFUleast frequently used)淘汰访问次数最少的记录每个key最近一段时间的访问次数把访问次数最少的淘汰掉Random随机淘汰随机抽取key删除掉
redis配置文件中内置的淘汰策略
volatile-lru 当内存不⾜以容纳新写⼊数据时从设置了过期时间的key中使⽤LRU算法最近最少使⽤进⾏淘汰allkeys-lru 当内存不⾜以容纳新写⼊数据时从所有key中使⽤LRU算法最近最少使⽤进 ⾏淘汰.volatile-lfu4.0版本新增当内存不⾜以容纳新写⼊数据时在过设置了过期时间的key中使⽤LFU算法 进⾏删除key.allkeys-lfu 4.0版本新增当内存不⾜以容纳新写⼊数据时从所有key中使⽤LFU算法进⾏淘汰volatile-random 当内存不⾜以容纳新写⼊数据时从设置了过期时间的key中随机淘汰数 据.allkeys-random 当内存不⾜以容纳新写⼊数据时从所有key中随机淘汰数据volatile-ttl 在设置了过期时间的key中根据过期时间进⾏淘汰越早过期的优先被淘汰. (相当于 FIFO, 只不过是局限于过期的 key)noeviction 默认策略当内存不⾜以容纳新写⼊数据时新写⼊操作会报错
缓存常见问题 缓存预热
缓存更新中有定期更新不需要预热定期更新需要预热。在redis服务器首次接入的时候服务器中没有数据。此时所有请求都会打给mysql随着时间推移redis上的数据越积累越多mysql承担的压力逐渐变小。但就怕刚开始mysql就垮了因此需要进行缓存预热将定期生成和实时生成结合先通过离线的方式通过一些统计的途径先把热点数据找到一批导入到redis中此时导入的这批热点数据就能帮mysql承担很大的压力随着时间推移逐渐使用新的热点数据淘汰掉旧的数据。
缓存穿透(cache penetration)
查询某个key时redis中没有mysql中也没有。这次查询没有下次查询还是没有如果像这样的数据非常多并且还反复查询就会给mysql带来很大压力。出现的可能原因
业务设计不合理例如缺少必要的参数校验环节导致非法的key也被进行查询开发/运维误操作不小心将部分数据从数据库上误删除黑客攻击
解决方案
改进业务/加强监控报警亡羊补牢如果发现这个key在redis和mysql中都不存在仍然写入redis,value设成一个非法值如“”引入布隆过滤器每次查询redis/mysql之前都先判定key是否在布隆过滤器上存在。 布隆过滤器结合了hashbitmap以比较小的空间比较快的时间速度实现对key是否存在的判定 缓存雪崩cache avalanche)
短时间内redis上大规模的key失效导致缓存命中率陡降并且mysql压力迅速上升甚至导致宕机。出现的可能原因
redis挂了redis宕机/redis集群模式下大量节点宕机redis正常但是之前短时间内设置了很多key给redis,并且设置的过期时间正好相同
解决方案
加强监控报警加强redis集群可用性的保证不给key设置过期时间/设置过期时间的时候添加随机因子避免同一时刻过期
缓存击穿(cache breakdown)
缓存雪崩的特殊情况针对热点key突然过期导致大量请求直接打到mysql上甚至引起数据库宕机。解决方案
基于统计方式发现热点key并设置永不过期进行必要的服务降级例如访问数据库的时候使用分布式锁限制同时请求的数据库的并发数 服务降级本身服务器有十个功能特定情况下适当关闭一些不重要的功能只保留核心功能省点模式