Redis学习笔记(五)缓存穿透和缓存击穿

本文涉及的产品
云原生内存数据库 Tair,内存型 2GB
云数据库 Redis 版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: Redis学习笔记(五)缓存穿透和缓存击穿

一、缓存穿透


当客户端查询某个key时,先查询redis,如果不存在出于容错考虑会再查询数据库。如果有大量不存在的key请求时,大量请求会被映射到底层存储层,造成数据库压力过大,这就是缓存穿透。


image.png

要解决缓存穿透问题,可以有两种方案


缓存穿透方案一:布隆过滤器


首先了解一下布隆过滤器的原理


布隆过滤器是由位图(bitmap)和哈希函数组成。如下图所示,不同key在经过多个hash函数后,映射到位图的一定位置(哈希值对数组长度取模),则该位的数值设置为1,这样就完成了一次add操作(bf.add)。


判断元素是否存在时,跟add操作一样,计算hash值,如果所有位置的值都为1,则认为元素存在。


image.png

误判的场景


假如key1和key2存在于缓存中,key3不存在于缓存中,但是当key3经过hash计算后,发现数组中值恰好被key1和key2设置为1,则会被误判为key3也存在于缓存中,所以布隆过滤器是存在一定概率误判的情况的。


所以布隆过滤器中如果存在,那么可能存在,也可能不存在,如果布隆过滤器中不存在,那一定不存在。需要根据业务及经验,设置合理的参数,以平衡准确率和内存空间。


image.png


布隆过滤器的创建提供了三个参数:


key:键值


error_rate:期望错误率,错误率越小,需要的存储空间越大


capacity:容量,元素数量超过容量时,误判率会上升


默认错误率为0.01,容量为100


bf.add:会创建默认的布隆过滤器(即错误率为0.01,容量为100)


bf.reserve:可以指定错误率和容量


布隆过滤器用于解决缓存穿透


把已经存在的数据存储到布隆过滤器中,如果有请求查询时,发现布隆过滤器中不存在,则直接返回,不继续查询缓存和数据库。如果存在,则查询缓存(因为有误判的情况,缓存也可能不存在,不存在时继续查询数据库)


布隆过滤器的基本操作命令

#添加单个元素
bf.add {key} {item}
#添加多个元素
bf.add {key} {item} [item ...]
#判断某个元素是否存在
bf.exists {key} {item}
#判断多个元素是否存在
bf.mexists {key} {item} [item ...]
#指定错误率和容量
bf.reserve {key} {error_rate} {capacity} [EXPANSION expansion]


缓存穿透方案二:缓存空对象


当redis不存在时,查询数据库,如果数据库也不存在,将该key存储到redis,value存储为空值,当下次有相同key请求时不会继续查询数据库,这样就需要由大量的空间来存储这些不存在的key。


image.png


二、缓存击穿


缓存击穿是指当某个key因为热点问题被超高并发访问时导致缓存失效而加载数据库的一种现象。


通常的做法时加锁-setnx,当缓存失效时尝试获取锁,获取锁成功则访问数据库,否则就重试get缓存。


关于redis的分布式锁参考另一篇博客:Redis学习笔记(二)分布式锁


相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
13天前
|
缓存 NoSQL Redis
【Azure Redis 缓存】Redission客户端连接Azure:客户端出现 Unable to send PING command over channel
【Azure Redis 缓存】Redission客户端连接Azure:客户端出现 Unable to send PING command over channel
|
10天前
|
缓存 NoSQL Java
Redis深度解析:解锁高性能缓存的终极武器,让你的应用飞起来
【8月更文挑战第29天】本文从基本概念入手,通过实战示例、原理解析和高级使用技巧,全面讲解Redis这一高性能键值对数据库。Redis基于内存存储,支持多种数据结构,如字符串、列表和哈希表等,常用于数据库、缓存及消息队列。文中详细介绍了如何在Spring Boot项目中集成Redis,并展示了其工作原理、缓存实现方法及高级特性,如事务、发布/订阅、Lua脚本和集群等,帮助读者从入门到精通Redis,大幅提升应用性能与可扩展性。
24 0
|
4天前
|
缓存 NoSQL 关系型数据库
MySQL与Redis缓存一致性的实现与挑战
在现代软件开发中,MySQL作为关系型数据库管理系统,广泛应用于数据存储;而Redis则以其高性能的内存数据结构存储特性,常被用作缓存层来提升数据访问速度。然而,当MySQL与Redis结合使用时,确保两者之间的数据一致性成为了一个重要且复杂的挑战。本文将从技术角度分享MySQL与Redis缓存一致性的实现方法及其面临的挑战。
19 2
|
7天前
|
Java UED Maven
紧跟技术潮流:手把手教你构建响应式Vaadin应用,让用户体验无缝接轨!
【8月更文挑战第31天】本文从零开始,详细介绍如何使用强大的Java框架Vaadin构建流畅且响应式的Web应用程序。首先,确保安装JDK 1.8+、Maven 3.3.9+及IDE。接着,创建Maven项目并添加Vaadin依赖。然后,通过继承`UI`类创建主界面,并定义自定义主题与样式。利用Vaadin的响应式布局组件,如`HorizontalLayout`和`VerticalLayout`,实现多设备兼容性。
14 0
|
10天前
|
缓存 NoSQL Java
惊!Spring Boot遇上Redis,竟开启了一场缓存实战的革命!
【8月更文挑战第29天】在互联网时代,数据的高速读写至关重要。Spring Boot凭借简洁高效的特点广受开发者喜爱,而Redis作为高性能内存数据库,在缓存和消息队列领域表现出色。本文通过电商平台商品推荐系统的实战案例,详细介绍如何在Spring Boot项目中整合Redis,提升系统响应速度和用户体验。
36 0
|
13天前
|
缓存 NoSQL Linux
【Azure Redis 缓存】应用中出现连接Redis服务错误(production.ERROR: Connection refused)的排查步骤
【Azure Redis 缓存】应用中出现连接Redis服务错误(production.ERROR: Connection refused)的排查步骤
|
13天前
|
缓存 NoSQL 网络安全
【Azure Redis 缓存】使用开源工具redis-copy时遇见6379端口无法连接到Redis服务器的问题
【Azure Redis 缓存】使用开源工具redis-copy时遇见6379端口无法连接到Redis服务器的问题
|
13天前
|
缓存 NoSQL 网络协议
【Azure Redis 缓存】Azure Redis 遇见的连接不上问题和数据丢失的情况解答
【Azure Redis 缓存】Azure Redis 遇见的连接不上问题和数据丢失的情况解答
|
13天前
|
缓存 NoSQL 安全
【Azure Redis 缓存】Azure Redis 4.0 被扫描到漏洞,如何修补呢?
【Azure Redis 缓存】Azure Redis 4.0 被扫描到漏洞,如何修补呢?
|
13天前
|
存储 缓存 NoSQL
【Azure Redis 缓存】对于Azure Redis 从 Redis 4 升级到 Redis 6 的一些疑问
【Azure Redis 缓存】对于Azure Redis 从 Redis 4 升级到 Redis 6 的一些疑问
下一篇
DDNS