布隆过滤器Redis缓存穿透雪崩击穿热点key
目录
- 布隆过滤器
- Redis 缓存
- 穿透
- 雪崩
- 击穿
- 热点KEY
布隆过滤器
布隆过滤器(判断某个key一定不存在)
- 本质上布隆过滤器是一种数据结构,比较巧妙的概率型数据结构
- 特点是高效地插入和查询,可以用来告诉你 “某样东西一定不存在或者可能存在”
- 相比于传统的 List、Set、Map 等数据结构,它更高效、占用空间更少,但是缺点是其返回的结果是概率性的,而不是确切的
布隆过滤器的使用:
- 布隆过滤器在NoSQL数据库领域中应用的非常广泛
- 当用户来查询某一个row时,可以先通过内存中的布隆过滤器过滤掉大量不存在的row请求,然后去再磁盘进行查询
- 布隆过滤器说某个值不存在时,那肯定就是不存在,可以显著降低数据库IO请求数量
应用场景
- 场景1(给用户推荐新闻)
- 当用户看过的新闻,肯定会被过滤掉,对于没有看多的新闻,可能会过滤极少的一部分(误判)
- 这样可以完全保证推送给用户的新闻都是无重复的
- 场景2(爬虫url去重)
- 在爬虫系统中,我们需要对url去重,已经爬取的页面不再爬取
- 当url高达几千万时,如果一个集合去装下这些URL地址非常浪费空间
- 使用布隆过滤器可以大幅降低去重存储消耗,只不过也会使爬虫系统错过少量页面
布隆过滤器原理
添加:值到布隆过滤器
- 向布隆过滤器添加key,会使用 f、g、h hash函数对key算出一个整数索引,然后对长度取余
- 每个hash函数都会算出一个不同的位置,把算出的位置都设置成1就完成了布隆过滤器添加过程
查询:布隆过滤器值
- 当查询某个key时,先用hash函数算出一个整数索引,然后对长度取余
- 当你有一个不为1时肯定不存在这个key,当全部都为1时可能有这个key
- 这样内存中的布隆过滤器过滤掉大量不存在的row请求,然后去再磁盘进行查询,减少IO操作
删除:不支持
- 目前我们知道布隆过滤器可以支持 add 和 isExist 操作
- 如何解决这个问题,答案是计数删除,但是计数删除需要存储一个数值,而不是原先的 bit 位,会增大占用的内存大小
- 增加一个值就是将对应索引槽上存储的值加一,删除则是减一,判断是否存在则是看值是否大于0
Redis 缓存
客户端请求在缓存层命中直接返回内容,如果Miss就去存储层读取,存储层读取到数据再写入缓存层,然后再返回客户端。
优点:
- 加速读写效率
- 降低后端负载
- 减少存储层压力
缺点:
- 数据不能保证一致性
- 代码维护成本和运维成本
主从复制
- 主节点数据更新后根据配置和策略,自动同步到备节点的master/slaver的机制
- 主节点负责写数据,从节点负责读数据
- 主节点定期把数据同步到从节点保证数据的一致性
优点:
- 读写分离
- 容灾恢复
缺点:
- 主从复制,若主节点出现问题,则不能提供服务,需要人工修改配置将从变主
- 主从复制主节点的写能力单一,能力有限
- 单机节点的存储能力也有限
穿透
定义
- 缓存穿透是指查询一个一定不存在的数据,由于缓存不命中,接着查询数据库也无法查询出结果
- 虽然也不会写入到缓存中,但是这将会导致每个查询都会去请求数据库,造成缓存穿透
- 在查询一个不存在的数据时,在缓存层查不到数据则会去访问存储层,且返回的空数据也不会写入缓存层。这将导致不存在的数据每次查询都必定会到存储层查询,缓存层失去了存在的意义
- 当大量恶意查询不存在数据时,可能因为频繁访问导致数据库宕机
解决方法 :布隆过滤
- 对所有可能查询的参数以hash形式存储,在控制层先进行校验,不符合则丢弃,将所有可能存在的数据哈希到一个足够发的 bigmap 中
- 一个一定不存在的数据会被该 bigmap 拦截掉,从而避免对底层存储系统造成查询压力
- 【推荐】如果一个查询返回的数据为空(无论数据为空,或是系统故障),将空结果进行缓存,设置一个最长不超过五分钟的过期时间。这样过期时间内查询的时候就会直接在缓存层获取,并直接返回null
雪崩
定义
- 缓存雪崩是指,由于缓存层承载着大量请求,有效的保护了存储层,但是如果缓存层由于某些原因整体不能提供服务
- 于是所有的请求都会达到存储层,存储层的调用量会暴增,造成存储层也会挂掉的情况
解决方法
- 哨兵
- 主服务器宕机,从服务器会主动切换成主服务器
- 事前:redis 高可用,主从+哨兵,redis cluster,避免全盘崩溃。
- 事中:本地 ehcache 缓存 + hystrix 限流&降级,避免 MySQL 被打死。
- 事后:redis 持久化,一旦重启,自动从磁盘上加载数据,快速恢复缓存数据。
击穿
定义:
- 缓存击穿,就是说某个 key 非常热点,访问非常频繁,处于集中式高并发访问的情况
- 当这个 key 在失效的瞬间,大量的请求就击穿了缓存,直接请求数据库,就像是在一道屏障上凿开了一个洞
解决方法
- 解决方式也很简单,可以将热点数据设置为永远不过期
- 或者基于 redis or zookeeper 实现互斥锁,等待第一个请求构建完缓存之后,再释放锁,进而其它请求才能通过该 key 访问数据
热点KEY
热点问题产生的原因大致有以下两种:
- 用户消费的数据远大于生产的数据(热卖商品、热点新闻、热点评论、明星直播)
在日常工作生活中一些突发的的事件,例如:
双十一期间某些热门商品的降价促销,当这其中的某一件商品被数万次点击浏览或者购买时,会形成一个较大的需求量,这种情况下就会造成热点问题。
同理,被大量刊发、浏览的热点新闻、热点评论、明星直播等,这些典型的读多写少的场景也会产生热点问题
- 请求分片集中,超过单 Server 的性能极限
在服务端读数据进行访问时,往往会对数据进行分片切分
此过程中会在某一主机 Server 上对相应的 Key 进行访问,当访问超过 Server 极限时,就会导致热点 Key 问题的产生
热点问题的危害
• 流量集中,达到物理网卡上限。
• 请求过多,缓存分片服务被打垮。
• DB 击穿,引起业务雪崩。
如何解决热点key的问题
利用二级缓存
比如利用 ehcache ,或者一个 HashMap 都可以。在你发现热key以后,把热key加载到系统的JVM中。
针对这种热key请求,会直接从jvm中取,而不会走到redis层。
假设此时有十万个针对同一个key的请求过来,如果没有本地缓存,这十万个请求就直接怼到同一台redis上了。
现在假设,你的应用层有50台机器,OK,你也有jvm缓存了。这十万个请求平均分散开来,每个机器有2000个请求,会从JVM中取到value值,然后返回数据。避免了十万个请求怼到同一台redis上的情形。
(2)备份热key
这个方案也很简单。不要让key走到同一台redis上不就行了。我们把这个key,在多个redis上都存一份不就好了。接下来,有热key请求进来的时候,我们就在有备份的redis上随机选取一台,进行访问取值,返回数据。
- 来自于参考博客
- 参考博客链接
布隆过滤器Redis缓存穿透雪崩击穿热点key相关推荐
- REDIS13_缓存雪崩、缓存穿透、基于布隆过滤器解决缓存穿透的问题、缓存击穿、基于缓存击穿工作实际案例
文章目录 ①. 缓存雪崩 ②. 缓存穿透 ③. 在centos7下布隆过滤器2种安装方式 ④. 缓存击穿 ⑤. 高并发的淘宝聚划算案例落地 ①. 缓存雪崩 ①. 问题的产生:缓存雪崩是指缓存数据大批量 ...
- 布隆过滤器解决缓存穿透_缓冲穿透/缓存击穿/缓存雪崩等问题解决办法
----------------------[感谢小昭提供的图片] 1.缓存穿透 定义:请求查询数据库中压根就不存在的数据,每次请求直接打在DB上,这种查询查询不存在数据的现象称为缓存穿透 穿透带来的 ...
- Redis缓存雪崩、缓存穿透、热点Key解决方案和分析
转载自 https://blog.csdn.net/wang0112233/article/details/79558612 https://www.sohu.com/a/230787856_231 ...
- Redis缓存雪崩、缓存穿透、热点Key
我们通常使用 缓存 + 过期时间的策略来帮助我们加速接口的访问速度,减少了后端负载,同时保证功能的更新. 1.缓存穿透 缓存系统,按照KEY去查询VALUE,当KEY对应的VALUE一定不存在的时候并 ...
- 手写布隆过滤器防止缓存穿透
什么是布隆过滤器? 布隆过滤器(Bloom Filter)是1970年由布隆提出的.它实际上是一个很长的二进制向量和一系列随机映射函数.布隆过滤器可以用于检索一个元素是否在一个集合中.它的优点是空间效 ...
- redis缓存穿透雪崩击穿
1.缓存穿透 查询1条记录--->redis--->存在--->返回 查询1条记录--->redis--->不存在--->数据库--->redis---> ...
- 清空缓存的命令_布隆过滤器应用——解决Redis缓存穿透问题
1. 布隆过滤器 简要介绍布隆过滤器的概念和特点,详细知识请参考几篇参考文献或其它文章. 1.1 概念 简单点说,布隆过滤器本质是一个位数组. 当一个元素加入过滤器时,使用多个hash函数对元素求值, ...
- Redis实战(四):redis的消息订阅、pipeline、事务、modules、布隆过滤器、缓存LRU
啤酒理论 Buffer机制,减少没必要的来回调用 前置知识 只要和redis建立了连接,发送字符串,就能交互 管道 发布 / 订阅 help @pubsub 发送者 订阅者 PSUBSCRIBE pa ...
- Redis 缓存穿透、缓存击穿和缓存雪崩
目录 Redis 缓存穿透.缓存击穿和缓存雪崩 Redis 缓存穿透(查不到) Redis缓存穿透的解决方案 方案一:接口校验 方案二:缓存空对象 方案三:布隆过滤器 Redis 缓存击穿 Redis ...
最新文章
- 百度谷歌等联合推出机器学习基准 加速AI软硬件发展
- 做好网站SEO优化都需要坚持什么?
- 微信小程序使用高德地图API获取准确定位地址描述
- DCMTK:创建大型(> 4 GB)增强型CT对象的测试
- Gh0st源码学习(三)生成DLL和DAT文件
- 前端学习(3288):object.define
- oracle数据库全数据库名,Oracle数据库中的 数据库域名、数据库名、全局数据库名、SID、数据库实例名、服务名 解释...
- 明晚8点直播丨 Oracle RMAN 单实例异机迁移恢复(版本:11gR2)
- vscode之npm不是内部活外部命令
- iOS shell脚本打包
- IScroll5 参数说明和调用方法
- 2021年“泰迪杯”数据分析技能赛A题任务1:数据分析与预测
- dex2jar 和 jd-gui
- 瀑布模型,快速原型模型,增量模型,螺旋模型以及敏捷开发模型的相关概念
- 没有电脑基础能学计算机专业吗,没有绘画基础想学电脑绘画该怎么学?
- can协议crc计算_CAN协议教程|CAN报文分析
- maven clean Process terminated
- 飞鱼手机短信语音验证码接收平台API接口例子
- 双鱼林php学生信息管理系统,双鱼林基于ThinkPHP5图书管理系统demo v1.0
- 安卓 sdk 离线包_百度离线ocr识别开发sdk包
热门文章
- 计算机教师的名言是,教师名言
- 一秒钟世界上会发生多少事_1秒钟世界上会发生多少事?答案超乎你的想象……...
- Keras之DNN:基于Keras(sigmoid+linear+mse+predict)利用DNN实现回归预测——DIY多分类数据集预测新数据点
- Algorithm之RS:RS常用的一些库
- 7.1 TensorFlow笔记(基础篇):加载数据之预加载数据与填充数据
- WRF,WPS,WRF-Chem安装及编译步骤及bug总结(1)
- LaTeX写作技术规范
- 通过构造函数来创建新对象
- Sphinx-安装和配置
- 【工具】模板引擎 Velocity