ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

位图和布隆过滤器

2021-09-25 15:34:52  阅读:156  来源: 互联网

标签:存在 0000 布隆 过滤器 位图 数据 id


1、位图

位图是空间利用率极高的数据结构,能够使用很少的存储空间来存储更多的数据。

位图只标记数据的状态,用0和1来表示,1表示存在,0表示不存在

在java中,一个int有4个字节的长度,占据32个bit,只能存储一个数字,而在位图中可以标记32条数据。

例如

5在位图的存储形式:从右向左数5位,存储的是二进制数据,101

0000 0000 0000 0000 0000 0000 0010 1000

 

 

 9的存储形式:1001

0000 0000 0000 0000 0000 0001 0010 0000

 

 

 

 当我们去判断这个值是否存在的时候,判断这个位置的标记为0还是为1即可。为1表示当前数据可能存在,而为0则表示当前数据不存在。

 

2、布隆过滤器

布隆过滤器是基于位图实现,布隆过滤器增加了对数据的哈希算法的实现,可以多次hash来减少误判。

 

 

 例如x值经过三次hash,分别落在不同的标记位上,当我们需要判断当前值是否存在,就需要判断三次hash后的标记为是否都为1

有一个为0则表示不存在。

 

3、应用场景

场景:一般请求数据时,会先去访问redis,如果不存在,就再去查询数据库。

在redis的缓存击穿的问题中,大量的请求去访问一个redis中不存在的key,会导致大量的数据请求都去访问数据库

导致数据库崩溃。这时候我们就可以使用布隆过滤器在访问redis前调用。

 

实例:这里使用guava的布隆过滤器,hutool,redision都提供了布隆过滤器。

初始化布隆过滤器数据:

/**
 * @description: 布隆过滤器初始化数据
 **/
@Component
@Slf4j
public class BloomApplicationRunner implements ApplicationRunner {
    @Override
    public void run(ApplicationArguments args) throws Exception {
        //创建bloom过滤器,expectedInsertions表示创建多少个,fpp表示误判率,误判率越低,采用hash算法越多,占用内存也会变大。
        BloomFilter<String> bloomFilter = BloomFilter.create(Funnels.stringFunnel(Charsets.UTF_8), 10000, 0.05);
        //模拟存储用户id数据
        List<Integer> list = new ArrayList<>(10000);
        for (int i = 0; i < 10000; i++) {
            list.add(i);
            bloomFilter.put("user:id:"+i);
        }
        //赋值
        BloomFilterCache.userIdCache = bloomFilter;
    }
}

使用:



@RestController
@RequestMapping("/bloom")
public class BloomFilterController {
    @Autowired
    private StringRedisTemplate redisTemplate;

    @ApiOperation("判断用户id数据是否存在")
    @GetMapping("/test/{id}")
    public String getString(@PathVariable("id") String id){
            if(!BloomFilterCache.userIdCache.mightContain("user:id:"+id)){
                return "数据不存在";
            }
            return redisTemplate.opsForValue().get("user:id:1000");
    }
}

 

 

 

标签:存在,0000,布隆,过滤器,位图,数据,id
来源: https://www.cnblogs.com/tdyang/p/15334494.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有