首页 > 数据库 >redis,缓存雪崩,缓存穿透,缓存更新,缓存降级,缓存预热等问题

redis,缓存雪崩,缓存穿透,缓存更新,缓存降级,缓存预热等问题

时间:2023-05-23 09:46:01浏览次数:42  
标签:降级 缓存 Hash 数据库 redis 查询 预热 数据

一、缓存雪崩 我们可以简单的理解为:由于原有缓存失效,新缓存未到期间 (例如:我们设置缓存时采用了相同的过期时间,在同一时刻出现大面积的缓存过期),所有原本应该访 问缓存的请求都去查询数据库了,而对数据库CPU和内存造成巨大压力,严重的会造成数据库宕机。从 而形成一系列连锁反应,造成整个系统崩溃。 解决办法: 大多数系统设计者考虑用加锁( 最多的解决方案)或者队列的方式保证来保证不会有大量的线程对数据 库一次性进行读写,从而避免失效时大量的并发请求落到底层存储系统上。还有一个简单方案就时讲缓 存失效时间分散开。 二、缓存穿透 缓存穿透是指用户查询数据,在数据库没有,自然在缓存中也不会有。这样就导致用户查询的时候,在 缓存中找不到,每次都要去数据库再查询一遍,然后返回空(相当于进行了两次无用的查询)。这样请 求就绕过缓存直接查数据库,这也是经常提的缓存命中率问题。 解决办法; 最常见的则是采用布隆过滤器,将所有可能存在的数据哈希到一个足够大的bitmap中,一个一定不存 在的数据会被这个bitmap拦截掉,从而避免了对底层存储系统的查询压力。 另外也有一个更为简单粗暴的方法,如果一个查询返回的数据为空(不管是数据不存在,还是系统故 障),我们仍然把这个空结果进行缓存,但它的过期时间会很短,最长不超过五分钟。通过这个直接设 置的默认值存放到缓存,这样第二次到缓冲中获取就有值了,而不会继续访问数据库,这种办法最简单 粗暴。 5TB的硬盘上放满了数据,请写一个算法将这些数据进行排重。如果这些数据是一些32bit大小的数据该 如何解决?如果是64bit的呢? 对于空间的利用到达了一种极致,那就是Bitmap和布隆过滤器(Bloom Filter)。 Bitmap: 典型的就是哈希表 缺点是,Bitmap对于每个元素只能记录1bit信息,如果还想完成额外的功能,恐怕只能靠牺牲更多的空 间、时间来完成了。 布隆过滤器(推荐) 就是引入了k(k>1)k(k>1)个相互独立的哈希函数,保证在给定的空间、误判率下,完成元素判重的过 程。 它的优点是空间效率和查询时间都远远超过一般的算法,缺点是有一定的误识别率和删除困难。 Bloom-Filter算法的核心思想就是利用多个不同的Hash函数来解决“冲突”。 Hash存在一个冲突(碰撞)的问题,用同一个Hash得到的两个URL的值有可能相同。为了减少冲突, 我们可以多引入几个Hash,如果通过其中的一个Hash值我们得出某元素不在集合中,那么该元素肯定 不在集合中。只有在所有的Hash函数告诉我们该元素在集合中时,才能确定该元素存在于集合中。这 便是Bloom-Filter的基本思想。 Bloom-Filter一般用于在大数据量的集合中判定某元素是否存在。 三、缓存预热 缓存预热这个应该是一个比较常见的概念,相信很多小伙伴都应该可以很容易的理解,缓存预热就是系 统上线后,将相关的缓存数据直接加载到缓存系统。这样就可以避免在用户请求的时候,先查询数据 库,然后再将数据缓存的问题!用户直接查询事先被预热的缓存数据! 解决思路: 1、直接写个缓存刷新页面,上线时手工操作下; 2、数据量不大,可以在项目启动的时候自动进行加载; 3、定时刷新缓存; 四、缓存更新 除了缓存服务器自带的缓存失效策略之外(Redis默认的有6中策略可供选择),我们还可以根据具体的 业务需求进行自定义的缓存淘汰,常见的策略有两种: ( 1)定时去清理过期的缓存; ( 2)当有用户请求过来时,再判断这个请求所用到的缓存是否过期,过期的话就去底层系统得到新数 据并更新缓存。 两者各有优劣,第一种的缺点是维护大量缓存的key是比较麻烦的,第二种的缺点就是每次用户请求过 来都要判断缓存失效,逻辑相对比较复杂!具体用哪种方案,大家可以根据自己的应用场景来权衡。 五、缓存降级 当访问量剧增、服务出现问题(如响应时间慢或不响应)或非核心服务影响到核心流程的性能时,仍然 需要保证服务还是可用的,即使是有损服务。系统可以根据一些关键数据进行自动降级,也可以配置开 关实现人工降级。 降级的最终目的是保证核心服务可用,即使是有损的。而且有些服务是无法降级的(如加入购物车、结 算)。 以参考日志级别设置预案: ( 1)一般:比如有些服务偶尔因为网络抖动或者服务正在上线而超时,可以自动降级; ( 2)警告:有些服务在一段时间内成功率有波动(如在95~100%之间),可以自动降级或人工降级, 并发送告警;( 3)错误:比如可用率低于90%,或者数据库连接池被打爆了,或者访问量突然猛增到系统能承受的 最大阀值,此时可以根据情况自动降级或者人工降级; ( 4)严重错误:比如因为特殊原因数据错误了,此时需要紧急人工降级。 服务降级的目的,是为了防止Redis服务故障,导致数据库跟着一起发生雪崩问题。因此,对于不重要 的缓存数据,可以采取服务降级策略,例如一个比较常见的做法就是,Redis出现问题,不去数据库查 询,而是直接返回默认值给用户。

