Redis

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值