Redis 简述
在介绍 Redis 之前,我想先简单介绍一下 MySQL ;
- MySQL是一种开源的关系型数据库管理系统,以其高性能、可靠性和易用性而广泛应用于各种规模的应用程序和网站。
- 作为关系型数据库管理系统,MySQL使用表格来组织和存储数据。用户可以通过SQL语言来进行数据的查询、插入、更新和删除等操作。
- MySQL支持标准的SQL语法,并提供了丰富的功能和特性,如事务处理、索引、视图、存储过程、触发器等。
那 Redis 和我们所认知的传统sql数据库有什么区别呢?
- 我们知道,Redis是NOSQL 的,它 是一个开源的内存数据结构存储系统,也被称为键值存储数据库。
- Redis支持多种数据结构,包括字符串(String)、哈希(Hash)、列表(List)、集合(Set)、有序集合(Sorted Set)等。
- 与传统的sql数据库相比,Redis将数据存储在内存中,因此它具有非常快速的读写速度,但同时它的数据容量也受限于内存大小。
Redis作为一种常用的缓存技术,适合放一些频繁使用,比较热门的数据,因为是放在内存中,读写速度都非常快。
我们很少单独使用Redis,在实际应用中,通常将 MySQL 和 Redis 结合使用,充分发挥它们各自的优势。比如,可以将 MySQL 中的热门数据或查询结果缓存到 Redis 中,以提高数据访问速度和响应性能;
Redis的常见应用场景:
- 缓存 MySQL 查询结果:当查询结果较为稳定且查询频率较高时,可以将查询结果缓存到 Redis 中,下次查询时直接从 Redis 中获取,避免重复查询 MySQL 数据库。
- 提高访问速度:将 MySQL 中的热门数据或高频访问的数据缓存到 Redis 中,以加快数据访问速度和响应性能。
- 实现分布式锁:通过 Redis 的分布式锁机制,实现对 MySQL 数据库的并发访问控制,避免出现多个线程同时操作同一条记录的情况。
- 存储会话信息:将用户会话信息存储到 Redis 中,以提高网站的性能和可扩展性。
- 存储计数器和排行榜等数据:将 Redis 中的计数器、排行榜等数据存储到 MySQL 中,以保证数据的持久化和可靠性。
基于上述分析,我们可以知道,Redis常作为高并发场景下的数据缓存,而在高并发环境下,大量的请求同时涌入系统,如果没有合理的处理措施,可能会造成系统资源的竞争和瓶颈,导致性能下降甚至系统崩溃。
下面就来介绍一下高并发场景下常见的三种挑战:缓存穿透,缓存雪崩,缓存击穿;
缓存穿透
我们知道,Redis大部分情况都是通过Key查询value,如果请求的key是不存在Redis中的,由于缓存中没有,那么请求就会都打到数据库上
缓存穿透指的是查询一个不存在的数据(key不存在Redis中),缓存中不存在,大量请求就会都打到数据库上,从而导致数据库瞬间压力过大,甚至宕机。
这种情况一般是由于黑客攻击或者恶意用户攻击而造成的。
缓存穿透的应对策略
-
对于查询结果为空的情况,也将其缓存起来,但是过期时间要设置得较短。
- 额外的内存消耗;对于随机的恶意key,此方法无效
-
对于无效请求,如请求参数不合法等,可以进行拦截和过滤。
- 存在合法的参数,但是依然key不存在的情况
-
布隆过滤
- 布隆过滤器本质上是哈希思想,可能存在哈希冲突,即会出现误判的情况
缓存雪崩
缓存雪崩是指在某个时间段内,大量缓存失效或同时过期,导致所有的请求都直接访问数据库,从而造成数据库负载激增,甚至引发系统崩溃的情况。
同一时间大规模的key失效(缓存雪崩)的原因分析:
- 相同的过期时间:大量缓存数据设置了相同的过期时间导致同时失效,大量请求直接访问数据库。
- 缓存服务器故障:如果缓存服务器发生故障或宕机,导致所有请求无法命中缓存,也会直接访问数据库,造成数据库压力过大。
- 缓存层容量限制:如果缓存层的容量不足以存储需要缓存的数据量,就会导致缓存数据频繁失效,进而引发缓存雪崩。
缓存雪崩的应对策略
- 设置合理的缓存过期时间:避免大量缓存同时失效,可以将缓存的过期时间设置为随机值,或者通过引入缓存预热机制来分散缓存过期的时间点。
- 实施多级缓存架构:引入多级缓存架构,将热点数据存储在内存中的缓存中,而将相对冷门的数据存储在其他缓存或持久化存储中,提高缓存的命中率。
- 分散热点数据:将热点数据分散到不同的缓存节点或者使用分布式缓存,避免热点数据集中在同一缓存节点上,减少缓存失效的风险。
- 引入限流和降级策略:当缓存失效导致大量请求直接访问数据库时,可以通过限流策略控制数据库的并发访问量,同时考虑实施降级策略,如返回默认值或错误提示,保证系统的可用性。
缓存击穿
缓存击穿也叫热点Key问题,是指一个高并发并且缓存重建业务较复杂的key突然失效了,导致大量请求直接访问后端数据库,从而造成数据库压力过大,甚至引起数据库崩溃的情况。
注意区分缓存雪崩与缓存击穿
- 缓存雪崩:大量key同时失效
- 缓存击穿:一个热点key突然失效
缓存击穿的应对策略
-
设置热点数据永不过期:对于一些非常热门的数据项,可以将其缓存设置为永不过期,确保即使缓存失效,也能够快速重新加载到缓存中,避免大量请求直接访问数据库。
- 如果热点数据更新频率较低,可能导致缓存中的数据与实际数据不一致
-
加锁或互斥机制:当缓存失效时,可以使用加锁或互斥机制,只允许一个线程去加载数据到缓存中,其他线程等待该线程完成后再从缓存中获取数据,避免多个线程同时访问数据库。
- 可能会有死锁问题的发生,如果加锁或互斥机制实现不当,可能导致性能瓶颈。
-
引入限流机制:通过限制并发请求的数量,控制数据库的访问压力,可以使用技术手段如线程池、信号量等来实现限流。
- 如果限流策略设置不当,可能会导致正常请求被拒绝,影响系统的可用性。