Redis 三大缓存

     过去的有些事情不一定要忘记,但一定要放下。

背景:Redis 三大缓存:缓存穿透、缓存击穿、缓存雪崩,是Redis 面试必须要掌握的东西。

一、缓存穿透

1.概念简述

缓存穿透是指当用户在查询一条数据时,而此时数据库和缓存却没有关于这条数据的任何记录;而该数据若在缓存中没找到则会向数据库请求获取数据,Redis 拿不到数据时,就会一直查询数据库,这样会对数据库的访问造成很大的压力。

2.案例

用户查询一个 id = -1 的商品信息,但是数据库 id 自增是从 1 开始的,很明显这条信息是不在数据库中,当没有信息返回时,Redis 会一直向数据库查询,给当前数据库访问造成很大的压力。

3.解决方案

A、从缓存出发,给缓存设置一个 如果当前数据库不存在 的信息,把它缓存为一个空对象,返回给用户;

B、缓存空对象的解决方案代码简单,但效果不是很好;可以考虑使用Redis 提供的布隆过滤器。

Redis 布隆过滤器代码:

 package com.ausclouds.bdbsec.tjt;

 import com.google.common.hash.BloomFilter;
import com.google.common.hash.Funnels; import java.nio.charset.Charset; /**
* Redis 布隆过滤器
* 引入依赖:
* <dependency>
* <groupId>com.google.guava</groupId>
* <artifactId>guava</artifactId>
* <version>22.0</version>
* </dependency>
*/
public class BloomFilterDemon { // initial_size: 表示预计放入的元素数量,当实际数量超出这个数值时,误判率会上升
private static long initial_size = 1000000; // error_rate: 错误率
private static double error_rate = 0.0001; public static void main(String[] args) {
BloomFilter<String> bloomFilter =
BloomFilter.create(Funnels.stringFunnel(Charset.defaultCharset()), initial_size, error_rate);
bloomFilter.put("what");
boolean isContain = bloomFilter.mightContain("what"); } }

~拍一拍小轮胎

缓存空对象流程图

二、缓存击穿

1.概念简述

缓存击穿是指有某个key 经常被查询,或者某个key 不经常被访问,而这个时候,若该key 在缓存的过期时间失效或者是个冷门key 的时候,突然有大量关于这个key 的访问请求,这样就会导致大并发请求直接穿透缓存,请求数据库,瞬间增大了数据库的访问压力。

2.案例

(1)一个“冷门”key,突然被大量用户请求访问;

(2)一个“热门”key,在缓存中时间恰好过期,这时有大量用户来进行访问。

缓存击穿案例图

3.解决方案

对于缓存击穿问题,常用的解决方案是加锁;对于key 过期问题,当key 要查询数据库的时候加上锁,保证只能让第一个请求进行查询数据库操作,然后把从数据库中查询到的值存储到缓存中,对于剩下的相同的key,则可直接从缓存中获取。

缓存击穿解决方案图

三、缓存雪崩

1.概念简述

缓存雪崩是指在某一个时间段内,缓存集中过期失效,若这个时间段内有大量请求,并且查询数据量巨大,所有的请求都会查询数据库,使数据库的调用瞬间量剧增,引起数据库压力过大甚至宕机。(Redis 突然宕机或大部分数据失效)

2.案例

某宝双十一购物节,在 23:00-24:00 举行商品促销活动。开发人员是这么设计的:在 23:00 把商家促销的商品放到缓存中,并通过redis 的expire 设置了过期时间为1小时;这个时间段许多用户在访问这些商品信息,但是刚好到了24:00点的时候,恰好还有许多用户在访问这些商品,此时对这些商品的访问都会转到数据库上,导致数据库压力突然剧增,甚至直接宕机。

3.解决方案

A、限流降级

在缓存失效后,通过加锁或者队列来控制读数据库写缓存和写缓存的线程数量,对某个key 同一时刻只允许一个线程执行查询设计和写缓存操作。

B、Redis 高可用

可能会出现Redis 挂掉的情况,多增加几台Redis 实例(一主多从),即使一台挂掉之后其他的还可以继续工作。

C、不同过期时间

设置不同的过期时间,让缓存失效的时间尽量均匀,避免同一时间大量缓存失效。

D、数据预加热

数据加热的含义就是在正式部署之前,先把可能用到的数据预先访问一遍,这样部分可能大量访问的数据就会加载到缓存中;一般可以在即将发生大并发访问前手动触发加载缓存不同的key。

过去的有些事情不一定要忘记

但一定要放下