标签:降级,缓存,Hash,数据库,redis,查询,预热,数据
From: https://www.cnblogs.com/huoziqi/p/17422366.html

相关文章

  • 【面试系列6】Redis
    redisredis是什么?内存数据库,一切数据操作都在内存中进行,所以速度很快,常被用来做缓存,消息队列,分布式锁。具有高效的数据结构,String、list、hash、set、zset,bitmaps、hyperloglog、geo、stream。redis还支持事务、持久化、多种集群方式、发布订阅模型、内存淘汰机制等等。re......
  • 39 | MESI协议:如何让多核CPU的高速缓存保持一致?
    你平时用的电脑,应该都是多核的CPU。多核CPU有很多好处,其中最重要的一个就是,它使得我们在不能提升CPU的主频之后,找到了另一种提升CPU吞吐率的办法。不知道上一讲的内容你还记得多少?上一节,我们讲到,多核CPU里的每一个CPU核,都有独立的属于自己的L1Cache和L2Ca......
  • 37 | 高速缓存(上):“4毫秒”究竟值多少钱?
    在这一节内容开始之前,我们先来看一个3行的小程序。你可以猜一猜,这个程序里的循环1和循环2,运行所花费的时间会差多少?你可以先思考几分钟,然后再看我下面的解释。int[]arr=newint[64......
  • Linux Redis 做成系统服务
    概述系统:CentOS7.6Redis安装后启动方式:redis-server/xxx/xxx/redis.conf。若不指定配置文件,则redis-server不会读取任何配置文件,而是使用自身携带固定配置信息启动。若想将redis做成系统服务,则需在/etc/init.d目录下添加一个配置文件,文件中指定要启动的程序,如何可以使用系统服......
  • nginx+tomcat+pgsql+redis离线部署过程
    gccpcre-developenssl-develzlib-devel离线安装包:包含云盘地址.txt离线部署java+nginx+tomcat+pgsql+redis.zip:城通网盘:https://url86.ctfile.com/f/15666686-859830438-baa3a9?p=2048(访问密码:2048)阿里云网盘(城通速度慢可以选这个):https://www.aliyundrive......
  • Redis单机部署
    Redis单机部署1安装下载最新稳定版Redishttps://download.redis.io/redis-stable.tar.gz#安装wgetyuminstall-ywget#安装gcc环境yuminstallgcc-c++#获取安装包wgethttps://download.redis.io/redis-stable.tar.gztar-xvfredis-stable.tar.gzcdredis-stabl......
  • Java缓存行对齐
    来源:  https://blog.csdn.net/mofeizhi/article/details/106816026  ......
  • Redis 跳表
    参考小林:https://xiaolincoding.com/redis/data_struct/data_struct.html#%E8%B7%B3%E8%A1%A8cmu: https://www.cs.cmu.edu/~ckingsf/bioinfo-lectures/skiplists.pdfwiki:https://en.wikipedia.org/wiki/Skip_list  跳表这种数据结构是由WilliamPugh(音译为威廉·普)发......
  • 用redis实现支持优先级的消息队列
    用redis实现支持优先级的消息队列 为什么需要消息队列系统中引入消息队列机制是对系统一个非常大的改善。例如一个web系统中,用户做了某项操作后需要发送邮件通知到用户邮箱中。你可以使用同步方式让用户等待邮件发送完成后反馈给用户,但是这样可能会因为网络的不确定性造成用......
  • 关于Redis的应用
    写这篇文章主要是在开发www.ximalaya.com的feed(登录首页看到的好友动态,未登录是看不到的)模块使用Redis的一些经验。(www.ximalaya.com是音频为传播介质的SNS网站,喜欢的同学不妨用一用,也有APP的,还是一款非常不错的产品。音乐,相声,有声小说等等一网打尽)。关于Feed本身的讨论以后再专......