首页 > 数据库 >项目中Redis常见的一些问题(缓存穿透,缓存雪崩,内存耗尽等)

项目中Redis常见的一些问题(缓存穿透,缓存雪崩,内存耗尽等)

时间:2024-08-27 19:27:29浏览次数:10  
标签:缓存 数据库 Redis 查询 内存 key

缓存穿透

缓存穿透是指查询一个不存在的数据,导致每次请求查询这个不存在的数据 都会转发到数据库,可能导致数据库崩溃

通常都会用布隆过滤器来解决它

布隆过滤器

布隆过滤器主要是用于检索一个元素是否在一个集合中。
它的底层主要是先去初始化一个比较大数组,里面存放的二进制0或1。在一开始都是0,当一个key来了之后经过3次hash计算,找到对应的数据的下标然后把数组中原来的0改为1,这样的话,三个数组的位置就能标明一个key的存在
它的缺点是可能会产生一定的误判,我们一般可以设置这个误判率为5%,如果想要更低的误判率就得增加数组的长度

缓存雪崩

缓存雪崩是指在我们设置缓存时采用了相同的过期时间导致缓存在某一时刻同时失效,请求全部转发到数据库,数据库瞬时压力过重崩溃

解决方法:

  1. 在原有的失效时间基础上增加一个随机值,使得过期时间分散一些。这样每一个缓存的过期时间的重复率就会降低
  2. 设置二级缓存。二级缓存指的是除了 Redis 本身的缓存,再设置一层缓存,当 Redis 失效之后,先去查询二级缓存。例如可以设置一个本地缓存,在 Redis 缓存失效的时候先去查询本地缓存而非查询数据库

缓存击穿

缓存击穿:大量的请求同时查询一个 key 时,此时这个 key 正好失效了,就会导致大量的请求都落到数据库。缓存击穿是查询缓存中失效的 key,而缓存穿透是查询不存在的key。

解决方法:

加互斥锁。在并发的多个请求中,只有第一个请求线程能拿到锁并执行数据库查询操作

缓存预热

系统上线时,缓存内还没有数据,如果直接提供给用户使用,每个请求都会穿过缓存去访问底层数据库,如果并发大的话,数据库可能直接崩溃,因此我们需要在上线前先将数据库内的热点数据缓存至Redis内再提供出去使用,这种操作就成为"缓存预热"
解决方案:
1.如果数据量不大,可以在项目启动的时候自动进行加载;
2.定时刷新缓存;

缓存降级

访问量剧增,服务出现问题时,仍然需要保证服务还是可用的,即使是有损部分其他服务,仍然需要保证主服务可用。可以将其他次要服务的数据进行缓存降级,从而提升主服务的稳定性

Redis的内存耗尽

如果达到设置的上限,Redis的写命令会返回错误信息(但是读命令还可以正常返回)。

配置内存淘汰策略来解决这个问题

内存淘汰策略有哪些?

LRU是最近最少使用页面置换算法(Least Recently Used),也就是首先淘汰最长时间未被使用的页面
LFU是最近最不常用页面置换算法(Least Frequently Used),也就是淘汰一定时期内被访问次数最少的页面

Redis如何做内存优化?

充分利用Redis的丰富的数据类型,因为通常情况下很多小的Key-Value可以用更紧凑的方式存放到一起
尽可能使用散列表(hashes),散列表使用的内存非常小,所以你应该尽可能的将你的数据模型抽象到一个散列表里面

标签:缓存,数据库,Redis,查询,内存,key
From: https://blog.csdn.net/kiku1002149488/article/details/141610511

相关文章

  • linux系统内存不足时, 系统杀死程序 哪儿查看日记
    下面是由ai回答的:当Linux系统内存不足时,系统可能会通过OOMkiller(Out-Of-Memorykiller)机制自动杀死一些进程以释放内存。要查看因内存不足而被系统杀死的程序,可以通过查看系统日志来获取相关信息。根据搜索结果,以下是一些常用的方法来查看系统日志中的相关记录:使用dmesg......
  • 软设每日一练1——(16进制快速算结果)若用256K×8bit存储器芯片,构成地址40000000H到400F
    题目:若用256K× 8bit的存储器芯片,构成地址40000000H到400FFFFFH且按字节编址的内存区域,则需(        )片芯片A.4        B.8        C.16        D.32        答案:A解:1、首先看单位,存储器芯片单位是256K× 8bit,地址是字节......
  • redis-redis为什么这么快
    Redis为什么这么快?作者:w08e博客:https://www.cnblogs.com/w08e......
  • redis-删除策略
    Redis过期删除策略作者:w08e博客:https://www.cnblogs.com/w08e......
  • redis-过期策略
    redis内存淘汰策略作者:w08e在线博客:https://www.cnblogs.com/w08e......
  • FreeRTOS不同内存管理策略的区别
    来源于正点原子《STM32F1FreeRTOS开发手册V1.1》第二十章内存管理20.7heap_5内存分配方法(P391):heap_1最简单,但是只能申请内存,不能释放。heap_2提供了内存释放函数,用户代码也可以直接调用函数pvPortMalloc()和vPortFree()来申请和释放内存,但是heap_2会导致内存碎片的......
  • vue ant-design上传文件,暂存后在其他页面提交数据(file格式转base64后保存数据,其他页面
    longlongtimenoupdate,huuuuu~最近做一个看起来简单但是功能有点繁琐的东西就是再A页面上传文件,然后B页面确定上传后调用接口,我不知道我这个逻辑对不对哈,有毛病求指教首先用的ant-design框架上传文件<a-uploadlist-type="text":multiple="false":file-list="fileList"......
  • Redis哨兵部署
    机器列表:主节点192.168.232.8:7000/27000从节点192.168.232.9:8000/28000,9000/29000 redis的程序编译安装见单实例安装文档 主节点操作步骤:groupaddredis&&useradd-r-gredisredismkdir-p/data/redis-sentinel/7000配置文件redis.conf、sentinel.confcat......
  • redis单机部署
     mkdir/data/redis/-ptarxvfredis-6.2.6.tar.gz-C/data/redis/ cd/data/redis/cdredis-6.2.6/yum-yinstallmake yum-yinstallgccyum-y installlibjemalloc-dev cddeps/ cdjemalloc/ ./configurecd/data/redis/redis-6.2.6&&makeMALL......
  • C++常见内存错误及其对策
    常见内存错误及其对策目录常见内存错误及其对策内存分配未成功,却使用了它内存分配成功但未初始化内存操作越界内存泄漏释放内存后继续使用规则总结图表示C++学习资料在软件开发过程中,内存管理是至关重要的一环。内存错误不仅会导致程序崩溃,还可能引发安全问题。本文......