Redis 三大缓存的更多相关文章

  1. ehcache memcache redis 三大缓存

    最近项目组有用到这三个缓存,去各自的官方看了下,觉得还真的各有千秋!今天特意归纳下各个缓存的优缺点,仅供参考!  Ehcache 在Java项目广泛的使用.它是一个开源的.设计于提高在数据从RDBMS ...

  2. ehcache memcache redis 三大缓存男高音

    最近项目组有用到这三个缓存,去各自的官方看了下,觉得还真的各有千秋!今天特意归纳下各个缓存的优缺点,仅供参考!  Ehcache 在java项目广泛的使用.它是一个开源的.设计于提高在数据从RDBMS ...

  3. FW:: ehcache memcache redis 三大缓存男高音

    最近项目组有用到这三个缓存,去各自的官方看了下,觉得还真的各有千秋!今天特意归纳下各个缓存的优缺点,仅供参考!  Ehcache 在java项目广泛的使用.它是一个开源的.设计于提高在数据从RDBMS ...

  4. NoSQL分类及ehcache memcache redis 三大缓存的对比

    NoSQL分类 由于NoSQL中没有像传统数据库那样定义数据的组织方式为关系型的,所以只要内部的数据组织采用了非关系型的方式,就可以称之为NoSQL数据库.目前,可以将众多的NoSQL数据库按照内部的 ...

  5. ehcache memcache redis 三大缓存对比

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt268 最近项目组有用到这三个缓存,去各自的官方看了下,觉得还真的各有千秋!今 ...

  6. ehcache memcache redis 三大缓存男高音[转]

    原文链接:http://blog.csdn.net/jationxiaozi/article/details/8509732 最近项目组有用到这三个缓存,去各自的官方看了下,觉得还真的各有千秋!今天特 ...

  7. ehcache、memcache、redis三大缓存比较

    最近项目组有用到这三个缓存,去各自的官方看了下,觉得还真的各有千秋!今天特意归纳下各个缓存的优缺点,仅供参考!  Ehcache 在Java项目广泛的使用.它是一个开源的.设计于提高在数据从RDBMS ...

  8. ehcache、memcache、redis三大缓存比较(转)

    最近项目组有用到这三个缓存,去各自的官方看了下,觉得还真的各有千秋!今天特意归纳下各个缓存的优缺点,仅供参考!  Ehcache 在Java项目广泛的使用.它是一个开源的.设计于提高在数据从RDBMS ...

  9. ehcache memcache redis -- java中的三大缓存

      三个缓存在java代码中用的是较多的,但是它们都有自己的应用场合,和优缺点.  Ehcache 1.初衷:减少数据库操作的高延时而设计.(缓存的目的,好像都是这个吧) 2.Apache Licen ...

  10. redis来共享各个服务器的session,并同时通过redis来缓存一些常用的资源,加快用户获得请求资源的速度(转)

    时间过得真快,再次登录博客园来写博,才发现距离上次的写博时间已经过去了一个月了,虽然是因为自己找了实习,但这也说明自己对时间的掌控能力还是没那么的强,哈哈,看来还需不断的努力啊!(这里得特别说明一下本 ...

随机推荐

  1. Wall---hdu1348(求凸包周长 模板)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1348 求凸包周长+2*PI*L: #include <stdio.h> #include ...

  2. C#:插件、框架

    1.开源实体映射框架EmitMapper(http://www.cnblogs.com/wuhong/archive/2011/09/21/2184313.html) 2.ffmpeg.exe是一个源 ...

  3. sea.js总结

    SeaJS是一个遵循CommonJS规范的JavaScript模块加载框架. 参考以下网址进行详细学习: https://segmentfault.com/a/1190000000357191?pag ...

  4. SQL VS NoSQL

    (关系型与非关系型)数据库的区别: 关系型和非关系型数据库的主要差异是数据存储的方式 1.1 数据表 VS 数据集 关系型数据天然就是表格式的,因此存储在数据表的行和列中.数据表可以彼此关联协作存储, ...

  5. Android Studio2.0 教程从入门到精通Windows版 - 提高篇

    第二篇我们开发了一个Hello World应用,并介绍Android Sutdio的界面和如何调试应用,接下来将介绍一些常用的快捷键和必备插件. 常用快捷键 代码跳转 描述:跳转是为了方便代码位置的定 ...

  6. WEB框架Django之中间件/缓存/CBV/信号

    一Djano的中间件 1 中间件的概念 中间件顾名思义,是介于request与respose处理之间的一道处理过程,相对比较轻量级,并且全局上改变django的输入与输出.因为改变是全局, 所有需要谨 ...

  7. BZOJ2428 HAOI2006均分数据(模拟退火)

    显然可以状压dp.显然过不了. 考虑暴力模拟退火.每次随机改变一个数所属集合即可. 并不明白要怎么调参. #include<iostream> #include<cstdio> ...

  8. jquery bxslider幻灯片样式改造

    找了很多jquery的幻灯片,都觉得不是很好,最后发现bxslider兼容性最好,移动设备支持手动翻动. 但是官方提供的显示效果真的很难看,让人难以接受.最后只能自己DIY了. bxslider官方样 ...

  9. Unit Vector Compression

    Recently, I compared a few methods for compressing generic unit vectors. The method used in Cry Engi ...

  10. TCP/IP学习笔记(3)-IP、ARP、RARP协议

    这三个协议放到一起学习是因为这三个协议处于同一层,ARP协议用来找到目标主机的Ethernet网卡Mac地址,IP则承载要发送的消息.数据链路层可以从ARP得到数据的传送信息,而从IP得到要传输的数据 ...