布隆过滤器将应用Redis缓存使用量降低100倍

news2024/9/21 4:38:54

文章目录

  • 背景
  • 布隆过滤器介绍
    • 定义
    • 工作原理
    • 数据结构:
  • Redis布隆过滤器实战
  • 总结


背景

由于在业务中用到了Redis用于存储一些关系信息,且对应的请求量比较大,为了防止缓存击穿导致数据库压力过大,一般我们都会采用将不存在的内容存储空值的方式来解决这个问题。但随着业务的逐渐扩大,Redis的容量占用最终非常高,达到了10个T。

最终通过对实际业务数据的分析,发现空值的对应Key在redis中的占比达到了近90%,所以我们认为可以采用布隆过滤器来解决Redis占用量很大的问题。


布隆过滤器介绍

定义

布隆过滤器(Bloom Filter)本质上是一种空间效率极高的概率型数据结构,主要用于判断一个元素是否在一个集合中。它的特点是查询速度快,占用内存少,但是有一定的误判率,即可能会出现假阳性(False Positive),但绝不会出现假阴性(False Negative)。也就是说,布隆过滤器可能会错误地报告某元素存在于集合中,但绝不会错误地报告某元素不存在于集合中。

工作原理

布隆过滤器主要由两部分组成:

  • 位数组(Bit Array):通常是一个很长的二进制向量,初始状态全为0。
  • 哈希函数集:一组独立的哈希函数,用于将元素映射到位数组中的位置。

当一个元素被加入布隆过滤器时,它会被通过所有哈希函数分别计算,得到的结果指示位数组中相应的位置被标记为1。查询元素是否存在时,同样使用相同的哈希函数集计算,检查位数组中对应的位是否全部为1。如果是,则认为元素可能存在(可能是真的存在,也可能是误报);如果不是,则确定元素不存在。

数据结构:

假设我们针对值 “alibaba” 和三个不同的哈希函数分别生成了哈希值 1、4、7,在布隆过滤器内部的存储如下所示:在这里插入图片描述
再存入一个值 “youku”,如果哈希函数返回 3、4、8 的话,图就会变成如下
在这里插入图片描述
我们在判定是否存在这个值时,将业务对应的值初始化到布隆过滤器中,查询时按照同样的方式去查询,若对应的bit位均为1,则存在。
但上图也可以清楚的发现,随着增加的值越来越多,被置为 1 的 bit 位也会越来越多,这样某个值 “alibaba” 即使没有被存储过,但是万一哈希函数返回的三个 bit 位都被其他值置位了 1 ,那么程序还是会判断 “alibaba” 这个值存在。存在一定的误判。


Redis布隆过滤器实战

1. 引入库

<!-- Maven -->
<dependencies>
    <dependency>
        <groupId>org.redisson</groupId>
        <artifactId>redisson-spring-boot-starter</artifactId>
        <version>3.16.6</version> <!-- 使用与你的Redisson版本匹配的starter版本 -->
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-redis</artifactId>
    </dependency>
</dependencies>

2.配置yml文件

# application.yml
spring:
  redis:
    host: localhost
    port: 6379
    database: 0
    timeout: 10s # optional

3.创建布隆过滤器

import org.redisson.api.RBloomFilter;
import org.redisson.api.RedissonClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class BloomFilterService {

    private final RBloomFilter<String> bloomFilter;

    @Autowired
    public BloomFilterService(RedissonClient redissonClient) {
        this.bloomFilter = redissonClient.getBloomFilter("myBloomFilter");
        
        // 初始化布隆过滤器,设置预期元素数量和误判率
        bloomFilter.tryInit(1_000_000L, 0.01d);
    }

    /**
     * 添加元素到布隆过滤器
     */
    public void addElement(String element) {
        bloomFilter.add(element);
    }

    /**
     * 检查元素是否可能存在于布隆过滤器中
     */
    public boolean mightContain(String element) {
        return bloomFilter.contains(element);
    }
}

4.使用示例

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class MyController {

    private final BloomFilterService bloomFilterService;

    @Autowired
    public MyController(BloomFilterService bloomFilterService) {
        this.bloomFilterService = bloomFilterService;
    }

    @GetMapping("/check-element")
    public String checkElement(@RequestParam String element) {
        if (bloomFilterService.mightContain(element)) {
            return "Element may exist.";
        } else {
            return "Element definitely does not exist.";
        }
    }
}

