Advertisement

Redis(面试)相关知识点(较全)

阅读量:

Redis相关知识点

      • 1、请简述Redis是什么?
  • 2、请列举Redis的主要优势。
  • 3、请说明Redis的主要特点。
  • 4、对比分析Redis与Memcached的主要区别。
  • 5、请详细阐述Redis的线程模型。(Redis是非阻塞IO、多路复用机制)
  • 6、为什么单线程模式在Redis中依然能达到如此高的效率?
  • 7、如何通过多线程机制提升Redis在多核CPU环境下的性能?
  • 8、请问Redis支持两种持久化方式?(两种)
  • 9、如何进行系统选择?
  • 10、请问Redis支持多少种数据过期策略?
  • 11、当MySQL中存储了2000万个数据而Redis中仅存储20万个数据时,请问如何确保 Redis 中的数据均为热点数据?
  • 12、请详细说明Redis回收进程的工作原理。
  • 13、如果需要同时过期大量key,请问需要注意哪些事项?
  • 14、请问Redis提供了哪些常用的数据结构?(多种)
  • 15、请列举并简述Redis的主要应用场景。
  • 16、请问Java客户端支持的类型有哪些?(三种)
  • 17、如何通过Redo设计实现分布式锁?
  • 18、简述什么是Redo事务?
  • 19、什么是Redo主从同步?

1、什么是Redis?

Redis ,全称为Remote Dictionary Server(RDS),是一种基于内存的高性能Key-Value数据存储系统。 Redis 已经成为互联网公司在缓存组件选择的唯一。例如说,在各种公有云上,缓存服务都是提供的 Redis 。例如,在不同公有云平台中, 缓存服务通常都基于 Redis 构建. 在招聘简历要求上, 都会要求掌握 Redis 。

2、Redis有什么优点?

①. 运行速度极快
由于数据以内存形式存储类似于 HashMap ,而 HashMap 的显著优势在于其查找和操作的时间复杂度均为 O(1) 。
②. 支持多种数据类型
该系统支持多种数据类型包括 StringListSetSorted SetHash
③. 具备多种功能特性
1)订阅发布功能
2)键迭代期策略
3)事务处理能力
4)多数据库配置支持
5)计数器功能
④. 持久化存储方案
Redis 提供 RDBAOF 两种持久化存储方案,在内存数据库可能出现挂机时丢失数据的问题上具有显著优势。
⑥. 高可用性设计
1)内置 Redis Sentinel ,提供主从故障自动切换机制
2)内置 Redis Cluster ,采用槽分片方案实现集群管理,并可扩展至较大规模的 Redis 环境

3、Redis有什么缺点?

基于内存的数据库系统在单机设备所拥有的内存容量下运行其存储数据量主要由硬件配置决定尽管Redis内建的时间戳机制能够自动处理关键数据过期问题但仍需依据业务需求合理规划内存资源以节省空间若系统内存配置出现快速增长趋势建议及时执行数据清理操作以释放不必要的占用资源
在完成相关参数调整后重启服务以实现数据迁移整个过程所需时间较长在此期间主服务将无法正常运行

4、Redis和Memcached的区别有哪些?

