zoukankan      html  css  js  c++  java
  • Redis 三大缓存

    Redis 三大缓存

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

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

    一、缓存穿透

    1.概念简述

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

    2.案例

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

    3.解决方案

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

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

    Redis 布隆过滤器代码:

     1 package com.ausclouds.bdbsec.tjt;
     2 
     3 import com.google.common.hash.BloomFilter;
     4 import com.google.common.hash.Funnels;
     5 
     6 import java.nio.charset.Charset;
     7 
     8 /**
     9  * Redis 布隆过滤器
    10  * 引入依赖:
    11  * <dependency>
    12  *     <groupId>com.google.guava</groupId>
    13  *     <artifactId>guava</artifactId>
    14  *     <version>22.0</version>
    15  * </dependency>
    16  */
    17 public class BloomFilterDemon {
    18 
    19     // initial_size: 表示预计放入的元素数量,当实际数量超出这个数值时,误判率会上升
    20     private static long initial_size = 1000000;
    21 
    22     // error_rate: 错误率
    23     private static double error_rate = 0.0001;
    24 
    25     public static void main(String[] args) {
    26         BloomFilter<String> bloomFilter =
    27                 BloomFilter.create(Funnels.stringFunnel(Charset.defaultCharset()), initial_size, error_rate);
    28         bloomFilter.put("what");
    29         boolean isContain = bloomFilter.mightContain("what");
    30 
    31     }
    32 
    33 
    34 }
    View Code~拍一拍小轮胎

     缓存空对象流程图

    二、缓存击穿

    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。

     

     

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

    但一定要放下

     

     

     

  • 相关阅读:
    主成分分析
    8、特征选择
    7.逻辑回归实践
    6--逻辑回归
    《四分之四团队》:团队项目选题报告
    计算与软件工程 作业五
    计算与软件工程 作业四
    计算与软件工程 作业三
    计算与软件工程 作业二
    计算与软件工程作业一
  • 原文地址:https://www.cnblogs.com/taojietaoge/p/13672295.html
Copyright © 2011-2022 走看看