总结

依赖于Redis的布隆过滤器,大大的减少了Redis中key的数量,以bit标记的方式存储,最终该场景的Redis存储使用量由10T约降低到100G,减少了100倍!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2033242.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

头狼择校小程序

综述介绍 头狼择校&#xff0c;是头狼择™高校的简称&#xff0c;我们专注高校、大学的择校。倡导先嗅就业再择校&#xff0c;是预约工具和对话平台。帮您嗅招办、嗅教授、嗅学姐&#xff0c;预约择校有关的老师、顾问&#xff0c;助力考大学和考研的“双考”学生及家长了解就…

C# OnnxRuntime部署LivePortrait实现快速、高质量的人像驱动视频生成

目录 效果 说明 项目 模型信息 代码 下载 效果 LivePortrait实现快速、高质量的人像驱动视频生成 说明 官网地址&#xff1a;https://github.com/KwaiVGI/LivePortrait 代码实现参考&#xff1a;https://github.com/hpc203/liveportrait-onnxrun 模型下载&#xff1a;…

【健康革命】让AI成为你的私人健身教练!

本文由 ChatMoney团队出品 现在市面上有很多男生和女生为了保持身材都进行疯狂的减肥&#xff0c;有些是靠吃减肥药来保持身材&#xff0c;有些是晚上不吃饭要控制&#xff0c;还有些疯狂且漫无目的健身&#xff1b;但往往以上几种都很伤身体的&#xff0c;毕竟身体健康是革命的…

历史库,成本与性能如何兼得?| OceanBase应用实践

随着数据量的迅猛增长&#xff0c;企业和组织在数据库管理方面遭遇的挑战愈发凸显。数据库性能逐渐下滑、存储成本节节攀升&#xff0c;以及数据运维复杂性的增加&#xff0c;这些挑战使得DBA和开发者在数据管理上面临更大的压力。 为了应对这些挑战&#xff0c;对数据生命周期…

简单的docker学习 第13章 CI/CD与Jenkins(下)

第13章 CI/CD 与 Jenkins 13.13 自由风格的 CI 操作(最终架构) 前面的架构存在的问题是&#xff0c;若有多个目标服务器都需要使用该镜像&#xff0c;那么每个目标服务器都需要在本地构建镜像&#xff0c;形成系统资源浪费。若能够在 Jenkins 中将镜像相撞构建好并推送到 Har…

Java属性重写问题

目录 属性重写 案例演示 多态练习 练习1 练习2 属性重写 ​​​​​​​ 属性没有重写之说&#xff0c;属性的值看编译类型。 instanceOf 比较操作符&#xff0c;用于判断对象的运行类型是否为某类型或者某类型的子类。 案例演示 父类base&#xff0c;有一个count属…

Collection和List集合

1.Collection集合 1.1数组和集合的区别【理解】 相同点 都是容器,可以存储多个数据 不同点 数组的长度是不可变的,集合的长度是可变的 数组可以存基本数据类型和引用数据类型 集合只能存引用数据类型,如果要存基本数据类型,需要存对应的包装类 1.2集合类体系结构【理解】 …

旧手机拍摄的视频模糊可以修复清晰吗?

你是否时常“考古”一些老电影、老动漫来回忆旧日时光&#xff1f;你是否也有一些珍贵的录像&#xff0c;带你重温过去的美好&#xff1f;然而&#xff0c;我们已经习惯了高清体验&#xff0c;回头再看曾经的旧影像&#xff0c;画质或许“渣”的让人不忍直视。 旧手机像素不好&…

【论文笔记】Dual-Balancing for Multi-Task Learning

Abstract 多任务学习(Multi-task learning, MTL)中&#xff0c;任务平衡问题仍然是重要的挑战&#xff0c;损失、梯度尺度的不同&#xff0c;会导致性能的折中。 本文提出Dual-Balancing for Multi-Task Learning (DB-MTL)&#xff0c;从损失和梯度两个角度缓解任务均衡问题。…

成功解决:IDEA导入java项目 或 建包的时候com.不分开 【详细原理解释说明】

我 | 在这里 ⭐ 全栈开发攻城狮、全网10W粉丝、2022博客之星后端领域Top1、专家博主。 &#x1f393;擅长 指导毕设 | 论文指导 | 系统开发 | 毕业答辩 | 系统讲解等。已指导60位同学顺利毕业 ✈️个人公众号&#xff1a;热爱技术的小郑。回复 Java全套视频教程 或 前端全套视频…