①. Redis 支持复杂的数据结构
Memcached 仅提供简单的字符串。
Redis 提供复杂的数据结构,丰富的数据操作。
也因为 Redis 支持复杂的数据结构,Redis 即使晚于 Memcached 推出,却获得更多开发者的青睐。
Redis 相比 Memcached 来说,拥有更多的数据结构,能支持更丰富的数据操作。如果需要缓存能够支持更复杂的结构和操作,Redis 会是不错的选择。
②. Redis 原生支持集群模式
在 Redis3.x 版本中,官方便能支持 Cluster 模式。
Memcached 没有原生的集群模式,需要依靠客户端来实现往集群中分片写入数据。
③. 性能对比
Redis 只使用单核,而 Memcached 可以使用多核,所以平均每一个核上 Redis在存储小数据时比 Memcached 性能更高。
在 100k 以上的数据中,Memcached 性能要高于 Redis 。虽然 Redis 最近也在存储大数据的性能上进行优化,但是比起 Memcached,还是稍有逊色。
更多关于性能的对比,可以看看 《Memcached 与 Redis 的关键性能指标比较》 。
④. 内存管理机制不同
相比来说,Redis 的内存管理机制,会更加简单。
Redis 采用的是包装的 malloc/free ,使用时现场申请的方式。
Memcached 采用的是 Slab Allocation 机制管理内存,预分配的内存池的方式。
如果对比两者的内存使用效率:
简单的 Key-Value 存储的话,Memcached 的内存利用率更高,可以使用类似内存池。
如果 Redis 采用 hash 结构来做 key-value 存储,由于其组合式的压缩, 其内存利用率会高于 Memcached 。
⑤. 网络 IO 模型
Memcached 是多线程,非阻塞 IO 复用的网络模型,原型上接近 Nignx 。
Redis 使用单线程的 IO 复用模型,自己封装了一个简单的 AeEvent 事件处理框架,主要实现了 epoll , kqueue 和 select ,更接近 Apache 早期的模式。
⑥. 持久化存储
Memcached 不支持持久化存储,重启时,数据被清空。
Redis 支持持久化存储,重启时,可以恢复已持久化的数据。

5、请说说Redis的线程模型?(Redis 是非阻塞 IO ,多路复用)

Redis内核采用文件事件处理器(FEP)来管理文件操作。由于其设计特性决定了只能执行单一并行处理机制(SMP),因此Redis被定义为单线程模型。基于输入的多路复用机制同时监控多个网络套接字(Socket),并通过检查每个Socket上的事件来动态分配对应的事件处理任务。

6、为什么Redis单线程模型也能效率这么高?

①采用C语言进行功能开发
②完全基于内存的操作
③基于非阻塞的IO多路复用机制
④单线程设计有效地降低了因频繁切换而产生的开销
⑤包含多种复杂的数据结构

7、Redis是单线程的,如何提高多核CPU的利用率?

可以在同一个服务器安装多个Redis实例,并将它们视为不同的服务进行管理,在某些情况下,默认的一台服务器往往无法满足多任务处理的需求。因此,在需要多处理任务时,请考虑采用分布式架构或资源分区策略。

8、Redis有几种持久化方式? 2种

全量

全量

增量

▲ RDB 优缺点
① 优点
灵活设置备份频率和周期。你可能打算每个小时归档一次最近 24 小时的数据,同时还要每天归档一次最近 30 天的数据。通过这样的备份策略,一旦系统出现灾难性故障,我们可以非常容易的进行恢复。
非常适合冷备份,对于灾难恢复而言,RDB 是非常不错的选择。因为我们可以非常轻松的将一个单独的文件压缩后再转移到其它存储介质上。推荐,可以将这种完整的数据文件发送到一些远程的安全存储上去,比如说 Amazon 的 S3 云服务上去,在国内可以是阿里云的 OSS 分布式存储上。
性能最大化。对于 Redis 的服务进程而言,在开始持久化时,它唯一需要做的只是 fork 出子进程,之后再由子进程完成这些持久化的工作,这样就可以极大的避免服务进程执行 IO 操作了。也就是说,RDB 对 Redis 对外提供的读写服务,影响非常小,可以让 Redis 保持高性能。
恢复更快。相比于 AOF 机制,RDB 的恢复速度更更快,更适合恢复数据,特别是在数据集非常大的情况。
② 缺点
如果你想保证数据的高可用性,即最大限度的避免数据丢失,那么 RDB 将不是一个很好的选择。因为系统一旦在定时持久化之前出现宕机现象,此前没有来得及写入磁盘的数据都将丢失。(所以,RDB实际场景下,需要和AOF一起使用)
由于 RDB 是通过 fork 子进程来协助完成数据持久化工作的,因此,如果当数据集较大时,可能会导致整个服务器停止服务几百毫秒,甚至是 1 秒钟。(所以,RDB建议在业务低估时使用,例如在半夜执行。)

