redis是AP的还是CP的?
Redis以其高性能、高可扩展性和高可用性而著称。在一致性模型方面,Redis采用最终一致性策略,这意味着尽管在某一时刻读取的数据可能并非最新,但系统最终会确保所有数据达到一致状态。
Redis无法提供强一致性保障,主要原因在于其分布式设计中采用了异步复制机制。这一机制导致节点之间可能存在数据同步延迟与不一致的情况。
具体而言,当某个节点的数据发生变更时,Redis会将修改操作发送至其他节点进行同步。然而,由于网络传输延迟等因素,这些操作未必能立即被其他节点接收并执行,从而引发节点间数据不一致的问题。
redis的 高性能、高可扩展性和高可用性 体现在哪儿?
一
Redis 的核心网络模型
Redis 的核心网络模型一直是一个典型的单 Reactor 模型:利用 epoll/select/kqueue 等多路复用技术,在单线程的事件循环中不断去处理事件(客户端请求),最后回写响应数据到客户端:
介绍一下Redis的集群模式?
集群模式主要包括以下几种:主从复制(Master-Slave Replication)、哨兵模式(Sentinel)以及Redis Cluster模式。
三种集群模式的优缺点
1. 主从复制模式
-
优点:
-
支持读写分离,master负责写操作,slave负责读操作,能提升读性能。
-
数据备份,slave可作为master的副本,master故障时可手动切换到slave。
-
-
缺点:
-
master故障后需手动切换到slave,可能导致服务短暂中断。
-
slave数据通过异步同步,可能出现数据不一致的情况。
-
不支持自动故障转移。
-
2. 哨兵模式
-
优点:
-
支持自动故障转移,当master故障时,哨兵会自动选举一个slave升级为master。
-
可监控master和slave的状态,提供更高的可用性。
-
-
缺点:
-
部署较复杂,需要额外配置哨兵节点。
-
哨兵本身可能成为单点故障,需部署多个哨兵以提高可靠性。
-
写操作仍集中在master上,存在写性能瓶颈。
-
3. Cluster模式
-
优点:
-
支持水平扩展,通过增加节点提升性能和存储容量。
-
数据自动分片,分散存储在多个节点上。
-
支持自动故障转移,节点故障时集群自动调整。
-
-
缺点:
-
部署和管理复杂。
-
客户端需支持Cluster协议。
-
某些操作(如多键事务)在Cluster模式下受限。
-
表格对比
模式 | 优点 | 缺点 | 使用场景 | 可能遇到的问题 |
---|---|---|---|---|
主从复制 | 1. 读写分离,提高读性能 2. 数据备份 | 1. 手动故障转移 2. 数据可能不一致 3. 无法自动故障转移 | 1. 对数据一致性要求不高 2. 需要读写分离 | 1. master故障后服务中断 2. slave同步延迟导致数据不一致 |
哨兵模式 | 1. 自动故障转移 2. 监控master和slave状态,提供高可用性 | 1. 部署复杂 2. 哨兵可能成为单点故障 3. 写性能瓶颈 | 1. 需要高可用性,自动故障转移 2. 对写性能要求不高,读写分离 | 1. 哨兵配置错误导致故障转移失败 2. 哨兵通信问题导致脑裂 |
Cluster模式 | 1. 水平扩展,提高性能和容量 2. 自动分片 3. 自动故障转移 | 1. 部署和管理复杂 2. 客户端需支持cluster协议 3. 某些操作受限 | 1. 需要高性能、高容量、水平扩展 2. 对数据分片和自动故障转移有要求 | 1. 数据倾斜,节点负载不均 2. 节点间通信延迟影响性能 3. 客户端兼容性问题 |
二.
redis的 热key
通过识别热key、优化访问策略、分片数据、限流保护、优化数据结构、定期更新以及加强监控,可以有效缓解Redis热key问题,提升系统的稳定性和性能。
1. 识别热key
首先需要找出哪些key是热key,常用的方法包括:
-
使用Redis自带的MONITOR命令实时监控访问情况,或在Redis 4.0.3及以上版本中使用HOTKEYS功能识别热key。
-
通过OBJECT FREQ命令查看某个key的访问频率。
-
在应用层通过埋点或日志分析,统计高频访问的key。
缓存预热:在系统启动或低峰期,提前将热key的数据加载到缓存中,避免高峰期集中访问。
本地缓存 Caffeine 放到本地缓存中,在应用层引入本地缓存(如Guava Cache、Caffeine等),将热key的数据存储在内存中,减少对Redis的直接请求。
读写分离:对于读多写少的热key,可以将其数据复制到多个Redis实例,实现读请求的负载均衡。
优化数据结构 热key 拆分多个子key 使用Redis Cluster模式,通过哈希分片自动将数据分配到不同节点,降低单个节点的负载。
限流与熔断 热key的访问设置限流,限制并发请求数量。
监控和报警
-
实时监控Redis的性能指标,如CPU使用率、内存使用率和命令执行时间。
-
设置告警机制,当检测到热key导致性能异常时,及时通知相关人员处理。
redis的 big key
Redis雪崩 击穿 穿透
-
缓存雪崩:大量缓存同时失效,导致数据库压力激增。
-
解决:错峰过期、持久化、缓存预热、降级策略。
-
-
缓存击穿:热点key失效,导致大量请求打到数据库。
-
解决:永不过期、互斥锁、后台更新。
-
-
缓存穿透:查询不存在数据,缓存无法命中,请求穿透到数据库。
-
解决:缓存空值、布隆过滤器、参数校验。
-
缓存雪崩
Redis雪崩是指在高并发场景下,大量缓存数据在同一时间失效,导致大量请求直接访问数据库,从而使数据库压力剧增,甚至可能导致系统崩溃。
原因
-
大量缓存数据设置了相同的过期时间,导致这些数据同时失效。
-
Redis服务器故障或重启,造成所有缓存数据丢失。
解决方案
-
错峰设置过期时间:为缓存数据设置随机化的过期时间,避免大量数据在同一时刻失效。
-
使用持久化:启用Redis的RDB或AOF持久化机制,确保Redis重启后能快速恢复数据。
-
缓存预热:系统启动时,提前将热点数据加载到缓存中。
-
降级策略:缓存失效时,返回默认值或空数据,减轻数据库压力。
缓存击穿
Redis击穿是指某个热点key在缓存中失效时,大量并发请求同时访问该key,导致这些请求直接打到数据库上,造成数据库压力过大。
原因
-
热点key的缓存过期,导致大量请求同时访问数据库。
-
恶意攻击针对某个特定key发起高并发请求。
解决方案
-
设置永不过期:对于热点key,可不设置过期时间,确保其始终存在于缓存中。
-
互斥锁:缓存失效时,使用互斥锁(如Redis的SETNX),确保只有一个请求查询数据库并更新缓存,其他请求等待或返回旧数据。
-
后台更新:通过后台定期更新热点key的缓存,避免其在高并发时失效。
缓存穿透
Redis穿透是指查询一个不存在的数据,由于缓存中也没有该数据,每次请求都会直接访问数据库,使得缓存无法发挥作用。
原因
-
查询的数据在数据库中不存在,缓存中也未存储。
-
恶意攻击故意查询不存在的数据。
解决方案
-
缓存空值:对于不存在的数据,在缓存中存储一个空值或特殊标记,并设置较短的过期时间。
-
布隆过滤器:在缓存前使用布隆过滤器,预先判断数据是否存在,若不存在则直接返回,避免访问数据库。
-
参数校验:在接口层加强参数校验,过滤掉明显不合法的请求。
Redis如何使用异步队列?
Redis中key过期了一定会立即删除吗
惰性删除
定期删除:随机的抽取一部分删除
三.场景题
重复下单的问题
redis的 setNx