zoukankan      html  css  js  c++  java
  • 使用布隆过滤器防止缓存穿透

    1.什么是缓存穿透?

    缓存穿透指的是,攻击者在访问数据时,使用一些不存在的KEY访问我们的应用,

    后端应会先在redis中去查找,由于查找不到数据,就会去数据库中获取数据,这样攻击者就可以透过缓存访问数据库。

    因此数据库的压力会太大而导致应用崩溃。因此我们可以采用布隆过滤器防止这个问题。

    2. 布隆过滤器的原理

    布隆过滤器是先初始化一个大的二进制数组。

    我们预先将数据库的ID数据,查找出来,对这个数组进行初始化,我们可以将数据进行hash,对数组的进行标记。

    比如 010101000000,如果一个不存在的数据,提取的数据对应的bit 值为0 ,那么表示数据不存在,具体可以看网上的教程。

    当然也有可能出现误判的情况,比如提取到的位数全部唯一,这种情况几率会很小。

    比如攻击者将一个不存在的数据传过来,那么布隆过滤器判断这个ID不存在。直接返回就好。

    3.实现代码

    导入maven包。

     <dependency>
                <groupId>org.redisson</groupId>
                <artifactId>redisson-all</artifactId>
                <version>3.16.4</version>
            </dependency>

    编写代码:

    public static void main(String[] args) {
            Config config=new Config();
    
            config.useSingleServer().
                    setAddress("redis://localhost:6379")
                    .setPassword("redxun");
            RedissonClient client= Redisson.create(config);
            RBloomFilter<String> filter=client.getBloomFilter("bloom");
            filter.tryInit(1000000L,0.01);
            filter.add("1001");
            filter.add("1002");
            System.err.println(filter.contains("1001"));
            System.err.println(filter.contains("1004"));
        }

    1.filter.add 这些代码应该在初始化布隆过滤器实现。

    2.使用 filter.contains 是判断 指定的KEY是否存在。

  • 相关阅读:
    逻辑最复杂的MVVM模式实现
    剧本:博客园之天外飞仙
    本博客开始偏转方向,开始研究UDP在WCF下的实现
    Prism研究 目录
    Q & A category in Prism forums, with some answers and samples of mine.
    我眼中的SOA,以及在实际项目中的应用经验
    数据结构 C#描述 第三章 (更新)
    数据结构 C#描述 第四章
    数据结构 C#描述 第七章 (第一部分)
    数据结构 C#描述
  • 原文地址:https://www.cnblogs.com/yg_zhang/p/15646154.html
Copyright © 2011-2022 走看看