Redis开篇
使用场景:
-
缓存 穿透、击穿、雪崩;双写一致、持久化;数据过期、淘汰策略

-
缓存穿透:查询一个不存在的数据,Mysql查询不到数据库也不会直接写入缓存,就会导致每次请求都查询数据库
-
解决方案一:缓存空数据,查询返回的数据为空时仍把这个空结果进行缓存
优点: 简单
缺点: 消耗内存,可能会发生不一致问题
-
解决方案二: 布隆过滤器

**优点:**内存占用少,没有多余key
**缺点:**实现复杂,存在误判
问题1: Redis的使用场景
- 根据自己简历上的业务进行回答
- 缓存 穿透、击穿、雪崩、双写一致、持久化、数据过期、淘汰策略
- 分布式锁 setnx、redisson
问题二: 什么是缓存穿透,怎么解决
- 缓存穿透:查询一个不存在的数据,Mysql查询不到数据库也不会直接写入缓存,就会导致每次请求都查数据库
- 解决方案一:缓存空数据
- 解决方案二:布隆过滤器
-
-
缓存击穿:给某一个key设置了过期时间,当key过期的时候,恰好这时间点对这个key又大量的并发请求过来,这些并发的请求可能会瞬间把DB压垮
- 解决方案一: 互斥锁
- 解决方案二: 逻辑过期

-
缓存雪崩:是指在同一时段大量的缓存key同时失效或者Redis服务宕机,导致大量请求到达数据库,带来巨大压力。

- 给不同的key的TTL添加随机值 (同一时段大量的缓存key同时失效)
- 利用Redis集群提高服务的可用性 (Redis服务强宕机) 哨兵模式、集群模式
- 给缓存业务添加降级限流策略 ngxin或spring cloud gateway 降级可作为系统的保底策略,适用于穿透、击穿、雪崩
- 给业务添加多级缓存 Guava或Caffeine
缓存三兄弟
穿透无中生有key,布隆过滤null隔离
缓存击穿过期key,锁与非期解难题
雪崩大量过期key,过期时间要随机
面试必考三兄弟,可用限流来保底
-
双写一致性: 当修改了数据库的数据也要同时更新缓存的数据,缓存和数据库的数据要保持一致

不管是先删除还是先修改数据库,都会有情况导致缓存和数据库中数据不一致的情况
删除两次缓存是为了降低脏数据的出现
因为数据库的主从模式的,数据同步从主节点到从节点需要一段时间,所以需要延迟双删

分布式锁的性能比较低
读写锁中,共享锁读与读互斥,读写不互斥,排他锁读写互斥。它可以保持数据的强一致性,但是性能以然不高
以下两种方法都适用于允许延时一致的业务
异步通知保证数据的最终一致性

基于Canal的异步通知:

Canal通知会有短暂延迟
Redis持久化
- RDB全称Redis Database Backup file(Redis数据备份文件),也被叫做Redis数据快照。简单来说就是把内存中的所有数据都记录到磁盘中。当Redis实例故障重启后,从磁盘读取快照文件,恢复数据。

- AOF全称为Append Only File(追加文件)。Redis处理的每一个写命令都会记录在AOF文件,可以看作是命令日志文件。
因为是记录命令,AOF文件会比RDB文件大的多。而且AOF会记录对同一个key的多次写操作,但只有最后一次写操作才有意义。通过执行bgrewriteaof命令,可以让AOF文件执行重写功能,用最少的命令达到相同效果

-
数据过期策略:Redis对数据设置数据的有效时间,数据过期之后,就需要将数据从内存中删掉。可以按照不同的规则进行删除,这种删除规则就被称之为数据的过期策略。 惰性删除,过期删除
-
惰性删除:设置key过期时间后,我们不去管它,当需要该key时,我们再检查其是否过期,如果过期,我们就删掉它,反之返回该key
优点: 对CPU友好,只会在使用该key时才会经行过期检查,对于很多用不到的key不用浪费时间进行过期检查
缺点: 对内存不友好,如果一个key已经过期,但是一直没有使用,那么该key就会一直存在内存中,内存永远不会释放。
-
定期删除:每隔一段时间,我们就对一些key进行检查,删除里面过期的key(从一定数量的数据库中取出一定数量的随机key进行检查,并删除其中的过期key)。
定期清理有两种模式:
- SLOW模式时定时任务,执行频率默认为10hz,每次不超过25ms,以通过修改配置文件redis.conf的hz选项来调整这个次数。
- FAST模式执行频率不固定,但两次间隔不低于2ms,每次耗时不超过1ms
优点: 可以通过限制删除操作执行的时长和频率来减少删除操作对CPU的影响。另外定期删除,也能有效释放过期键占用的内存。
缺点: 难以确定删除操作执行的时长和频率。
Redis的过期删除策略:惰性删除+定期删除两种策略进行配合使用
-
-
-
- 数据淘汰策略: 当Redis中的内存不够用时,此时在向Redis中添加新的key,那么Redis就会按照某一种规则将内存中的数据删除掉,这种数据的删除规则被称之为内存的淘汰策略。

-
分布式锁 setnx、redisson
多用于抢票、秒杀等场景
-
redis分布式锁 Redis实现分布式锁主要利用Redis的setnx命令。setnx是SET if not exists(如果不存在,则写SET)的简写。

-
redisson实现的分布式锁-执行流程

三个关键点:
- Watch dog可以给锁续期(默认是每隔10秒续期一次)
- 抢不到锁的线程会进行尝试等待
- 所有的redis命令是基于lua脚本完成的,保证执行的原子性
-
redisson实现的分布式锁-课重入
] -
redisson实现的分布式锁-主从一致性
RedLock(红锁): 不能只在一个redis实例上创建锁,应该是在多个redis实例上创建锁(n/2 + 1),避免在一个redis实例上加锁。
]redisson提供的红锁可以解决主从一致性,但是性能会大大降低,如果业务中非要保证数据的强一致性,可以采用zookeeper实现的分布式锁。
-
-
-
计数器
-
保存token 数据类型
-
消息队列 数据类型
-
延迟队列 数据类型
其他面试题
-
集群 主从、哨兵、集群
-
主从复制: 单节点Redis的并发能力是有上限的,要进一步提高Redis的并发能力,就需要搭建主从集群,实现读写分离。
- 主从全量同步

-
主从增量同步

-
哨兵的作用: Redis提供了哨兵(Sentinel)机制来实现主从集群的自动故障恢复。哨兵的结构和作用如下

-
服务状态监控
Sentinel基于心跳机制监测服务状态,每隔1秒向集群的每个实例发送ping命令:
- 主管下线: 如果某sentinel节点发现某实例未在规定时间响应,则认为该实例主观下线。
- 客观下线: 若超过指定数量(quorum)的sentinel都认为该实例主观下线,则该实例客观下线。quorum值最好超过Sentinel实例数量的一半。

-
-
redis集群(哨兵模式)脑裂

-
-
事务
-
Redis为什么快
文章详细介绍了Redis在缓存管理中的应用,包括缓存穿透的解决方案(空数据缓存和布隆过滤器)、缓存击穿的处理(互斥锁和逻辑过期)、缓存雪崩的预防措施以及双写一致性的挑战。此外,还讨论了Redis的持久化机制(RDB和AOF)和数据过期策略。文章还提到了Redis在分布式锁实现中的角色,如setnx和redisson,并简要提及了Redis集群的相关概念。
24万+

被折叠的 条评论
为什么被折叠?



