首页 / 面试 / Redis(面试)相关知识点(较全)
Redis(面试)相关知识点(较全)
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Redis(面试)相关知识点(较全),小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含14927字,纯文字阅读大概需要22分钟。
内容图文
![Redis(面试)相关知识点(较全)](/upload/InfoBanner/zyjiaocheng/858/b4d912b48d4d417a93b74b9f312fa938.jpg)
Redis相关知识点
- 1、什么是Redis?
- 2、Redis有什么优点?
- 3、Redis有什么缺点?
- 4、Redis和Memcached的区别有哪些?
- 5、请说说Redis的线程模型?(Redis 是非阻塞 IO ,多路复用)
- 6、为什么Redis单线程模型也能效率这么高?
- 7、Redis是单线程的,如何提高多核CPU的利用率?
- 8、Redis有几种持久化方式? 2种
- 9、如何选择?
- 10、Redis有几种数据“过期”策略?
- 11、MySQL里有2000w数据,Redis中只存20w数据,如何保证Redis中的数据都是热点数据?
- 12、Redis回收进程如何工作的?
- 13、如果有大量的key需要设置同一时间过期,一般需要注意什么?
- 14、Redis有哪些数据结构?
- 15、Redis使用场景?
- 16、Redis 支持的 Java 客户端都有哪些? 3
- 17、如何使用Redis实现分布式锁?
- 18、什么是 Redis 事务?
- 19、什么是Redis主从同步?
1、什么是Redis?
Redis ,全称 Remote Dictionary Server ,是一个基于内存的高性能 Key-Value 数据库。
Redis 已经成为互联网公司在缓存组件选择的唯一。例如说,在各种公有云上,缓存服务都是提供的 Redis。再例如说,招聘简历要求上,都会要求掌握 Redis 。
2、Redis有什么优点?
①. 速度快
因为数据存在内存中,类似于 HashMap ,HashMap 的优势就是查找和操作的时间复杂度都是O (1) 。
②. 支持丰富数据类型
支持 String ,List,Set,Sorted Set,Hash 五种基础的数据结构。
③. 丰富的特性
1)订阅发布 Pub / Sub 功能
2)Key 过期策略
3)事务
4)支持多个 DB
5)计数
④. 持久化存储
Redis 提供 RDB 和 AOF 两种数据的持久化存储方案,解决内存数据库最担心的万一 Redis 挂掉,数据会消失掉。
⑥.高可用
1)内置 Redis Sentinel ,提供高可用方案,实现主从故障自动转移。
2)内置 Redis Cluster ,提供集群方案,实现基于槽的分片方案,从而支持更大的 Redis 规模。
3、Redis有什么缺点?
① 由于是内存数据库,所以,单台机器,存储的数据量,跟机器本身的内存大小。虽然 Redis 本身有 Key 过期策略,但是还是需要提前预估和节约内存。如果内存增长过快,需要定期删除数据。
② 如果进行完整重同步,由于需要生成 RDB 文件,并进行传输,会占用主机的 CPU ,并会消耗现网的带宽。不过 Redis2.8 版本,已经有部分重同步的功能,但是还是有可能有完整重同步的。比如,新上线的备机。
修改配置文件,进行重启,将硬盘中的数据加载进内存,时间比较久。在这个过程中,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内部使用文件事件处理器file event handler,这个文件事件处理器是单线程的,所以Redis才叫做单线程模型。它采用IO多路复用机制同时监听多个Socket,根据Socket上的事件来选择对应的事件处理器进行处理。
文件事件处理器的结构包含4个部分:
?多个 Socket 。
?IO 多路复用程序。
?文件事件分派器。
?事件处理器(连接应答处理器、命令请求处理器、命令回复处理器)。
多个Socket可能会并发产生不同的操作,每个操作对应不同的文件事件,但是IO多路复用程序会监听多个Socket,会将socket产生的事件放入队列中排队,事件分派器每次从队列中取出一个事件,把该事件交给对应的事件处理器进行处理。
6、为什么Redis单线程模型也能效率这么高?
①C语言实现。
②纯内存操作。
③基于非阻塞的IO多路复用机制。
④单线程,避免了多线程的频繁上下文切换问题。
⑤丰富的数据结构。
7、Redis是单线程的,如何提高多核CPU的利用率?
可以在同一个服务器部署多个Redis的实例,并把他们当作不同的服务器来使用,在某些时候,无论如何一个服务器是不够的,所以,如果你想使用多个CPU,你可以考虑一下分区。
8、Redis有几种持久化方式? 2种
Redis 提供了两种方式,实现数据的持久化到硬盘。
(1)、【全量】RDB 持久化,是指在指定的时间间隔内将内存中的数据集快照写入磁盘。实际操作过程是,fork 一个子进程,先将数据集写入临时文件,写入成功后,再替换之前的文件,用二进制压缩存储。
(2)、【增量】AOF持久化,以日志的形式记录服务器所处理的每一个写、删除操作,查询操作不会记录,以文本的方式记录,可以打开文件看到详细的操作记录。
▲ 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,因为那样有两个问题,第一,你通过AOF做冷备份,没有RDB做冷备份来恢复速度快;第二,RDB每次简单粗暴生成数据快照,更加健壮,可以避免AOF这样复杂的备份和恢复机制的bug。
③Redis支持同时开启两种持久化方式,我们可以综合使用AOF和RDB两种持久化机制,用AOF来保证数据不丢失,作为数据恢复的第一选择;用RDB来做不同程度的冷备份,在AOF文件都丢失或损坏不可用的时候,还可以使用RDB来进行快速的数据恢复。
如果同时使用 RDB 和 AOF 两种持久化机制,那么在 Redis 重启的时候,会使用 AOF 来重新构建数据,因为 AOF 中的数据更加完整。
10、Redis有几种数据“过期”策略?
Redis的过期策略,就是指当Redis中缓存的key过期了,Redis如何处理。
Redis提供了3种数据过期策略:
①定时删除
含义:在设置key的过期时间的同时,为该key创建一个定时器,让定时器在key的过期时间来临时,对key进行删除。
优点:保证内存被尽快释放。
缺点:
若过期key很多,删除这些key会占用很多的CPU时间,在CPU时间紧张的情况下,CPU不能把所有的时间用来做要紧的事儿,还需要去花时间删除这些key。
定时器的创建耗时,若为每一个设置过期时间的key创建一个定时器(将会有大量的定时器产生),性能影响严重。
没人用
②惰性删除
含义:key过期的时候不删除,每次从数据库获取key的时候去检查是否过期,若过期,则删除,返回null。
优点:删除操作只发生在从数据库取出key的时候发生,而且只删除当前key,所以对CPU时间的占用是比较少的,而且此时的删除是已经到了非做不可的地步(如果此时还不删除的话,我们就会获取到了已经过期的key了)。
缺点:若大量的key在超出超时时间后,很久一段时间内,都没有被获取过,那么可能发生内存泄露(无用的垃圾占用了大量的内存)。
③定期删除
含义:每隔一段时间执行一次删除过期key操作。
优点:
通过限制删除操作的时长和频率,来减少删除操作对CPU时间的占用–处理"定时删除"的缺点。
缺点:
定期删除过期key–处理"惰性删除"的缺点。
在内存友好方面,不如"定时删除"。
在CPU时间友好方面,不如"惰性删除"。
11、MySQL里有2000w数据,Redis中只存20w数据,如何保证Redis中的数据都是热点数据?
在 「Redis 有哪几种数据“淘汰”策略?」 问题中,我们已经看到,“Redis 内存数据集大小上升到一定 maxmemory 的时候,就会进行数据淘汰策略。” 。
那么,如果我们此时要保证热点数据不被淘汰,那么需要选择 volatile-lru 或 allkeys-lru 这两个基于 LRU 算法的淘汰策略。
相比较来说,最终会选择 allkeys-lru 淘汰策略。原因是,如果我们的应用对缓存的访问符合幂律分布,也就是存在相对热点数据,或者我们不太清楚我们应用的缓存访问分布状况,我们可以选择 allkeys-lru 策略。如果在 Redis 4.0 版本,可以考虑使用 volatile-lfu ,更加符合“热”的概念,频率越高,代表越热。
12、Redis回收进程如何工作的?
理解回收进程如何工作是非常重要的:
?一个客户端运行了新的写命令,添加了新的数据。
?Redis 检查内存使用情况,如果大于 maxmemory 的限制, 则根据设定好的策略进行回收。
?Redis 执行新命令。
13、如果有大量的key需要设置同一时间过期,一般需要注意什么?
如果大量的key过期时间设置过于集中,到过期的那个时间点,Redis可能会出现短暂的卡顿现象。
一般需要在时间上加一个随机值,使得过期时间分散一些。
上次基友也碰到这个问题,请教了下,他的方案是调大 hz 参数,每次过期的 key 更多,从而最终达到避免一次过期过多。
这个定期的频率,由配置文件中的 hz 参数决定,代表了一秒钟内,后台任务期望被调用的次数。Redis 3.0.0 中的默认值是 10 ,代表每秒钟调用 10 次后台任务。
hz 调大将会提高 Redis 主动淘汰的频率,如果你的 Redis 存储中包含很多冷数据占用内存过大的话,可以考虑将这个值调大,但 Redis 作者建议这个值不要超过 100 。我们实际线上将这个值调大到 100 ,观察到 CPU 会增加 2% 左右,但对冷数据的内存释放速度确实有明显的提高(通过观察 keyspace 个数和 used_memory 大小)。
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,是一个高级的分布式协调 Redis 客服端,能帮助用户在分布式环境中轻松实现一些 Java 的对象。促进使用者对 Redis 的关注分离,从而让使用者能够将精力更集中地放在处理业务逻辑上。
②Jedis,是 Redis 的 Java 实现的客户端,其 API 提供了比较全面的 Redis 命令的支持。
Jedis 功能较为简单。
③Lettuce,是一个可伸缩线程安全的 Redis 客户端。多个线程可以共享同一个 RedisConnection 。它利用优秀 Netty NIO 框架来高效地管理多个连接。
Redis 官方推荐使用 Redisson 或 Jedis 。
17、如何使用Redis实现分布式锁?
Redis实现分布式锁,需要考虑如下几个方面:
①正确的获得锁
set 指令附带 nx 参数,保证有且只有一个进程获得到。
②正确的释放锁
使用 Lua 脚本,比对锁持有的是不是自己。如果是,则进行删除来释放。
③超时的自动释放锁
set 指令附带 expire 参数,通过过期机制来实现超时释放。
④未获得到锁的等待机制
sleep 或者基于 Redis 的订阅 Pub/Sub 机制。
⑤【可选】锁的重入性
通过 ThreadLocal 记录是第几次获得相同的锁。
1)有且第一次计数为 1 && 获得锁时,才向 Redis 发起获得锁的操作。 2)有且计数为 0 && 释放锁时,才向 Redis 发起释放锁的操作。
⑥锁超时的处理
一般情况下,可以考虑告警 + 后台线程自动续锁的超时时间。通过这样的机制,保证有且仅有一个线程,正在持有锁。
⑦Redis分布式锁丢失问题
具体看「方案二:Redlock」。
18、什么是 Redis 事务?
和众多其它数据库一样,Redis 作为 NoSQL 数据库也同样提供了事务机制。在 Redis 中,MULTI / EXEC / DISCARD / WATCH 这四个命令是我们实现事务的基石。相信对有关系型数据库开发经验的开发者而言这一概念并不陌生,即便如此,我们还是会简要的列出 Redis 中事务的实现特征:
①、在事务中的所有命令都将会被串行化的顺序执行,事务执行期间,Redis 不会再为其它客户端的请求提供任何服务,从而保证了事物中的所有命令被原子的执行。
②、和关系型数据库中的事务相比,在 Redis 事务中如果有某一条命令执行失败,其后的命令仍然会被继续执行。
③、我们可以通过 MULTI 命令开启一个事务,有关系型数据库开发经验的人可以将其理解为 “BEGIN TRANSACTION” 语句。在该语句之后执行的命令,都将被视为事务之内的操作,最后我们可以通过执行 EXEC / DISCARD 命令来提交 / 回滚该事务内的所有操作。这两个 Redis 命令,可被视为等同于关系型数据库中的 COMMIT / ROLLBACK 语句。
④、在事务开启之前,如果客户端与服务器之间出现通讯故障并导致网络断开,其后所有待执行的语句都将不会被服务器执行。然而如果网络中断事件是发生在客户端执行 EXEC 命令之后,那么该事务中的所有命令都会被服务器执行。
19、什么是Redis主从同步?
Redis 的主从同步(replication)机制,允许 Slave 从 Master 那里,通过网络传输拷贝到完整的数据备份,从而达到主从机制。
① 主数据库可以进行读写操作,当发生写操作的时候自动将数据同步到从数据库,而从数据库一般是只读的,并接收主数据库同步过来的数据。
② 一个主数据库可以有多个从数据库,而一个从数据库只能有一个主数据库。
③ 第一次同步时,主节点做一次 bgsave 操作,并同时将后续修改操作记录到内存 buffer ,待完成后将 RDB 文件全量同步到复制节点,复制节点接受完成后将 RDB 镜像加载到内存。加载完成后,再通知主节点将期间修改的操作记录同步到复制节点进行重放就完成了同步过程。
?好处
通过 Redis 的复制功,能可以很好的实现数据库的读写分离,提高服务器的负载能力。主数据库主要进行写操作,而从数据库负责读操作。
内容总结
以上是互联网集市为您收集整理的Redis(面试)相关知识点(较全)全部内容,希望文章能够帮你解决Redis(面试)相关知识点(较全)所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。