Redis 扩展 RedisBloom 插件,解决缓存击穿、穿透

文章目录

    • 一、概述
    • 二、编译准备
      • 2.1 升级 make
      • 2.2 安装 Python3
    • 三、编译 RedisBloom
    • 四、测试 RedisBloom
    • 五、应用场景
      • 5.1 缓存击穿
      • 5.2 缓存穿透
      • 5.3 原理总结
    • 六、存在的问题

如果您对Redis的了解不够深入请关注本栏目,本栏目包括Redis安装,Redis配置文件说明,Redis命令和数据类型说明,Redis持久化配置,Redis主从复制和哨兵机制,Redis Cluster(集群)配置,Redis Predixy 集群,Redis Twemproxy 集群,Redis Codis 集群。

一、概述

  • RedisBloom是Redis的一个模块,用于实现布隆过滤器和其他概率数据结构。它的主要作用是帮助你在Redis中实现高效的数据查找和去重操作,特别适用于处理大规模数据集。如果你需要进行高效的成员存在性检查、去重、计数或Top-K查询等任务,RedisBloom可以是一个有用的扩展。

  • 具体来说,RedisBloom 提供以下功能和作用:

    • 布隆过滤器(Bloom Filter):RedisBloom支持布隆过滤器,这是一种用于快速检查一个元素是否存在于一个集合中的数据结构。布隆过滤器可以高效地判断一个元素是否“可能存在”或“一定不存在”,而不需要实际存储元素本身。这在缓存和去重等场景中非常有用。
    • Count-Min Sketch:RedisBloom还支持Count-Min Sketch,这是一种概率数据结构,用于估算某个事件发生的次数。这对于计数和监控任务非常有用。
    • Top-K 数据:RedisBloom支持Top-K数据结构,可以用于确定集合中最常见的元素,或者最大的N个元素。
    • HyperLogLog:尽管HyperLogLog不是RedisBloom的一部分,但它通常与RedisBloom一起使用,用于估算唯一元素的数量。
  • 缓存击穿:缓存击穿是指当某个缓存键过期或不存在时,大量的请求同时涌入,导致请求直接落到数据库上,增加数据库的负载。

  • 缓存穿透:缓存穿透是指恶意请求发送到缓存中查询一个不存在的键,导致大量的请求直接落到数据库上,增加数据库的负载。

  • 防止缓存击穿的实现逻辑:首先根据业务逻辑将已有数据同步到 RedisBloom,然后请求时先根据 RedisBloom 判断是否存,来处理击穿和穿透。但是使用RedisBloom有一个问题,就是只能增加,不能删除Key。

  • 开源地址:RedisBloom

二、编译准备

  • 以下CentOS 7中操作步骤

2.1 升级 make

  • 编译 RedisBloom 需要 make 在 4.0 及以上,编译前请自行检查,不满足则先升级。如下我的是3.82则升级。

    make --version# sudo yum update
    sudo yum install centos-release-scl -y
    sudo yum install devtoolset-7-make -y
    scl enable devtoolset-7 bash

    [root@yiqifu-redis RedisBloom]# make --version
    GNU Make 3.82
    Built for x86_64-redhat-linux-gnu
    Copyright © 2010 Free Software Foundation, Inc.
    License GPLv3+: GNU GPL version 3 or later http://gnu.org/licenses/gpl.html
    This is free software: you are free to change and redistribute it.
    There is NO WARRANTY, to the extent permitted by law.

    [root@yiqifu-redis RedisBloom]# make --version
    GNU Make 4.2.1
    为 x86_64-redhat-linux-gnu 编译
    Copyright © 1988-2016 Free Software Foundation, Inc.
    许可证:GPLv3+:GNU 通用公共许可证第 3 版或更新版本http://gnu.org/licenses/gpl.html。
    本软件是自由软件:您可以自由修改和重新发布它。
    在法律允许的范围内没有其他保证。

