Redis的缓存穿透+解决方案

1.缓存穿透现象介绍

缓存穿透 :缓存穿透是指客户端请求的数据在缓存中和数据库中都不存在,这样缓存永远不会生效,这些请求都会打到数据库。

常见的解决方案有两种:

  • 缓存空对象
  • 优点:实现简单,维护方便
  • 缺点:
    • 额外的内存消耗
    • 可能造成短期的不一致
  • 布隆过滤
  • 优点:内存占用较少,没有多余key
  • 缺点:
    • 实现复杂
    • 存在误判可能

2.方法具体解决思路

缓存空对象思路分析:当我们客户端访问不存在的数据时,先请求redis,但是此时redis中没有数据,此时会访问到数据库,但是数据库中也没有数据,这个数据穿透了缓存,直击数据库,我们都知道数据库能够承载的并发不如redis这么高,如果大量的请求同时过来访问这种不存在的数据,这些请求就都会访问到数据库,简单的解决方案就是哪怕这个数据在数据库中也不存在,我们也把这个数据存入到redis中去,这样,下次用户过来访问这个不存在的数据,那么在redis中也能找到这个数据就不会进入到缓存了

Redis的缓存穿透+解决方案

布隆过滤:布隆过滤器其实采用的是哈希思想来解决这个问题,通过一个庞大的二进制数组,走哈希思想去判断当前这个要查询的这个数据是否存在,如果布隆过滤器判断存在,则放行,这个请求会去访问redis,哪怕此时redis中的数据过期了,但是数据库中一定存在这个数据,在数据库中查询出来这个数据后,再将其放入到redis中,

假设布隆过滤器判断这个数据不存在,则直接返回

这种方式优点在于节约内存空间,存在误判,误判原因在于:布隆过滤器走的是哈希思想,只要哈希思想,就可能存在哈希冲突

Redis的缓存穿透+解决方案

Original: https://www.cnblogs.com/sy2022/p/16617932.html
Author: 你会很厉害的
Title: Redis的缓存穿透+解决方案

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/593721/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Spring中ApplicationContextAware接口使用

    一、接口介绍 当一个类实现了这个接口(ApplicationContextAware)之后,这个类就可以方便获得ApplicationContext中的所有bean。换句话说,就是…

    Java 2023年6月5日
    094
  • 如何使用(扫描)二维码进行登录

    一、项目背景 这是我加入博&#x5BA2…

    Java 2023年6月14日
    080
  • 「开源组件」青龙定时面板使用场景举例

    组件 先介绍一下我们的主角,也就是我们依托的组件-青龙,它自身是可以支持python3、javaScript、shell、typescript 的定时任务管理面板(A timed …

    Java 2023年6月13日
    084
  • java_day03

    变量是什么:就是可以变化的量 Java是一种强类型语言,每个变量都必须声明其类型 Java变量是程序中最基本的存储单元,其要素包括变量名,变量类型和作用域 type varName…

    Java 2023年6月5日
    0113
  • private static final long serialVersionUID = 1L 的作用

    1、这句话的意思是定义程序序列化ID 2、什么是序列化? Serializable,Java的一个接口,用来完成java的序列化和反序列化操作的; 任何类型只要实现了Seriali…

    Java 2023年6月5日
    092
  • 【Java面试】这应该是面试官最想听到的回答,Mysql如何解决幻读问题?

    “Mysql如何解决幻读问题”一个工作了4年小伙伴,去一个美团面试,遇到了这样一个问题。大家好,我是Mic,一个工作了14年的Java程序员关于这个问题,面…

    Java 2023年6月16日
    085
  • Java如何对一个对象进行深拷贝?

    深拷贝实现代码:https://github.com/wudashan/java-deep-copy 深拷贝实现代码:https://github.com/wudashan/jav…

    Java 2023年5月29日
    090
  • linux常用命令

    linux开放指定端口命令 1、开启防火墙 systemctl start firewalld查看防火墙状态systemctl status firewalld2、开放指定端口fi…

    Java 2023年6月16日
    073
  • springboot的定时任务使用

    二、动态:基于接口 基于接口(SchedulingConfigurer) 1、导入依赖包: org.springframework.boot spring-boot-starter…

    Java 2023年5月29日
    0156
  • Class<String> 还是 Class< ? extends String>

    Class 还是 Class< ? extends String> 引出问题 先上代码 点击查看代码 Class<string> class01 = Str…

    Java 2023年6月7日
    071
  • 【力扣】1486. 数组异或操作

    给你两个整数,n 和 start 。 数组 nums 定义为:nums[i] = start + 2*i(下标从 0 开始)且 n == nums.length 。 请返回 num…

    Java 2023年6月8日
    072
  • Hystrix 断路器

    分布式系统面临的问题:复杂分布式体式结构中的应用程序有数十个依赖关系,每个依赖关系在某些时候将不可避免的失败。 多个微服务之间调用的时候,假设微服务A调用微服务B和微服务C,微服务…

    Java 2023年6月8日
    051
  • PostgreSQL远程访问设置

    数据库版本:9.3.23(Windows xp系统) 步骤: 1、需要修改数据库安装目录下的pg_hba.conf文件 修改成: 2、并使用psql执行pg_ctl reload重…

    Java 2023年6月5日
    078
  • JPA 入门实战(4)–Spring Data JPA 使用

    本文主要介绍 Spring Boot 中如何使用 Sping Data JPA,相关的环境及软件信息如下:Spring Boot 2.6.10。 1、Sping Data JPA …

    Java 2023年6月16日
    078
  • 数据库连接查询总结

    建表SQL create table account ( account_id bigint PRIMARY KEY AUTO_INCREMENT, name varchar(64…

    Java 2023年6月6日
    085
  • LiteFlow 2.6.4版本发行注记,里程碑版本!

    一 这个版本做的很折腾。期间几个issue推翻重做了好几次。 但我最终还是带来了LiteFlow 2.6.4这个重要版本。 虽然版本是小版本号升级,但是带来的更新可一点也不少。并完…

    Java 2023年6月8日
    082
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球