▲AOF 优缺点
① 优点
该机制可以带来更高的数据安全性,即数据持久性。Redis 中提供了 3 种同步策略,即每秒同步、每修改(执行一个命令)同步和不同步。
o事实上,每秒同步也是异步完成的,其效率也是非常高的,所差的是一旦系统出现宕机现象,那么这一秒钟之内修改的数据将会丢失。
o而每修改同步,我们可以将其视为同步持久化,即每次发生的数据变化都会被立即记录到磁盘中。可以预见,这种方式在效率上是最低的。
o至于不同步,无需多言,我想大家都能正确的理解它。
由于该机制对日志文件的写入操作采用的是 append 模式,因此在写入过程中即使出现宕机现象,也不会破坏日志文件中已经存在的内容。
o因为以 append-only 模式写入,所以没有任何磁盘寻址的开销,写入性能非常高。
o另外,如果我们本次操作只是写入了一半数据就出现了系统崩溃问题,不用担心,在 Redis 下一次启动之前,我们可以通过 redis-check-aof 工具来帮助我们解决数据一致性的问题。
如果 AOF 日志过大,Redis 可以自动启用 rewrite 机制。即使出现后台重写操作,也不会影响客户端的读写。因为在 rewrite log 的时候,会对其中的指令进行压缩,创建出一份需要恢复数据的最小日志出来。再创建新日志文件的时候,老的日志文件还是照常写入。当新的 merge 后的日志文件 ready 的时候,再交换新老日志文件即可。
AOF 包含一个格式清晰、易于理解的日志文件用于记录所有的修改操作。事实上,我们也可以通过该文件完成数据的重建。
② 缺点
对于相同数量的数据集而言,AOF 文件通常要大于 RDB 文件。RDB 在恢复大数据集时的速度比 AOF 的恢复速度要快。
根据同步策略的不同,AOF 在运行效率上往往会慢于 RDB 。总之,每秒同步策略的效率是比较高的,同步禁用策略的效率和 RDB 一样高效。
以前 AOF 发生过 bug ,就是通过 AOF 记录的日志,进行数据恢复的时候,没有恢复一模一样的数据出来。所以说,类似 AOF 这种较为复杂的基于命令日志/merge/回放的方式,比基于 RDB 每次持久化一份完整的数据快照文件的方式,更加脆弱一些,容易有 bug 。不过 AOF 就是为了避免 rewrite 过程导致的 bug ,因此每次 rewrite 并不是基于旧的指令日志进行 merge 的,而是基于当时内存中的数据进行指令的重新构建,这样健壮性会好很多。

9、如何选择?

①不应仅依赖于RDB, 因为这可能导致大量数据丢失。
②不应仅依赖于AOF, 因为这存在两个问题: 首先, 在缺少相应的RDB冷备份时, AOF备份会导致恢复速度较慢; 其次, RDB通过生成快照的方式来实现备份, 这种方法更加稳健可靠, 可以避免因复杂性较高的备份和恢复机制而产生的潜在问题。
③Redis允许同时启用多种持久化机制, 并建议综合采用AOF与RDB相结合的方式: 首先选择并维护好完整的AOF备份文件作为数据安全的第一道防线; 当遇到仅有或缺少完整有效的AOF文件无法正常访问时, 再切换到运行较为稳定的RDB系统进行快速补充和恢复。若同时启用了这两种持久化机制, 在Redis启动过程中系统会自动优先利用完好的或最近有效的AOF文件来进行必要的数据重建工作。

10、Redis有几种数据“过期”策略?

