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.rhkb.cn/news/184484.html

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

相关文章

于道 - 前端项目启动步骤参考

1. 安装 启动过程有9个步骤: 1.1 安装 Node JS , V18版本的 (安装步骤省略) 1.2 安装 npm install -g yarn ,node JS里边好像自带npm ,通过npm的命令安装 yarn 1.3 切换到项目中去安装,npm install &a…

Wsl2 Ubuntu在不安装Docker Desktop情况下使用Docker

目录 1. 前提条件 2.安装Distrod 3. 常见问题 3.1.docker compose 问题无法使用问题 3.1. docker-compose up报错 参考文档 1. 前提条件 win10 WSL2 Ubuntu(截止202308最新版本是20.04.xx) 有不少的博客都是建议直接安装docker desktop,这样无论在windows…

计算机基础知识45

JS的RegExp对象(正则) text: 正则校验数据 # T/F match: 匹配 # (3) [s, s, s] //定义 var reg1 new RegExp("^[a-zA-Z][a-zA-Z0-9]{5,11}"); var reg2 /^[a-zA-Z][a-zA-Z0-9]{5,9}$/; //正则校验数据 var res reg1.test(jason666); console.log(res…

前端之Bootstrap框架

目录 【一】Bootstrap介绍 【二】Bootstrap引入 【1】CDN加速链接 【2】注意 【三】布局容器 【四】栅格系统 【五】栅格参数 【六】列偏移 【七】排版 标题 内联文本元素 对齐 改变大小写 引用 列表 【八】表格 基本实例 条纹状表格 带边框的表格 鼠标悬停…

接口测试总结

本文主要分为两个部分: 第一部分:主要从问题出发,引入接口测试的相关内容并与前端测试进行简单对比,总结两者之前的区别与联系。但该部分只交代了怎么做和如何做?并没有解释为什么要做? 第二部分&#xff1…

武汉某母婴用品公司 - 集简云连接ERP和营销系统,实现库存管理的自动化

品牌介绍与关怀理念 武汉某母婴用品公司是一家专注于高端孕婴童护理用品的企业,积极响应和关怀孕产人群,全方位提供从待产用品到产后护理用品,再到婴童洗护用品和初生婴儿用品等一系列全面的母婴产品。我们的使命是满足客户的需求&#xff0…

SpringBoot集成-阿里云对象存储OSS

文章目录 阿里云 OSS 介绍准备工作SpringBoot 集成 OSS 阿里云 OSS 介绍 阿里云对象存储 OSS (Object Storage Service),是一款海量、安全、低成本、高可靠的云存储服务。使用 OSS,你可以通过网络随时存储和调用包括文本、图片、…

前端常用的开发工具有哪些?

目录 内置管理系统的通用场景 前后端代码生成器 权限管控 开放源码 运行性能 主流数据库 写在最后 目前使用的是JNPF框架。 前端采用Vue.js,这是一种流行的前端JavaScript框架,用于构建用户界面。Vue.js具有轻量级、可扩展性强和生态系统丰富等特点&…

NCV7721D2R2G一款完全保护的双半桥驱动器 专为汽车工业运动控制解决方案

NCV7721D2R2G是一款完全保护的双半桥驱动器,专为汽车和工业运动控制应用而设计。两个半桥驱动器具有独立控制。这允许高侧、低侧和H桥控制。H桥控制提供正向、反向、制动和高阻抗状态。驱动器通过逻辑电平输入进行控制。 特性: 1.睡眠模式下的超低静态电…

Python 实现动态动画心形图

在抖音上刷到其他人用 matlab 实现的一个动态心形图,就想也用 Python 实现,摸索了两种实现方式,效果如下: 方法一: 利用循环,结合 pyplot 的 pause 与 clf 参数实现图像的动态刷新 import matplotlib.p…

AirTag追踪汽车

美国华盛顿特区,11月4日,在一项全新的抗击车辆盗窃的措施中,市长穆里尔•鲍泽签署了一项新计划,将向该市车辆盗窃频率较高的社区居民免费提供苹果AirTag追踪器。 AirTag是苹果公司推出的一款蓝牙跟踪设备,它依靠Findm…

