相关概念

  • 缓存击穿:指的是一些热点数据过期,由于热点数据存在并发量大的特性,所以短时间内对数据库的造成很大的冲击,导致系统瘫痪。常见于例如微博系统中明星结婚或出轨时微博瘫痪的情况。
  • 缓存雪崩:指的是大量数据或全部数据集中过期失效的情况,这种情况是由于大量数据设置了相同的过期时间而导致的。

使用缓存的流程

  • 缓存存在,命中缓存并返回
  • 缓存不存在,数据库存在,则查询数据库返回(缓存过期了 / 数据库新增数据未同步至缓存)(这种情况下,一定要给 Redis 加锁,否则会在短时间产生有大量的数据库访问,造成数据库瘫痪)
  • 缓存不存在,数据库也不存在,则返回空数据

缓存不存在,数据库也不存在,则返回空数据

  可能问题:如果持续查询不存在的数据,并发量大时同样会在短时间产生有大量的数据库访问,造成数据库瘫痪。

  解决方法 1:当数据库查询不到的时候,同样往缓存中插入一条记录,并设置过期时间。这样的方案对于正常的访问来讲是有效的。但是,如果某些用户研究了ID生成规律,恶意捏造大量不存在的 ID,同样会造成缓存击穿的问题。所以该方案存在一定安全性问题。

  • 如何在海量数据中(例如10亿无序、不定长、不重复)快速判断一个元素是否存在?
  • 使用布隆过滤器。如果布隆过滤器判断元素在集合中存在,不一定存在;如果布隆过滤器判断元素在集合中不存在,则一定不存在。可以把数据库里所有的 ID 存放于布隆过滤器中,先通过布隆过滤器判断元素是否存在,若在布隆过滤器判断元素不存在,则不需要进行缓存和数据库访问;若布隆过滤器判断元素存在,则再判断缓存是否存在,在缓存也不存在的情况下,再通过数据库查询结果并返回。布隆过滤器是加在缓存之前的一道屏障。

布隆过滤器 Java实现

Redis 缓存问题及解决方案的更多相关文章

  1. redis缓存穿透穿透解决方案-布隆过滤器

    redis缓存穿透穿透解决方案-布隆过滤器 我们先来看一段代码 cache_key = "id:1" cache_value = GetValueFromRedis(cache_k ...

  2. 高并发下redis缓存穿透问题解决方案

    一.使用场景 我们在日常的开发中,经常会遇到查询数据列表的问题,有些数据是不经常变化的,如果想做一下优化,在提高查询的速度的同时减轻数据库的压力,那么redis缓存绝对是一个好的解决方案. 二.需求 ...

  3. .NET基于Redis缓存实现单点登录SSO的解决方案[转]

    一.基本概念 最近公司的多个业务系统要统一整合使用同一个登录,这就是我们耳熟能详的单点登录,现在就NET基于Redis缓存实现单点登录做一个简单的分享. 单点登录(Single Sign On),简称 ...

  4. .NET基于Redis缓存实现单点登录SSO的解决方案

    一.基本概念 最近公司的多个业务系统要统一整合使用同一个登录,这就是我们耳熟能详的单点登录,现在就NET基于Redis缓存实现单点登录做一个简单的分享. 单点登录(Single Sign On),简称 ...

  5. Redis缓存穿透和缓存雪崩以及解决方案

    Redis缓存穿透和缓存雪崩以及解决方案 Redis缓存穿透和缓存雪崩以及解决方案缓存穿透解决方案布隆过滤缓存空对象比较缓存雪崩解决方案保证缓存层服务高可用性依赖隔离组件为后端限流并降级数据预热缓存并 ...

  6. redis缓存存在的隐患及其解决方案

    redis缓存1.缓存穿透 1>.什么是缓存穿透? 业务系统需要查训的数据根本不存在,当业务系统查询时, 首先会在缓存中查训,由于缓存中不存在,然后在往数据 库中查,由于该数据在数据库中也不存在 ...

  7. Redis缓存雪崩、缓存穿透、热点Key解决方案和分析

    缓存穿透 缓存系统,按照KEY去查询VALUE,当KEY对应的VALUE一定不存在的时候并对KEY并发请求量很大的时候,就会对后端造成很大的压力. (查询一个必然不存在的数据.比如文章表,查询一个不存 ...

  8. 【高并发简单解决方案】redis缓存队列+mysql 批量入库+php离线整合

    原文出处: 崔小拽 需求背景:有个调用统计日志存储和统计需求,要求存储到mysql中:存储数据高峰能达到日均千万,瓶颈在于直接入库并发太高,可能会把mysql干垮. 问题分析 思考:应用网站架构的衍化 ...

  9. Redis缓存雪崩,缓存穿透,热点key解决方案和分析

    缓存穿透 缓存系统,按照KEY去查询VALUE,当KEY对应的VALUE一定不存在的时候并对KEY并发请求量很大的时候,就会对后端造成很大的压力. (查询一个必然不存在的数据.比如文章表,查询一个不存 ...

随机推荐

  1. HDU 6194 string string string ——(2017沈阳网络赛,后缀数组)

    思路见:http://blog.csdn.net/aozil_yang/article/details/77929216. 代码如下: #include <stdio.h> #includ ...

  2. 用avalon框架怎么做轮播图?

    avalon这个框架其实特别的小众,做个轮播图呢?在github上的例子只有一个,而且功能特别的少,有的引入的插件与avalon里面的指令又不兼容,所以找了一个owl-carousel,目前实现了移动 ...

  3. 解决tecplot中壁面速度不为0的问题

    当直接将fluent的.cas文件和.dat文件导入tecplot中进行后处理的时候,我们会发现,壁面速度不为0的情况(见上图). 出现这样问题的原因为:fluent的计算数据是存储在每个单元的中心位 ...

  4. 【转】JVM类装载机制的解析,热更新的探讨(二)

    同样,一个Class对象必须知道自己的超类.超级接口.因此,Class对象会引用自己的超类和超级接口的Class对象.这种引用一定是实例引用.(实际上,超类.超级接口的引用也存储在常量池中,但为了区分 ...

  5. html5中progress/meter元素

    html5中progress/meter元素 一.总结 一句话总结: progress元素:用来建立一个进度条 meter元素的作用:用来建立一个度量条,用来表示度量衡的评定 <progress ...

  6. http://man7.org/linux/man-pages/man2/epoll_wait.2.html

    https://segmentfault.com/a/1190000007240744 https://baike.baidu.com/item/Glibc http://man7.org/linux ...

  7. iptables 4张表 5条链

  8. ionic4 路由跳转、ionic4 路由跳转传值 NavController 返回上一页 、NavController 回到根

    1.普通路由跳转 <ion-button [routerLink]="['/pinfo']"> 跳转到详情 </ion-button> <ion-he ...

  9. ISO/IEC 9899:2011 条款6.7——声明

    6.7 声明 语法 1.declaration: declaration-specifiers    init-declarator-listopt    ; static_assert-declar ...

  10. Oracle的存储过程基本写法

    转: Oracle的存储过程基本写法 目录 1.1,Oracle存储过程简介: 1.2,创建存储过程的语法: 2.0,游标的使用.看到的一段解释很好的概念,如下: 回到顶部 1.1,Oracle存储过 ...