Redis提供了三种数据过期策略:
①定时删除:在设置key的过期时间的同时为该key创建一个定时器让定时器在key的过期时间来临时对key进行删除这种机制能够有效释放内存资源但需要考虑大量的定时器创建可能会导致性能问题并且无法保证及时清除所有已过期的关键字
优点:能够快速释放内存资源
缺点:大量定时器可能导致性能问题并且无法及时清除所有已过期的关键字
无人使用
②惰性删除:当key过期时系统不会立即删除它而是等到从数据库中获取该key时才会检查其是否已超时如果是则会将其返回null这样就不会立即清除已经不再被使用的关键字
优点:减少了CPU资源消耗仅在必要时才会执行清除操作从而避免了长时间未被访问的关键字占用大量内存空间
缺点:可能会导致内存泄漏即存在大量未被访问却已超时的关键字仍然占用内存空间
③定期删除:每隔一段时间系统会自动执行一次清理操作以移除所有已超过的关键字这种机制能够在一定程度上平衡内存管理和CPU资源消耗但它并不能完全解决内存泄漏的问题因为这仍然依赖于预设的时间间隔设置可能无法适应实际应用中对内存管理的需求

MySQL数据库中有大量关键业务数据存储在其中,在线查询量巨大;而Redis中仅用于存放少量非热点业务的数据资源。那么,在这种情况下应该如何确保Redis中的所有存储的数据都是当前活跃的热点数据呢?

当Redis内存数据集大小增长至设定的maxmemory阈值时,则会触发数据淘汰策略。在这一前提下,在实际应用开发中若希望热点数据得以保留而不被淘汰,则通常会选择volatile-lru或allkeys-lru这两种基于LRU算法的数据淘汰策略。相较于前者,在特定场景下我们往往倾向于采用allkeys-lru策略作为默认选择。主要原因在于:若缓存访问行为遵循幂律分布规律(即存在明显的热点数据),或者我们不清楚缓存访问行为的分布特性,则allkeys-lru能够更好地满足需求;而如果当前应用环境较为确定且对高频项有明确定义,则可考虑使用Redis 4.0版本中的volatile-lfu策略作为替代方案

12、Redis回收进程如何工作的?

理解回收进程的重要性是必要的:
当客户端执行新写入操作时, 系统会新增相应的数据内容.
Redis 会持续监控内存占用水平, 当内存使用率超过预设阈值时, 将按照既定策略执行回收操作.
Redis 将接收并处理新的操作指令.

13、如果有大量的key需要设置同一时间过期,一般需要注意什么?

当大量键件具有相同的超时时间设置时,在超时那一刻RedlS可能会短暂出现性能瓶颈现象。
为了使超时分布更加均匀可以通过给每个键件分配一个随机的时间偏移来分散其超时分布。
一位朋友也遇到了类似问题并寻求帮助他的解决办法是在配置中将hz参数设为较大的数值这样每次操作后会新增更多的键件从而避免一次性清除过多键件。
Redis中hz参数决定了每秒内系统执行主动清除旧数据的操作次数默认设置为每秒10次这意味着系统每秒会尝试清除最多10个键件。
增大hz参数能够提升Redis系统主动清除旧数据的能力在内存压力较大的情况下可能需要适当增大该值(建议最大不超过10O)。经过测试我们将此参数提升至1OO后发现CPU使用率上升约2个百分点但有效释放了更多的冷数据(通过观察键空间数量和内存使用情况)。

14、Redis有哪些数据结构?

如果你是Redis普通玩家,可能你的回答是如下五种数据结构:
①字符串 String
②字典 Hash
③列表 List
④集合 Set
⑤有序集合SortedSet
如果你是Redis中级玩家,还需要加上下面几种数据结构:
⑥HyperLogLog
⑦Geo
⑧Bitmap
如果你是Redis高端玩家,你可能玩过Redis Module,你可以再加上下面几种数据结构:
⑨BloomFilter
⑩RedisSearch
⑪Redis-ML
⑫JSON

15、Redis使用场景?

Redis 可用的场景非常之多:
①数据缓存能力模块
②会话缓存机制
③具有时效性的数据存储
④用户访问频率统计
⑤计数功能模块
⑥社交关系列表管理
⑦用于判断用户状态的信息记录模块
⑧集合运算功能(包括交集、并集及差集)
⑨热门内容排行及推荐系统模块
⑩实时更新内容模块
⑪消息队列管理功能模块
⑫分布式锁机制配置选项

