缓存穿透、布隆过滤器、布谷鸟过滤器

news2024/11/27 9:35:20

1.概述

缓存穿透:

当查询的数据在缓存(redis)中没有时,一般业务上就会去查询数据存储(数据库),这种情况称为缓存穿透。穿透的数量太大会造成数据存储撑不住(数据库)而宕机。

解决思路:

用一个结构来记录哪些数据是存在于缓存中的。但这个结构不能太长,要是把所有缓存中的数据都 单独记一条在某个结构中,那就相当于又造了个缓存,完全失去意义。

目前常用的方案是布隆过滤器或者布谷鸟过滤器来解决缓存穿透问题。

2.布隆过滤器

2.1.概述

布隆过滤器,1970年由布隆提出,由一个很长的二进制向量来一系列散列函数组成。

2.2.数据操作

2.2.1插入数据

数据输入,通过一系列的散列运算,分别散列映射到到二进制向量的下标上去,在向量的该位置记 录,1表示存在,0表示不存在。

2.2.2查找数据

数据输入,通过一系列的散列运算,计算出下标,去下标对应位置确认,是否为1(数据是否存 在),所有位置均存在(均为1)则表示该数据存在,否则表示该数据不存在。 删除数据 布隆过滤器很难删除,删除的时候很容易造成误删。原因很简单,散列运算可能会造成散列冲突, 即不同的输入散列运算的结果是相同的,二进制向量中单个下标表示的不知一个数据,所以布隆过 滤器很难做到对数据的精准删除。

2.3.优缺点

查询速度快

查询操作的时间复杂度为O(n),n是散列函数的个数。

数据安全

二进制向量中存放的只是判断标志位,一串01二进制数,不存放具体数据,所以数据安全。 存在误判 当数据量大了以后,二进制向量中存在多位1,那么散列运算很可能会完全冲撞,即不存在的数据 进行存在性判断时,也会因为运算出来的下标位上全是1,被误判为存在。误判问题是布隆过滤器 的核心问题,此问题不可解决,只能尽量优化,减少误判。

优化误判的方法:

  • 二进制向量的长度与误判率负相关
  • 散列函数的数量与误判率负相关

3.布谷鸟过滤器

布谷鸟过滤器是基于布隆过滤器的优化,目的是降低误判。布谷鸟过滤器是基于布隆过滤器的优化,目的是降低误判。

布谷鸟过滤器和布隆过滤器一样,由一个一维数组和一系列hash函数组成,只是其在处理散列冲突时增加了特殊机制,保证了每一位记录的只会是一个数据的存在性标志,规避掉了散列冲突。

例如,输入data1,经过hash1和hash2运算后得到下标为1和2,data1会选择两者中的一个作为自己存在性的标志位。如果后来的数据与data1产生了散列冲突,并且也算选择了要放入下标为1的位置,那么就 会“鸠占鹊巢”,将data1挤走,但是data1不会被丢掉,会跑到自己其它hash函数运算出来的位置,将该 位置作为自己存在性的标志位。如果该位置之前存在数据,同样会“纠缠雀巢”,将原来的数据挤走,被 挤走的数据又继续上面的步骤,以此类推。

3.1.挤兑循环

布谷鸟过滤器存在挤兑循环的问题,即当被挤走的数据一直死循环的执行“鸠占鹊巢”的过程。 例如: data1散列结果为1、2,选择了1 data2散列结果为1、2,选择了2 data3散列结果为1、2,选择了1 data1被挤走,重写选择,自己的hash位,挤走2上面的data2,data2又挤走data3,data3又挤走 data1,陷入死循环.... 挤兑循环出现的概率很低,一般出现在散列函数不佳,算出来的结果大量冲突的情况下。

3.2.扩容机制

