Redis面试题
# Redis面试题
# Redis支持的数据类型?
Redis 支持五种主要的数据类型,分别是 String(字符串)、Hash(哈希)、List(列表)、Set(集合)和 Sorted Set(有序集)
# Redis的持久化策略?
Redis 提供了两种持久化策略:RDB
和 AOF
。
RDB 是一种 Snapshot 快照持久化方法,它会在满足一定条件的情况下,将内存中的所有数据以文件形式保存到硬盘上。RDB 文件占用空间小,恢复速度快。
AOF 是 Append Only File 持久化方法,它会将 Redis 执行的所有写命令追加到文件中,并在 Redis 重启时回放这些命令来恢复数据。AOF 持久化相比 RDB 更加安全,因为它可以保留更多的历史记录。
Redis 默认采用 RDB 持久化
,也可以同时使用 RDB 和 AOF 持久化。在配置文件中可以指定相应的参数来控制这两种持久化方法的行为。
# 如何保证redis的⾼可⽤?
- Redis⽀持持久化,同时开启rdb 和 aof ,以保证数据的安全性(还是存在数据丢失⻛险的)
- Redis⽀持主从配置,我们可通配置哨兵,实现主备配置,保证可⽤性
- Redis也⽀持集群,通过集群配置可以保证redis的⾼并发
# 在项⽬中redis的使⽤场景?
缓存系统:存储经常访问且很少修改的数据,以减少对主数据库的访问和减少访问延迟。
会话存储:用于存储用户会话信息,如用户的登录状态、个人设置等。
排行榜/计数器:Redis的Sorted Set数据类型非常适合于实现排行榜,同时Redis的原子操作也可以用于实现各种计数器。比如:文章的阅读数,白天都是存储在redis中,只有在晚上12或者其他某个时刻,才把数据写入mysql等数据库,以及微博热搜的排行等都可用redis实现。这些场景对数据的实时性要求很高
任务队列:Redis的List数据类型可以用于实现各种任务队列,如FIFO队列等。
在电子商务应用中,一旦客户下订单,就需要处理一系列后台任务,例如库存检查,支付处理,订单确认,通知等。这些任务可能需要较长的时间来处理,如果同步执行这些任务,可能会导致用户在提交订单后需要等待较长时间才能得到反馈,这会严重影响用户体验。在这种情况下,我们可以使用Redis作为任务队列,将订单处理任务异步执行。当然这种场景,有性能更优秀的中间件——消息队列-kafka、mq等
实时分析:Redis的速度和数据结构使它成为实时分析的理想选择,例如可以用于统计网站访问者或者收集实时交易信息等。
# redis中的数据可以设置过期时间,当数据过期之后有些key并没有及时清除,请问如何处理?
这是因为它使用了惰性删除策略
。
惰性删除:放任键的过期不管,但是每次从键空间中获取键时,都检查取得的键是否过期,如果过期的话,就删除该键;如果没有过期,就返回该键。(使用的时候删除)
# Redis的删除策略有哪些?
- 定期删除策略:每隔一段时间,Redis 会对数据库进行一次随机采样,检查其中的键是否已过期,如果发现有过期键则删除。
- 惰性删除策略:当某个键被访问时,如果发现该键已经过期,则立即删除该键。
- 内存使用达最大限制才删除:当 Redis 内存使用达到最大限制时,还可以使用
淘汰策略
来腾出内存空间。
Redis 使用的是惰性删除和定期删除相结合的方式
来处理过期键。当某个键被访问时,如果发现该键已经过期,则立即删除该键;每隔一段时间,Redis 会对数据库进行一次随机采样,检查其中的键是否已过期,如果发现有过期键则删除。
需要注意的是,Redis 并不能保证所有的过期键都能得到及时处理,因为它是异步处理过期键的(有的是再次访问发现过期时,才删除),有可能会出现一些过期键未被清除的情况。
# Redis提供的淘汰策略有哪些?
Redis提供了8种淘汰策略:
# volatile-lru -> 从设置了过期时间的数据中淘汰最久未使⽤的数据.
# allkeys-lru -> 从所有数据中淘汰最久未使⽤的数据.
# volatile-lfu -> 从设置了过期时间的数据中淘汰使⽤最少的数据.
# allkeys-lfu -> 从所有数据中淘汰使⽤最少的数据.
# volatile-random -> 从设置了过期时间的数据中随机淘汰⼀批数据.
# allkeys-random -> 从所有数据中随机淘汰⼀批数据.
# volatile-ttl -> 淘汰过期时间最短的数据.
# noeviction -> 不淘汰任何数据,当内存不够时直接抛出异常.
2
3
4
5
6
7
8
其中默认的淘汰策略为:noeviction
# The default is:
#
# maxmemory-policy noeviction
2
3
LRU:最近最少使用淘汰算法(Least Recently Used)。LRU是淘汰最长时间没有被使用的数据
LFU:最不经常使用淘汰算法(Least Frequently Used)。LFU是淘汰一段时间内,使用次数最少的数据
# 指定淘汰策略
在配置文件中进行如下配置:
maxmemory-policy volatile-lru
# 在redis集群,请问如何解决redis集群的脑裂问题?
Redis 集群中的脑裂问题是由于网络分区导致部分 Redis 实例与其他实例断开连接,形成多个不完整的集群,每个实例都认为自己是最新的状态,从而造成数据冲突或者一致性问题。
出现集群脑裂后,如果客户端还在基于原来的master节点继续写入数据,那么新的master节点将无法同步这些数据,当网络问题解决之后,sentinel集群将原先的master节点降为slave节点,此时再从新的master中同步数据,将会造成大量的数据丢失。
# 解决方案
由于脑裂是由网络等原因造成的,除了提高网络、硬件等方法外,主要通过增加以下配置,改善出现脑裂而引发的数据丢失问题。
min-slaves-to-write 1 // 要求至少有1个slave
min-slaves-max-lag 10 //数据复制和同步的延迟不能超过10秒
如果一个master出现了脑裂,跟其他slave丢了连接,那么上面两个配置可以确保说,如果不能继续给指定数量的slave发送数据,而且slave超过10秒没有给自己ack消息,那么就直接拒绝客户端的写请求。这样脑裂后的旧master就不会接受client的新数据,最多就丢失10秒的数据,也就避免了大量长时间的数据丢失。