前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Redis 缓存穿透, 缓存击穿, 缓存雪崩的解决方案与布隆过滤器

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

作者头像
彼岸舞
发布2022-10-04 08:22:11
3120
发布2022-10-04 08:22:11
举报

缓存穿透解决方案

设置空值

布隆过滤器

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

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

使用布隆过滤器

添加依赖

代码语言:javascript
复制
<dependency>
    <groupId>com.google.guava</groupId>
    <artifactId>guava</artifactId>
    <version>31.1-jre</version>
</dependency>

编写代码

代码语言:javascript
复制
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(各种云)(花钱解决)
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-10-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 缓存穿透解决方案
    • 设置空值
      • 布隆过滤器
        • 使用布隆过滤器
    • 缓存击穿解决方案
    • 缓存雪崩解决方案
    相关产品与服务
    云数据库 Redis
    腾讯云数据库 Redis(TencentDB for Redis)是腾讯云打造的兼容 Redis 协议的缓存和存储服务。丰富的数据结构能帮助您完成不同类型的业务场景开发。支持主从热备,提供自动容灾切换、数据备份、故障迁移、实例监控、在线扩容、数据回档等全套的数据库服务。
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档