当数据多了以后,数组中空位很少时,新数据“鸠占鹊巢”时,会引起一连串的多次的“鸠占鹊巢”,耗时会 指数级别的增加。为了应对这种性能跌落情况,布谷鸟过滤器存在扩容机制,即当单词新数据进入而引 发的全局“鸠占鹊巢”的次数达到阈值后,会触发扩容,扩容后所有老数据会进行rehash,重新找位置。 当然处理散列冲突的最佳机制,其实一直都是hashMap采用的那套思路,在每个hash桶内尽量多的存放 内容。只是布谷鸟过滤器始终只是个数据存在性的记录结构,不可能像hashmap这种真正的数据存储结构一样无限制的在hash桶内增加位置,内存撑不住,而且这约等于记录结构其实就变成了缓存本身。所以布谷鸟过滤器在数组每个位置准备了4个“小座位”,允许4个散列冲突的数据存在一个下标下。

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

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

相关文章

基于控制器软件需求事项进行单元测试和单元测试规范

基于需求事项的单元测试是什么? ​ 大多数汽车行业都遵循 ISO 26262 中定义的标准,这是 ISO 制定的汽车功能安全国际标准。 根据 ISO 26262 标准软件单元测试 (ISO 26262-6-9),单元验证是验证要验证的单元(功能或功能&#xff09…

智能优化算法应用:基于蜣螂优化算法的工程优化案例

智能优化算法应用:基于蜣螂算法的工程优化案例 文章目录智能优化算法应用:基于蜣螂算法的工程优化案例1.蜣螂算法2.压力容器设计问题3.三杆桁架设计问题4.拉压弹簧设计问题5.Matlab代码6.Python代码摘要:本文介绍利用蜣螂搜索算法&#xff0c…

MyBatis框架知识点总结

一、引言1.1 什么是框架?框架:框架使用你的,而不是你在使用框架的。框架让我们提供什么信息,配置信息,数据库连接用户名密码等,你必须提供,还得按照框架要要求的方式提供,否则你就别…

《图机器学习》-Node Embeddings

Node Embeddings一、Graph Representation Learning二、Node Embeddings:Encoder and Decoder三、Random Walk Approaches for Node Embeddings一、Graph Representation Learning 在传统的图机器学习中,依赖于手工特征工程(即由特征工程师去设计节点、…

每日一题:Leetcode54. 螺旋矩阵

文章目录 系列:数组专练 语言:java & go 题目来源:Leetcode54. 螺旋矩阵 难度:中等 考点:边界问题处理 思路和参考答案文章目录题目描述思路java参考代码go参考代码:题目描述 给你一个 m 行 n 列的矩…

力扣sql基础篇(三)

力扣sql基础篇(三) 1 查询结果的质量和占比 1.1 题目内容 1.1.1 基本题目信息 1.1.2 示例输入输出 1.2 示例sql语句 # 把该列置为null的话,它就不会统计了 SELECT query_name,ROUND(sum(rating/position)/count(*),2) quality, ROUND(count(IF(rating<3,rating,null))/c…

【数据结构】—— Java实现双向链表

Java实现双向链表一、链表的概念及结构二、头指针与头结点的异同三、代码实现一、链表的概念及结构 我们在单链表中&#xff0c;有了next指针。这就使得我们查找下一个结点的时间复杂度为O(1)。可是我们要查找的是上一个结点的话&#xff0c;那最坏的时间复杂度就是O(n)了&…

用图记忆C语言中的运算符优先级

运算符优先级以及结合方向的统计表&#xff0c;网上到处可见。本文画了一张图&#xff0c;以便记忆&#xff01; 1. 总体来说优先级 初级运算 > 单目运算 > 双目运算 > 三目运算 > 赋值运算 > 逗号运算 2. 双目细分 算术运算 > 位移运算 > 关系运算 &g…

今年十八,基础过关

目录 前言 第一关&#xff1a;KEY在哪里 再加密一次你就得到key啦~ 猜猜这是经过了多少次加密&#xff1f; 据说MD5加密很安全&#xff0c;真的是么&#xff1f; 种族歧视 HAHA浏览器 key究竟在哪里呢&#xff1f; key又找不到了 冒充登陆用户​编辑 比较数字大小 就不让你…

Linux应用编程---14.UDP服务器、客户端编程

Linux应用编程—14.UDP服务器、客户端编程 ​ 之前有介绍过UDP是一种无连接、尽最大努力交付、面向报文的协议。应用层交给UDP多长的报文&#xff0c;UDP就照样发送。Linux下UDP属于数据报socket。数据报socket流程图如图1所示&#xff1a; 图1 数据报socket流程图 ​ 新引入的…

FourIE:一种最新联合事件抽取SOTA论文解读

Cross-Task Instance Representation Interactions and Label Dependencies for Joint Information Extraction with Graph Convolutional Networks 论文&#xff1a;Cross-Task Instance Representation Interactions and Label Dependencies for Joint Information Extractio…

Vue2的前端路由(vue-router)

一、路由 路由 (英文&#xff1a;router)就是页面地址与组件之间的对应关系 二、路由方式 服务器端路由、前端路由 三、前端路由 前端路由&#xff1a;地址和组件之间的对应关系&#xff0c;即由前端来维护一组路由规则&#xff08;地址和组件之间的对应关系&#xff09;&…

xlsx.utils.sheet_to_json的{ header: 1 }起的作用,header属性的研究

XLSX.utils.sheet_to_json 是为了把excel里面的数据解析出来&#xff0c;这是它的定义&#xff1a; 其中&#xff0c;worksheet表示特定表名的工作表&#xff0c;opts属于可要可不要的参数。 opts也有几种类型&#xff1a; export interface Sheet2JSONOpts extends DateNFOp…

selinux 控制

在某些Linux发行版上&#xff0c;默认情况下启用SELinux&#xff0c;如果不了解SELinux的工作原理以及如何配置它的基本详细信息&#xff0c;则可能会导致一些不必要的问题。一般强烈建议了解了SELinux 之后再去实现它。但是&#xff0c;在了解 SELinux 的实现细节之前&#xf…

由浅入深,详解ViewModel的那些事

Hi&#xff0c;你好 &#x1f603; 引言 关于 ViewModel &#xff0c;Android 开发的小伙伴应该都非常熟悉&#xff0c;无论是新项目还是老项目&#xff0c;基本都会使用到。而 ViewModel 作为 JetPack 核心组件&#xff0c;其本身也更是承担着不可或缺的作用。 因此&#x…

STL list 模拟实现

list 概述 相比于 vector 的连续线性空间&#xff0c;list 采用的是零散的空间&#xff0c;它的好处是每次插入或删除一个元素&#xff0c;就配置或释放一个元素空间。 list 是支持常数时间从容器任何位置插入和移除元素容器&#xff0c;但不支持快速随机访问。list 通常实现…

Linux操作系统之进程间通讯—共享内存与消息队列

文章目录一、共享内存1、共享内存的原理2、共享内存的实现三、消息队列1、消息队列原理2、消息队列实现一、共享内存 1、共享内存的原理 共享内存为多个进程之间共享和传递数据提供了一种有效的方式。共享内存是先在物理内存上申请一块空间&#xff0c;多个进程可以将其映射到…

dp (四) 打家劫舍

打家劫舍(一)_牛客题霸_牛客网 描述 你是一个经验丰富的小偷&#xff0c;准备偷沿街的一排房间&#xff0c;每个房间都存有一定的现金&#xff0c;为了防止被发现&#xff0c;你不能偷相邻的两家&#xff0c;即&#xff0c;如果偷了第一家&#xff0c;就不能再偷第二家&#…

离线和实时

离线和实时 一、数仓基本概念 1. 数据仓库架构 我们在谈数仓之前&#xff0c;为了让大家有直观的认识&#xff0c;先来谈数仓架构&#xff0c;“架构”是什么&#xff1f;这个问题从来就没有一个准确的答案。这里我们引用一段话&#xff1a;在软件行业&#xff0c;一种被普遍…

8种将pdf转化成excel的方法,亲测实用又有效!

PDF 到 Excel 的在线或离线转换工具可帮助您将原始或扫描的 PDF 文件转换为 Excel 格式。将 PDF 转换为 Excel 主要是为了获得可编辑的 Excel 文件或满足其他目标&#xff1b; 通过消除容易出错的手动复制粘贴来保持数据准确性。在需要使用 Excel 格式的大量 PDF 数据时节省时…