首页 > 数据库 >Redis 缓存穿透, 缓存击穿, 缓存雪崩的解决方案与布隆过滤器

Redis 缓存穿透, 缓存击穿, 缓存雪崩的解决方案与布隆过滤器

时间:2022-10-03 04:56:15浏览次数:49  
标签:缓存 hash 解决方案 误判 Redis 布隆 import bloomFilter

缓存穿透解决方案

设置空值

布隆过滤器

  • 优点
    • 可以将存在的缓存, 位置设置为1, 然后当不存在的参数过来的时候, 会匹配到0上,这样就会直接返回不存在
  • 缺点
    • 存在错误判断, hash冲突
    • 删除缓存时无法删除指定的1的位置, 应为存在多数据,同一hash, 所以无法删除
    • 增加开发成本, 维护成本提高

可以判断一定不存在, 但是不能判断一定存在[存在误判]

使用布隆过滤器

添加依赖

<dependency>
    <groupId>com.google.guava</groupId>
    <artifactId>guava</artifactId>
    <version>31.1-jre</version>
</dependency>

编写代码

package com.dance.redis;

import com.google.common.hash.BloomFilter;
import com.google.common.hash.Funnels;
import org.junit.jupiter.api.Test;

import java.nio.charset.Charset;
import java.util.stream.IntStream;

public class BlTest {

    @Test
    public void test(){
        // 创建
        /**
         * 数据类型
         * 容量
         * 误判率
         * 容量越大, 误判率越低, 但是使用的内存就越多
         * 误判率设置越小, 误判率越低
         */
        BloomFilter<String> bloomFilter = BloomFilter.create(
                                                            Funnels.stringFunnel(Charset.defaultCharset())
                                                            ,100000
                                                            ,0.001
        );
        // 放入元素
//        boolean html = bloomFilter.put("html");
        // 判断可能存在
//        boolean html1 = bloomFilter.mightContain("html");
        // 存放10万数据
        IntStream.range(0,200000).forEach(x -> bloomFilter.put(x+""));

        int success = 0;
        int fail = 0;

        for (int i = 0; i < 10000; i++) {
            boolean b = bloomFilter.mightContain("test" + i);
            if (b){
                fail++;
            }else{
                success++;
            }
        }
        System.out.println("正确:"+success);
        System.out.println("错误:"+fail);

    }

}

使用的时候可以根据实际情况, 设置这些阈值

缓存击穿解决方案

  • 只让一个请求去查数据库, 其他请求进入CAS自旋, 等待请求返回放入缓存, 然后其他线程去查询缓存

缓存雪崩解决方案

在同一时间点, 缓存大面积失效

解决方案

  • 设置热点数据永不过期
  • 过期时间分散
  • 采用多级缓存
  • 采购第三方的Redis(各种云)(花钱解决)

标签:缓存,hash,解决方案,误判,Redis,布隆,import,bloomFilter
From: https://www.cnblogs.com/flower-dance/p/16749917.html

相关文章

  • Redis的架构演进过程
    Redis架构演进一主二从这也是常用的架构,,MASTER用于写服务,SLAVE提供读服务但是存在弊端,就是主MASTER宕机后,SLAVE无法升级,导致无法提供写服务哨兵监控为了......
  • SpringBoot整合Redis[哨兵版]
    SpringBoot整合Redis[哨兵版]修改配置文件server:port:8080spring:application:name:redisredis:#host:192.168.247.141#port:6379......
  • Redis5.0.5 安装与配置
    哎,本来想的是10.1回家呢,结果突然本地多了一例的疫情,所以只能把票都退了,已经将近一年都没有回家,思念如泉~,只能静下心来继续学习, 路漫漫其修远兮吾将上下而求......
  • Redis的线程模型
      我觉得这个图就非常清晰,如果是懂BIO/Netty的人看起来应该很容易,是的没错Redis的线程模型就是基于多路复用器做的,采用非阻塞的IO模型,当前是6.x之前的版本,6.......
  • SpringBoot整合Redis[单机版]
    SpringBoot整合Redis[单机版]添加依赖<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId>......
  • 一文读懂Apache Geode缓存中间件
    目录一、对缓存中间件的诉求1.1我们为什么需要缓存中间件1.2缓存的分类1.1.1弱势缓存1.1.2强势缓存二、什么是ApacheGeode2.1ApacheGeode的架构......
  • redis-shake
    https://github.com/alibaba/RedisShake/wiki/%E8%BF%90%E8%A1%8C%E7%9B%91%E6%8E%A7redis-shakeisatoolforRedisdatamigrationanddatafiltering.Feature......
  • Redis基本操作
    Redis数据类型:redis自身是一个map,其中所有数据都是采用key:vlue的形式存储数据类型指的是存储的数据的类型,也就是value部分的类型,key部分永远都是字符串redis所有的操作都......
  • redis远程连接错误SocketTimeoutException: connect timed out
    redis远程连接错误SocketTimeoutException:connecttimedout解决方案:编辑redis.conf文件(建议将其先备份编辑备份文件启动redis服务时直接引入修改好的备份文件)将......
  • redis基本操作
    什么是redisredis是一个高性能的key-value存储的NoSQL数据存储系统。为什么是nosql——大数据下需要更好的性能补充:1、一共有15个数据库,select1;默认是0号库2、单线程......