16、Redis 支持的 Java 客户端都有哪些? 3

① Redisson 是一个功能强大的分布式协调系统,在分布式环境里能够帮助用户轻松实现一些 Java 对象的操作,并通过分离 Redis 的关注点来提升用户的注意力集中在业务逻辑处理上。
② jedis 是基于 Redis 的 Java 客户端 API,在其设计中提供了较为全面的支持各种 Redis 命令的功能。
相对而言, jedis 的功能较为简单, 适合基本需求。
③ lettuce 是一个高扩展性且线程安全的 Redis 客户端, 多个线程能够共享同一个 redis 连接实例, 并利用优秀的 Netty NIO 框架实现了高效的多连接管理。

Redis 官方推荐使用 Redisson 或 Jedis 。

17、如何使用Redis实现分布式锁?

Redis实现了分布式锁机制,在实际应用中需考虑以下几点:
①正确地获取到锁
set指令带有nx参数功能特性明确仅允许一个进程成功获取到。
②正确地释放 lock
采用Lua脚本判断是否为自身持有 lock进而进行相应的 release 操作。
③实现 lock 的自动超时释放
set指令带有expire参数结合数据库自定义的超时策略来完成 lock 的自动释放功能。
④处理未被获得到 lock 的情形
通过 sleep 操作或订阅-发布(Pub/Sub)机制来处理等待问题。
⑤【可选

18、什么是 Redis 事务?

和大多数其他数据库一样,Redis作为一个非关系型数据库同样提供了事务功能。在Redis中,MULTI/EXEC/DISCARD/WATCH这四个命令是我们实现事务操作的基础工具。尽管对有关系型数据库开发经验的开发者来说这一概念并不陌生,但为了确保操作的稳定性,我们依然会对Redis事务的实现特性进行简要说明:
① 在一个事务过程中,所有的命令都会按照指定顺序被串行化执行,在此期间Redis系统将不再处理其他客户端的请求,从而保证整个事务的所有操作能够原子化地完成执行。
② 相较于关系型数据库中的事务机制,Redis事务具有容错性较强的特点:如果在一个事务中某一条指令无法成功执行,其后所有尚未完成的操作仍然会继续被处理并最终完成相应的操作序列处理过程。
③ 通过使用MULTI命令启动一个 Redis 事务,我们可以将其视为相当于 “BEGIN TRANSACTION” 语句的作用:在该语句生效后所进行的所有操作都将被视为属于当前事务范围内的操作;当需要提交或回滚这些操作时,可以通过-exec/DISCARD命令来完成相应的操作提交或回滚动作;这两个 Redis 命令的作用相当于关系型数据库中的 COMMIT/ROLLBACK 语句功能特性表现形式之一。
④ 在开启一个新事务之前,如果客户端与服务器之间因网络问题导致通信中断并出现断开状态,那么所有预先准备好的未被执行的操作都将无法由服务器自动处理;但如果断开事件是在客户端已经完成了EXEC指令之后才发生的,那么该 Redis 事务中的所有指令将能够顺利地被服务器系统所接收并处理完毕。

19、什么是Redis主从同步?

Redis 的主副机复制机制允许副本节点 Slave 通过网络发送完整的数据备份给 master 节点,从而实现主副机的数据一致性

当发生写操作时, master 节点会自动将数据发送到副本节点,副本节点处于只读模式并接收 master 节点发送的数据

一个 master 节点可配置多个副本节点;每个副本节点只能属于一个 master 节点

首次启动时, master 节点执行一次全量复制任务,并在完成该任务后通知各个副本节点进行重放

➤优势
Redis 复制机制能够很好地支持数据的一致性和高效分离,在提升服务器处理高并发任务的能力的同时实现了数据库的读写隔离策略。主数据库主要用于处理 writes 操作,在线事务维护一致性;而从数据库则专注于读取 operations, 保证系统的可扩展性与稳定性。

全部评论 (0)

还没有任何评论哟~