2.2 安装 Python3

  • 编译 RedisBloom 还需要 Python3,请检查安装。

    python3 --versionyum install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gcc make libffi-devel -y
    wget https://www.python.org/ftp/python/3.8.16/Python-3.8.16.tgz
    tar -zxvf Python-3.8.16.tgz
    cd Python-3.8.16# 指定编译文件的存放目录(安装目录)
    # --prefix=/usr/local/python3.8
    # 指定openssl包编译,否则pip install组件的时候,会无法下载https的组件
    # --with-openssl=/usr/bin/openssl
    ./configure --prefix=/usr/local/python3.8
    make && make install/usr/local/python3.8/bin/python3 -m venv ~/penv
    source ~/penv/bin/activate# 切换版本
    # sudo alternatives --install /usr/bin/python python /usr/bin/python2 50
    # sudo alternatives --install /usr/bin/python python /usr/bin/python3 60
    ## sudo alternatives --config python
    

    [root@yiqifu-redis RedisBloom]# python --version
    Python 2.7.5

    [root@yiqifu-redis RedisBloom]# python --version
    Python 3.8.6

三、编译 RedisBloom

  • 依次执行以下命令

    yum install git cmake -y
    git clone --recursive https://github.com/RedisBloom/RedisBloom.git
    cd RedisBloom./sbin/setup
    bash -l
    make
    

四、测试 RedisBloom

  • 将编译 RedisBloom 文件拷贝到指定位置

    mkdir /opt/redis6/module
    cp ./bin/linux-x64-release/redisbloom.so   /opt/redis6/module/
    
  • 启动带RedisBloom模块的Redis

    redis-server --port 6360 --loadmodule /opt/redis6/module/redisbloom.so
    

    或者在 redis.conf 文件中配置: loadmodule /opt/redis6/module/redisbloom.so

    有关Redis配置文件请参考这里

  • 使用客户端测试

    [root@yiqifu-redis ~]# redis-cli -p 6360
    127.0.0.1:6360> bf.add aaa 111
    (integer) 1
    127.0.0.1:6360> bf.exists aaa 111
    (integer) 1127.0.0.1:6360> bf.madd bbb 222 ccc 333
    1) (integer) 1
    2) (integer) 1
    3) (integer) 1
    127.0.0.1:6360> bf.mexists bbb 222 ccc 333
    1) (integer) 1
    2) (integer) 1
    3) (integer) 1
    127.0.0.1:6360>

五、应用场景

5.1 缓存击穿

  • 缓存击穿是指当某个缓存键过期或不存在时,大量的请求同时涌入,导致请求直接落到数据库上,增加数据库的负载。

  • 为了防止缓存击穿,可以采用以下步骤:

    • 当缓存键过期时,立即在RedisBloom布隆过滤器中添加该键。布隆过滤器是一种高效的数据结构,可以用来快速判断某个元素是否存在于集合中,而不需要实际的存储。这样可以避免对数据库的重复查询。

    • 在请求过来时,首先检查请求的键是否存在于RedisBloom布隆过滤器中。如果该键不存在于布隆过滤器中,可以立即返回缓存未命中的响应,避免对数据库的直接查询。这样可以避免不必要的负载。

5.2 缓存穿透

  • 缓存穿透是指恶意请求发送到缓存中查询一个不存在的键,导致大量的请求直接落到数据库上,增加数据库的负载。

  • 为了防止缓存穿透,可以采用以下步骤:

    • 在请求到来时,首先检查请求的键是否存在于RedisBloom布隆过滤器中。如果该键不存在于布隆过滤器中,可以立即返回缓存未命中的响应,避免对数据库的直接查询。这样可以过滤掉恶意请求。

    • 如果请求的键存在于布隆过滤器中,继续查询缓存。如果缓存未命中,可以返回缓存未命中的响应。这样可以避免对数据库的不必要查询。

5.3 原理总结

  • 提前把数据使用(bf.add、bf.madd)都添加布隆过滤器,访问时使用(bf.exists、bf.mexists)在布隆过滤器中判断是否在存,如果不存直接返回没有记录。如果存在才查询缓存或者数据库。

  • 通过使用RedisBloom布隆过滤器,您可以在处理请求之前快速过滤掉一些无效的请求,从而减轻数据库的负载。这种方法结合了布隆过滤器的高效性和Redis的缓存机制,可以有效地防止缓存击穿和缓存穿透问题。

  • 请注意,布隆过滤器是一个概率数据结构,存在一定的误判率。因此,在设计实际系统时,需要根据实际情况调整布隆过滤器的参数,以平衡误判率和内存消耗。

在这里插入图片描述

