redis缓存穿透和缓存击穿(五分钟系列之Redis大规模数据存储简述)

本文目录
- 五分钟系列之Redis大规模数据存储简述
- 该怎么解决 Redis 缓存穿透和缓存雪崩问题
- redis缓存机制一般会影响软件的哪些功能
- redis缓存穿透,频繁查询db,怎么解决
- 缓存穿透和缓存击穿有什么区别
- 什么是缓存穿透
五分钟系列之Redis大规模数据存储简述
互联网场景下面临的主要技术问题之一是高并发大数据量。为了提高性能保护数据库通常会在数据库之上加一层缓存。目前常用的缓存是Redis,那么Redis如何存储大规模数据?如何将数据库的数据同步到Redis?Redis缓存设计要注意哪些问题?
Redis大规模数据存储通过集群实现。目前常见的集群方式有三种方案。
第一种使用Redis自带的集群技术Redis cluster。
第二种是使用代理方式,在客户端与Redis节点之间加一层代理服务目前开源的实现有codis和twemproxy。
第三种是定制客户端实现,在客户端实现节点的寻址功能。
数据库数据同步到缓存目前常见的方式有四种方式。
方式一在业务应用服务中实现。在修改数据库的同时更新缓存。
方式二通过消息队列异步更新。在业务中更新数据后发送消息,消息消费者订阅消息对缓存进行更新。
方式三通过定时任务更新。通过定时任务监控数据变更,同步更新数据到缓存。
方式三通过数据库Binlog更新。通过一些开源中间间如canal订阅数据库日志更新,解析日志然后对解析后的日志执行缓存更新操作。
缓存设计需要注意下面四个问题。
数据一致性问题。
数据库和缓存数据保持一致。目前常见的四种缓存更新模式。cache aside、read through 、write through、write behind caching。
缓存穿透问题。
目前解决缓存击穿的思路主要是过滤无效请求。如通过键的规则校验过滤恶意请求,布隆过滤器过滤无效请求。其次是缓存空结果。
缓存击穿问题。
目前解决缓存击穿的思路是对请求加全局锁,还有就是对即将过期的数据进行主动刷新。
缓存雪崩问题。
缓存雪崩目前常见的思路是设置缓存过期时间时随机设置失效时间避免缓存同时失效。还有缓存存储时划分更小的缓存区间按区间设置缓存失效时间。
缓存的使用是一个整体方案分层分布式设计。上述只是整体性描述,实际过程中的细节很多也很复杂。
该怎么解决 Redis 缓存穿透和缓存雪崩问题
缓存雪崩: 由于缓存层承载着大量请求,有效地 保护了存储层,但是如果缓存层由于某些原因不能提供服务,比如 Redis 节点挂掉了,热点 key 全部失效了,在这些情况下,所有的请求都会直接请求到数据库,可能会造成数据库宕机的情况。
预防和解决缓存雪崩问题,可以从以下三个方面进行着手:
1、使用 Redis 高可用架构:使用 Redis 集群来保证 Redis 服务不会挂掉
2、缓存时间不一致: 给缓存的失效时间,加上一个随机值,避免集体失效
3、限流降级策略:有一定的备案,比如个性推荐服务不可用了,换成热点数据推荐服务
缓存穿透: 缓存穿透是指查询一个根本不存在的数据,这样的数据肯定不在缓存中,这会导致请求全部落到数据库上,有可能出现数据库宕机的情况。
预防和解决缓存穿透问题,可以考虑以下两种方法:
1、缓存空对象: 将空值缓存起来,但是这样就有一个问题,大量无效的空值将占用空间,非常浪费。
2、布隆过滤器拦截: 将所有可能的查询key 先映射到布隆过滤器中,查询时先判断key是否存在布隆过滤器中,存在才继续向下执行,如果不存在,则直接返回。布隆过滤器有一定的误判,所以需要你的业务允许一定的容错性。
redis缓存机制一般会影响软件的哪些功能
Redis缓存机制主要作用在于提高数据访问速度、减轻数据库压力、提高系统性能。但是,使用Redis缓存机制可能会影响软件的以下功能:
数据一致性:由于Redis缓存中的数据与数据库中的数据可能存在不一致的情况,这会导致用户在查询数据时看到不一致的结果。
数据过期:缓存数据有过期时间,如果缓存数据过期,需要重新从数据库中获取,这可能会影响查询速度。
数据持久化:Redis提供了RDB和AOF两种持久化策略,但在某些情况下,如意外宕机等,可能会导致缓存数据的丢失。
内存限制:Redis是基于内存的存储系统,当缓存数据量过大时,可能会消耗大量内存资源,影响软件其他功能的性能。
缓存穿透、缓存击穿和缓存雪崩:这些现象可能导致缓存系统承受较大压力,进而影响整个软件的性能和稳定性。
分布式环境:在分布式环境下,需要考虑缓存数据的同步和一致性问题,否则可能会导致软件功能异常。
缓存维护:需要定期对缓存进行维护,如清除无用的缓存数据,避免缓存数据过多影响系统性能。
在使用Redis缓存机制时,需要充分考虑这些可能影响软件功能的因素,并采取相应的措施进行优化。
redis缓存穿透,频繁查询db,怎么解决
先来说一下缓存穿透的概念:
缓存穿透是指查询的key不存在,从而缓存查询不到而查询了数据库。
解决方法:
把所有存在的key都存到另外一个存储的Set集合里,查询时可以先查询key是否存在。
干脆简单一些,给查询不到的key也加一个标识空值的Value,这样就不会去查询数据库了,比如场景为查询省市区街道对应的移动营业厅,若是某街道确实没有移动营业厅,key规则不变,value可以设置为"0"等无意义的字符。当然此种方案要保证缓存集群的高可用。
这些Key可能不是永远不存在,所以需要根据业务场景来设置过期时间。
缓存穿透和缓存击穿有什么区别
首先呢,这两种还是有区别,一个是缓存当中的一种穿透就是承受的压力过大,另外一种是直接穿透。
什么是缓存穿透
缓存穿透的概念很简单,用户想要查询一个数据,发现redis内存数据库没有,也就是缓存没有命中,于是向持久层数据库查询。
发现也没有,于是本次查询失败。当用户很多的时候,缓存都没有命中,于是都去请求了持久层数据库。
这会给持久层数据库造成很大的压力,这时候就相当于出现了缓存穿透。
解决方案
1、对请求参数做校验,例如可以用正则;
2、缓存空对象, 当存储层不命中后,即使返回的空对象也将其缓存起来,同时会设置一个过期时间,之后再访问这个数据将会从缓存中获取,保护了后端数据源;
但是这种方法会存在两个问题:
2.1、 如果空值能够被缓存起来,这就意味着缓存需要更多的空间存储更多的键,因为这当中可能会有很多的空值的键;
2.2、即使对空值设置了过期时间,还是会存在缓存层和存储层的数据会有一段时间窗口的不一致,这对于需要保持一致性的业务会有影响。

更多文章:
sqlite格式的视频怎么打开(.sqlite是什么文件,用什么工具打开)
2026年11月7日 05:30
element ui面试题(用element-ui ELDialog和ELTable遇见的坑)
2026年11月7日 04:40
中文自动翻译成英语的输入法(有没有一种输入法能将打出来的中文自动变成英文)
2026年11月7日 02:10
equals to(为什么有些英文句子要用的是“equals to that of” 这个that和of之间还可以加名词吗)
2026年11月7日 01:50
default values(电脑开机后出现all settings was reset to default values.)
2026年11月7日 01:20
structured reviewing翻译(软件测试的英文翻译)
2026年11月7日 00:50



