tulip notes
首页
  • 学习笔记

    • 《Vue》
  • 踩坑日记

    • JavaScript
  • MQ
  • Nginx
  • IdentityServer
  • Redis
  • Linux
  • Java
  • SpringBoot
  • SpringCloud
  • MySql
  • docker
  • 算法与设计模式
  • 踩坑与提升
  • Git
  • GitHub技巧
  • Mac
  • 网络
  • 项目构建合集
  • 一些技巧
  • 面试
  • 一些杂货
  • 友情链接
  • 项目发布
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

Star-Lord

希望一天成为大师的学徒
首页
  • 学习笔记

    • 《Vue》
  • 踩坑日记

    • JavaScript
  • MQ
  • Nginx
  • IdentityServer
  • Redis
  • Linux
  • Java
  • SpringBoot
  • SpringCloud
  • MySql
  • docker
  • 算法与设计模式
  • 踩坑与提升
  • Git
  • GitHub技巧
  • Mac
  • 网络
  • 项目构建合集
  • 一些技巧
  • 面试
  • 一些杂货
  • 友情链接
  • 项目发布
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • 一些技巧

  • 面试

    • 面试问题集锦
    • Java热点经典问题集锦_1
    • Java中类跟数据相关问题_1
    • Java集合相关问题
    • Java并发与异常相关问题
    • Java循环条件判断相关
    • Redis面试题
      • Redis支持的数据类型?
      • Redis的持久化策略?
      • 如何保证redis的⾼可⽤?
      • 在项⽬中redis的使⽤场景?
      • redis中的数据可以设置过期时间,当数据过期之后有些key并没有及时清除,请问如何处理?
      • Redis的删除策略有哪些?
      • Redis提供的淘汰策略有哪些?
        • 指定淘汰策略
      • 在redis集群,请问如何解决redis集群的脑裂问题?
        • 解决方案
    • 实际场景问题_1
    • 框架类技术问题集锦-1
    • 开发中遇到的问题_1
    • MySql面试相关
    • Java中业务相关问题
    • 软件测试面试问题
    • 软件测试面试answer
    • Java八股文系列
  • 一些杂货

  • 项目发布

  • 友情链接
  • 更多
  • 面试
EffectTang
2023-11-25
目录

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 -> 不淘汰任何数据,当内存不够时直接抛出异常.
1
2
3
4
5
6
7
8

其中默认的淘汰策略为:noeviction

# The default is:
#
# maxmemory-policy noeviction
1
2
3

LRU:最近最少使用淘汰算法(Least Recently Used)。LRU是淘汰最长时间没有被使用的数据

LFU:最不经常使用淘汰算法(Least Frequently Used)。LFU是淘汰一段时间内,使用次数最少的数据

# 指定淘汰策略

在配置文件中进行如下配置:

maxmemory-policy volatile-lru
1

# 在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秒的数据,也就避免了大量长时间的数据丢失。

上次更新: 2025/04/23, 16:23:16
Java循环条件判断相关
实际场景问题_1

← Java循环条件判断相关 实际场景问题_1→

最近更新
01
面向切面跟自定义注解的结合
05-22
02
时间跟其他数据的序列化
05-19
03
数据加密与安全
05-17
更多文章>
Theme by Vdoing | Copyright © 2023-2025 EffectTang
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式