华为eNSP实验-DHCP实验(简易入门版)

1.拓扑图 2.R1配置 <Huawei>system-view [Huawei]sysname R1 [R1]interface GigabitEthernet 0/0/0 [R1-GigabitEthernet0/0/0]ip address 192.168.1.1 24 [R1]ip pool PC [R1-ip-pool-PC]gateway-list 192.168.1.1 [R1-ip-pool-PC]network 192.168.1.0 mask 24 [R1-i…

缓存-Spring Cache 缓存抽象

缓存-Spring Cache 缓存抽象 Spring从版本3.1开始提供非侵入的将Cache集成到Spring应用的方式。Spring Cache提供Cache的统一抽象&#xff0c;支持集成各种不同的缓存解决方案。从4.1版本开始&#xff0c;提供了注解和更多的定制参数。 Spring Cache 抽象提供了对Java方法的缓存…

台式电脑怎么无损备份迁移系统到新硬盘(使用傲梅,免费的就可以)

文章目录 前言一、想要将源硬盘上的系统原封不动地迁移到新硬盘上二、准备工作2.具体步骤 总结 前言 半路接手公司一台台式电脑&#xff0c;C盘&#xff08;120g&#xff09;爆红&#xff0c;仅剩几个G&#xff0c;优化了几次&#xff0c;无果后。准备换一个大一点的增到500g。…

智能井盖生产商家,万宾科技井盖传感器产品详情

市政府管理水平决定城市人民幸福程度&#xff0c;所以在智慧城市推进过程中&#xff0c;市政府也在加快城市信息基础设施建设&#xff0c;希望提高公共服务水平&#xff0c;以此来满足城市居民的需求&#xff0c;进一步推进城市信息化智能化发展。作为城市生命线的一个组成部分…

成绩公布方式,这样操作更方便

老师们&#xff01;又到了期中&#xff0c;是不是又在为如何安全、高效的公布学生成绩而烦恼呢&#xff1f;别担心&#xff0c;今天我就给大家分享几种超实用的成绩公布方式&#xff0c;不仅减轻了你的工作负担&#xff0c;还能让学生和家长们也方便&#xff01; 1 Excel表格&a…

apache-tomcat-9.0.29 安装配置教程

链接&#xff1a;https://pan.baidu.com/s/100buXYpn8w8xjI2KdvHk2Q?pwd2mwc 提取码&#xff1a;2mwc 1.将压缩包解压到指定文件夹下 2.进入bin文件夹下 3.找到setclasspath.bat文件 4.推荐用notepad打开文件&#xff0c;并做如下配置&#xff08;可解决tomcat启动闪退问题&…

查询优化器:RBO与CBO

SQL查询优化器 1、数据库系统发展简史2、SQL查询优化器3、查询优化器分类4、查询优化器执行过程5、CBO框架Calcite简介 1、数据库系统发展简史 数据库系统诞生于20世纪60年代中期&#xff0c;至今已有近50多年的历史&#xff0c;其发展经历了三代演变&#xff0c;造就了四位图灵…

uniapp H5预览PDF支持手势缩放、分页、添加水印、懒加载、PDF下载

效果预览 项目说明 uniapp vue2 node&#xff1a;v14.18.3 npm&#xff1a; 6.14.15 安装pdfh5.js插件 pdfh5 - npm (npmjs.com)pdfh5.js 基于pdf.js和jQuery pdfh5 - npm (npmjs.com) npm install pdfh5 由于我安装最新的pdfh5.js后运行时报错 所以我选择降低版本,可能是node…

【数据结构】堆排序和top-K问题

堆的实现源码 #define _CRT_SECURE_NO_WARNINGS#include <stdio.h> #include <stdlib.h> #include <time.h> #include <stdbool.h> #include <assert.h> typedef struct Heap {int* a;int size;int capacity; }Heap; void HeapInit(Heap* st) {…