六、存在的问题

  • 如果您使用的是普通的布隆过滤器,它通常只支持添加元素而不支持删除。当数据确定删除时,可以采取以下方法处理:

    • 过期时间:在添加缓存时,可以为每个缓存键设置一个过期时间。当缓存键过期后,系统会自动将其从缓存中删除。这种方式可以在一定程度上解决数据删除的问题,但是需要根据实际情况设置合适的过期时间。

    • 定期刷新:定期刷新是指定期性地删除过期的缓存键。您可以设置一个定时任务,定期扫描布隆过滤器中的所有键,将已过期的键从布隆过滤器中删除。这样可以确保布隆过滤器中不会保留已删除的键,但是需要额外的维护工作和计算资源。

  • 调整布隆过滤器的参数和误判率,请考虑以下几点:

    • 布隆过滤器的容量:布隆过滤器的容量需要根据预期的数据量进行合理的估计。如果容量设置过小,会增加误判率;如果容量设置过大,会增加内存消耗。根据实际场景和资源限制,选择合适的容量。

    • 哈希函数的数量:布隆过滤器使用多个哈希函数来确定元素在位数组中的位置。哈希函数的数量会影响误判率和性能。较多的哈希函数可以降低误判率,但也会增加计算开销。在设计中,需要平衡误判率和性能需求,选择适当的哈希函数数量。

    • 误判率容忍度:根据系统的需求和可接受的误判率,调整布隆过滤器的参数。误判率是在设置合适的容量和哈希函数数量的前提下,根据实际情况进行调整的指标。较低的误判率会增加内存消耗和计算开销,而较高的误判率可能导致缓存命中率下降。

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

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

相关文章

使用CMake引入第三方so库及头文件并调用头文件声明的函数

首先,要调用别人的so库和头文件,我们自己项目中需要有NDK。 因为只有C++代码才能直接调用C++代码,也就是头文件和so库的函数。 其次,就是要想办法把头文件,so库和项目中的NDK关联起来,然后作为一个整体,生成一个jni,供Java层调用。 最后,二者的关联是通过CMake完成的…

软件测试/测试开发丨接口测试Mock实战练习学习笔记

点此获取更多相关资料 本文为霍格沃兹测试开发学社学员学习笔记分享 原文链接:https://ceshiren.com/t/topic/27857 一、Rewrite 1.1、Rewrite 原理 1.2、Rewrite 实战 Tools → Rewrite 勾选 Enable Rewrite 点击下方 Add 按钮新建一个重写的规则 在右侧编辑重…

ESP使用webserver实现本地控制

因为使用云服务有时候不可靠,那么离线控制就很重要。本文使用webserver实现本地网页控制。这样不需要再单独开发APP,有浏览器就可以控制。本文所有测试是靠ESP32。8266未测试。使用USE_8266控制。 核心代码如下: html.h #pragma onceconst…

大数据中的分布式文件系统MapReduce的选择题

一 . 选择题 一. 单选题(共9题,49.5分) (单选题)下列传统并行计算框架,说法错误的是哪一项? A. 刀片服务器、高速网、SAN,价格贵,扩展性差上 B. 共享式(共享内存/共享存储),容错性好 C. 编程难度高 D. 实时、细粒度计算、计算密集型 正确答…

webpack 的 Loader 和 Plugin 的区别,常见的 loader 和 plugin 有哪些?

结论先行: 1、 Loader 和 Plugin 的区别 Loader 也叫做就是“加载器”,因为 webpack 原生只能解析 js 文件,而对于其他类型文件,则需要借助 loader。所以 loader 的作用就是实现对不同格式文件的解析和处理,例如把 E…

使用PCtoLCD2002提取字模

“模式”---“字符模式” LCD显示,汉字使用宋体还是比较好的,16*16是长、宽都是16个像素显示。

Lavarel异步队列的使用

系统为window 启动队列&#xff1a; php artisan queue:listen设置队列类 .env文件需设置&#xff1a;QUEUE_CONNECTIONredis <?phpnamespace App\Jobs;use Illuminate\Bus\Queueable; use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Foundation\Bus\Disp…

Spark Core

Spark Core 本文来自 B站 黑马程序员 - Spark教程 &#xff1a;原地址 第一章 RDD详解 1.1 为什么需要RDD 分布式计算需要 分区控制shuffle控制数据存储、序列化、发送数据计算API等一系列功能 这些功能&#xff0c;不能简单的通过Python内置的本地集合对象&#xff08;如…

