首页 > 数据库 >Redis缓存系统常见问题及解决方案

Redis缓存系统常见问题及解决方案

时间:2023-10-15 15:57:22浏览次数:24  
标签:缓存 过期 数据库 Redis 查询 常见问题 MySQL

首先了解以下Redis缓存机制

Redis缓存基于内存,查询时先进入Redis缓存,如若查询不到,则进入MySQL数据库查询信息。数据库取到则更新缓存并返回结果,否则返回空。

 

img

 

 

缓存穿透问题

  • 什么是缓存穿透

    当用户在 Redis 缓存系统执行一条无效查询时,这条无效查询将穿透 Redis 缓存系统并MySQL 数据库请求数据,而 MySQL 数据库也获取不到数据

解决方案1>

缓存空对象

用户查询Redis缓存和MySQL数据库中都不存在的数据时,MySQL会返回一个空对象。并将这个空对象和用户请求关联起来存到 Redis 缓存中;当存在相同用户请求,这时 Redis 缓存就会命中,就直接从缓存中返回这个空对象,这样可以减少访问数据库的压力,提高当前数据库的访问性能。

  • 优点

    • 机制原理和实现比较简单

    • 代码修改维护容易

  • 缺点

    • 会带之Redis缓存中产生大量空对象

    • 会占用许多内存控件

    • 会浪费许多资源(可设置缓存空对象过期时间)

解决方案2>

过滤非法查询:在后台服务中过滤非法查询,使得其无法访问Redis缓存。

解决方案3>(推荐)

布隆过滤器

的底层是一种基于概率的数据结构,主要使用来判断当前某个元素是否在该集合中,运行速度快。但布隆过滤器不是绝对精确,只要参数设置的合理,它的精确度可以控制的一个期望精确值

  • 解决方案

    采用布隆过滤器,将所有可能存在的数据哈希到一个足够大的二进制 bitmap 中,一个一定不存在的数据会被这个 bitmap拦截掉,从而避免了对底层数据库的查询压力

布隆过滤器在空间效率和查询效率都非常高

缓存击穿

缓存击穿是指 Redis 缓存中有一些的热点数据 key 同时过期失效,或有一些非热点数据key 突然有大量并发访问请求,这样会导致大量并发请求直接穿透 Redis 缓存,涌入MySQL 数据库,瞬间增大数据库的访问压力,甚至导致数据库崩溃。

解决方案

  • 互斥锁

    (Redis的分布式锁)对线程访问数据库加以限制,持有锁的线程才有权限访问数据库。

    对于Key过期时Key查询数据库时加锁,此时允许第一个请求查询数据库,查询得到数据存入Redis缓存。

  • 永不过期

    维护简单但占用内存高。对非热点数据的高并发访问无效。

  • 合理设置过期时期时间

    设置不同的过期时间让缓存失效的时间点尽量均匀

缓存雪崩

何谓缓存雪崩

段时间内,Redis缓存宕机或者大量Key同时过期失效。恰好此时有大量请求涌入,且查询数据量巨大,大量请求进入MySQL数据库,导致数据库压力过大甚至宕机。

解决方案

  • Redis高可用

    搭建 Redis 主从架构或集群架构

  • 限流降级

    在缓存失效后,通过加锁或者队列来控制读数据库写缓存的线程数量,对某个 key只允许一个线程查询数据和写缓存,其他线程等待

  • 数据预热

    将部分可能大量访问的热点数据提前加载到 Redis 缓存中,或在即将发生高并发请求访问前手动触发加载缓存不同的 key

  • 不同时期时间

    设置不同的过期时间让缓存失效的时间点尽量均匀

标签:缓存,过期,数据库,Redis,查询,常见问题,MySQL
From: https://www.cnblogs.com/3-DG/p/17765696.html

相关文章

  • Docker 安装Redis
    一、下载redis镜像dockerpullredis二、创建数据卷映射路径、配置redis.confmkdir-p/usr/local/myredis/confvimredis.conf#redis.confappendonlyyes配置内容可以参考https://github.com/redis/redis/blob/unstable/redis.conf启用内存过渡分配#修改配......
  • Matlab simulink常见问题和数据导出到变量区
    ✅作者简介:热爱科研的算法开发者,Python、Matlab项目可交流、沟通、学习。......
  • java——redis随笔——实战——商户查询缓存
                      把key做了下代码优化: /***根据id查询商铺信息*@paramid商铺id*@return商铺详情数据*/@OverridepublicResultqueryById(Longid){//key要唯......
  • springboot启动时缓存数据
    一、Emos系统的常量数据在sys_config数据表中保存了Emos系统的常量配置信息,其中就包括了考勤部分的常量信息。例如每天上班考勤从几点开始,截止到几点。下班考勤从几点开始,几点结束。 因为这些常量信息跟考勤模块息息相关,所以我们要编写Java代码,在SpringBoot项目启动的......
  • Redis分布式锁实现一直到Redis相关操作总结
    FreeRedis实现源码///<summary>///开启分布式锁,若超时返回null///</summary>///<paramname="name">锁名称</param>///<paramname="timeoutSeconds">超时(秒)</param>///<paramname="autoDelay">自动延长锁超时时......
  • 畅捷通T+跑店管理常见问题
    问题1:业务员如何只能看到自己的跑店计划?点击拜访计划出现了所有业务员的拜访计划,这个怎么办?系统管理,用户权限,选择用户,用户权限,公共数据权限设置,答案:员工,明细授权,员工明细问题2:如何控制签到范围:系统管理,选项设置,控制签到范围问题3:如何更客户地址:跑店管理,基本配置,客户,把拜访地......
  • Spring Boot + Redis 延时双删功能,实战来了!
    一、业务场景在多线程并发情况下,假设有两个数据库修改请求,为保证数据库与redis的数据一致性,修改请求的实现中需要修改数据库后,级联修改Redis中的数据。请求一:A修改数据库数据B修改Redis数据请求二:C修改数据库数据D修改Redis数据并发情况下就会存在A—>C—>D—>B的情......
  • pod常见问题及解决方法整理
    pod常见问题及解决方法整理参考链接https://blog.51cto.com/u_15127577/4139629一、pod处于pending状态原因:如果Pod被卡在Pending状态,就意味着它不能调度在某个节点上。一般来说,这是因为某种类型的资源不足而导致无法调度。排查方法:1、查看pod详细信息,event中会显示具体无......
  • 2023-10-13 (error) ERR Client sent AUTH, but no password is set ==》redis访问密
    当你尝试在redis终端输入authxxx(auth是固定值,xxx是你的密码),然后终端报错:(error)ERRClientsentAUTH,butnopasswordisset意思:(错误)ERR客户端发送了AUTH,但未设置密码。原因:你没有设置redis访问密码。当然如果你非要设置访问密码,那么你可以在redis根目录找到redis.windo......
  • Mybatis之缓存
    缓存简介引入:查询数据:需要连接数据库--好资源解决:把第一次查询的结果放到一个地方,再次查询时直接在这个地方访问就可以(内存--缓存),不需要在访问数据库什么是缓存?存在内存中的临时数据将用户经常查询的数据放在缓存(内存)中,用户去查询数据就不用从磁盘上(关系型数据库查询文件)查询......