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 按钮新建一个重写的规则 在右侧编辑重…

使用PCtoLCD2002提取字模

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

Spark Core

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

gitlab 设置 分支只读

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

AVS3:双向梯度修正BGC

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

web —— html

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

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

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

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

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

初识Java 17-2 反射

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

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

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

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

1、查看所有运行的端口: netstat -ano 2、查看被占用端口对应的 PID netstat -aon|findstr "8081" 回车执行该命令,最后一串数字就是 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是一个提供了一组广泛的集成和数据连接器,允许我们链接和编排不同的模块。可以常…

【今日文章】:如何用css 实现星空效果

【今日文章】:如何用css 实现星空效果 需求实现tips: 需求 用CSS 实现星空效果的需求: 屏幕上有“星星”,且向上移动。移动的时候,动画效果要连贯,不能出现闪一下的样子。 实现 这里我们需要知道,“星星”是…

阿里云服务器云盘性能IOPS和吞吐量说明SSD、ESSD和高效

阿里云服务器系统盘或数据盘支持多种云盘类型,如高效云盘、ESSD Entry云盘、SSD云盘、ESSD云盘、ESSD PL-X云盘及ESSD AutoPL云盘等,阿里云百科aliyunbaike.com详细介绍不同云盘说明及单盘容量、最大/最小IOPS、最大/最小吞吐量、单路随机写平均时延等性…

电脑发热发烫,具体硬件温度达到多少度才算异常?

环境: 联想E14 问题描述: 电脑发热发烫,具体硬件温度达到多少度才算异常? 解决方案: 电脑硬件的温度正常范围会因设备类型和使用的具体硬件而有所不同。一般来说,以下是各种硬件的正常温度范围: CPU:正…

软件设计模式的意义

软件设计模式的意义 所有开发人员都应该接触过软件设计模式这个概念,看过《设计模式-可复用的对象软件的基础》这本书,在面试中都被问过: 你用过哪些设计模式这种问题。但很大可能也就仅此而已了。 为什么好像只能从框架中找到设计模式的应用…

kubernetes(5) 续4

目录 volumes emptyDir卷 hostpath卷 nfs卷 持久卷 storageclass statefulset控制器 mysql主从部署 volumes emptyDir卷 [rootk8s2 volumes]# vim emptydir.yaml apiVersion: v1 kind: Pod metadata:name: vol1 spec:containers:- image: busyboxplusname: vm1command: ["…

3D视觉引导纸箱拆码垛,助力物流行业转型升级

近年来,自动化和智能化技术在各行业的应用越来越广泛,特别是在物流和仓储领域。纸箱拆码垛是物流仓储中的一个重要环节。 人工分拣效率低、错误率高、成本高,传统的拆码垛设备存在兼容性差,对纸箱的识别率不高、操作不灵活等问题…

jsp多层弹框,让弹框出现在最外层,最顶层

如下图所示,给该弹框添加样式,z-index:5 这个值要比已经弹出的弹框的值大,