子串 前缀和 | Java | (hot100) 力扣560. 和为K的子数组

560. 和为K的子数组 暴力法&#xff08;连暴力法都没想出来……&#xff09; class Solution {public int subarraySum(int[] nums, int k) {int count0;int len nums.length;for(int i0; i<len; i) {int sum0;for(int ji; j<len; j) {sumnums[j];if(sum k) {count;}…

C/C++复习 day2(模板,继承,多态)

C/C复习 day2 文章目录 C/C复习 day2前言一、模板1.模板的原理2.非类型模板参数3.模板的特化a. 函数模板的特化b. 类模板的特化1.全特化2.偏特化 4.模板的分离编译 二、继承1.继承的概念2.继承与派生类对象赋值转化3.隐藏1.成员变量的隐藏2. 成员函数的隐藏 4.继承中的友元5.继…

数据结构:栈(含源码)

目录 一、栈的概念和结构 二、栈的实现 2.1 头文件 2.2 各个功能的实现 初始化栈 入栈 出栈 获取栈顶元素和栈中有效个数 判断栈是否为空 栈的销毁 2.3 测试 完整源码 一、栈的概念和结构 栈&#xff1a;一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和…

[C++][opencv]基于opencv实现photoshop算法图像剪切

【测试环境】 vs2019 opencv4.8.0 【效果演示】 【核心实现代码】 //图像剪切 //参数&#xff1a;src为源图像&#xff0c; dst为结果图像, rect为剪切区域 //返回值&#xff1a;返回0表示成功&#xff0c;否则返回错误代码 int imageCrop(InputArray src, OutputArray dst,…

遥感影像-语义分割数据集:sar水体数据集详细介绍及训练样本处理流程

原始数据集详情 简介&#xff1a;该数据集由WHU-OPT-SAR数据集整理而来&#xff0c;覆盖面积51448.56公里&#xff0c;分辨率为5米。据我们所知&#xff0c;WHU-OPT-SAR是第一个也是最大的土地利用分类数据集&#xff0c;它融合了高分辨率光学和SAR图像&#xff0c;并进行了充…

Chromium编译指南2024 -Android篇:安装其他常用软件(三)

1.引言 在前面的章节中&#xff0c;我们详细讲解了编译 Chromium for Android 所需的系统和硬件要求&#xff0c;并介绍了如何配置开发环境&#xff0c;包括更改软件源和安装基本依赖。在完成这些基础配置之后&#xff0c;为了进一步提升开发和编译效率&#xff0c;您可能还需…

【Hot100】LeetCode—438. 找到字符串中所有字母异位词

目录 1- 思路哈希表 滑动窗口 2- 实现⭐438. 找到字符串中所有字母异位词——题解思路 3- ACM 实现 原题链接&#xff1a;438. 找到字符串中所有字母异位词 1- 思路 哈希表 滑动窗口 思路 哈希表&#xff1a;通过数组维护一个哈希表滑动窗口&#xff1a;通过控制数组的下标…

为何说本届巴黎奥运会中国金牌榜应排列第一?

为何说本届巴黎奥运会中国金牌榜应排列第一&#xff1f; 在奥运会上&#xff0c;金牌榜的排名一直是各国关注的焦点。然而&#xff0c;在历届奥运会中&#xff0c;关于金牌榜的统计方法和排名标准却存在一定的争议。尤其在中美两国之间&#xff0c;金牌榜的排名往往成为双方媒体…

制作好的excel报表设置打开密码或忘记密码怎么办?

excel工作表经常用来做数据统计、工资、报表等的文件格式&#xff0c;这些类型的文件都是很重要的数据资料&#xff0c;为此做这些数据的朋友们都会给他设置一个打开密码&#xff0c;不让其他人随便打开。但随着时间的流逝&#xff0c;我们做的数据报表越来越多了&#xff0c;做…

transformer(李宏毅老师系列)

自学参考&#xff1a; Transformer:Attention Is All You Need Transformer论文逐段精读 视频课 课件资料 笔记 一、引入 seq2seq&#xff1a;输入一个序列的向量作为input&#xff0c;output的长度由机器自己决定seq2seq model应用: 语音辨识 输入是声音讯号的一串vector 输出…