gitlab 设置 分支只读

一&#xff0c;设置master分支只读&#xff0c; 并且只有Maintainers 拥有合并权限。 二&#xff0c;设置成员权限 改为developer 三&#xff0c;邀请成员 点击右上角 Invite Members

冒泡排序算法的四种实现方式:C、C++、Java和Python

下面是冒泡排序算法的四种实现方式&#xff1a;C、C、Java和Python。 C语言实现&#xff1a; #include <stdio.h>void bubbleSort(int arr[], int n) {for (int i 0; i < n - 1; i) {for (int j 0; j < n - i - 1; j) {if (arr[j] > arr[j 1]) {int temp …

AVS3:双向梯度修正BGC

双向梯度修正&#xff08;Bi-directional Gradient Correction&#xff0c;BGC&#xff09;是利用双向参考块间的差值对预测值进行修正的技术。 BGC仅用于双向预测CU&#xff0c;设两个方向得到的单向预测值分别为pred0和pred1&#xff0c;修正前的双向预测值为predBI&#xf…

web —— html

Web —— css基础 1. HTML2. 基本HTML结构3. HTML常用标签3.1 文本相关标签3.2 HTML图像标签3.3 HTML超链接标签3.4 HTML表&#xff0c;单3.4.1 HTML表格3.4.2 HTML表单&#xff0c;输入框&#xff08;多选框&#xff0c;单选框&#xff09;下拉框 3.5 HTML分区标签3.5.1 div标…

LeetCode-94. 二叉树的中序遍历(C++)

目录捏 一、题目描述二、示例与提示三、思路四、代码 一、题目描述 给定一个二叉树的根节点 root &#xff0c;返回 它的 中序 遍历 。 二、示例与提示 示例 1&#xff1a; 输入&#xff1a; root [1,null,2,3] 输出&#xff1a; [1,3,2] 示例 2&#xff1a; 输入&#xf…

大数据毕业设计选题推荐-营业厅营业效能监控平台-Hadoop-Spark-Hive

✨作者主页&#xff1a;IT毕设梦工厂✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Py…

初识Java 17-2 反射

目录 转型前检查 构建例子&#xff1a;生成层次结构 优化Creator&#xff1a;使用类字面量 优化PetCounter&#xff1a;动态验证类型 更通用的递归计数 注册工厂 本笔记参考自&#xff1a; 《On Java 中文版》 转型前检查 当我们使用传统的类型转换&#xff0c;例如&…

Java封装BufferedImage与base64互转方法

一、BufferedImage转base64 /*** BufferedImage 编码转换为 base64* param bufferedImage* return*/private static String BufferedImageToBase64(BufferedImage bufferedImage) {ByteArrayOutputStream bao new ByteArrayOutputStream();//io流try {ImageIO.write(buffered…

【系统架构设计】架构核心知识: 5 系统安全性与保密性设计

目录 一 信息安全基础 1 信息安全的基本要素 2 信息安全的范围 3 网络安全

支付卡行业(PCI)PIN安全要求和测试程序 7个控制目标、33个要求及规范性附录ABC 密钥注入-PCI认证-安全行业基础篇4

概述 用于在ATM和POS终端进行在线和离线支付卡交易处理期间&#xff0c;对个人身份号码&#xff08;PIN&#xff09;数据进行安全管理、处理和传输。 该标准具体包括 7 个控制目标和 33 个安全要求&#xff0c; 标准的结构分为标准主体部分&#xff0c;标准附录&#xff08;N…

windows查看端口号占用,并杀死进程

1、查看所有运行的端口&#xff1a; netstat -ano 2、查看被占用端口对应的 PID netstat -aon|findstr "8081" 回车执行该命令&#xff0c;最后一串数字就是 PID进程号, 这里是 19232。 3、查看指定 PID 的进程 tasklist|findstr "19232" 回车执行该…

[NLP] 使用Llama.cpp和LangChain在CPU上使用大模型

一 准备工作 下面是构建这个应用程序时将使用的软件工具: 1.Llama-cpp-python 下载llama-cpp, llama-cpp-python [NLP] Llama2模型运行在Mac机器-CSDN博客 2、LangChain LangChain是一个提供了一组广泛的集成和数据连接器&#xff0c;允许我们链接和编排不同的模块。可以常…