美文网首页
Redis 常规面试题及解答(上)

Redis 常规面试题及解答(上)

作者: 小P聊技术 | 来源:发表于2021-02-23 08:31 被阅读0次

1 面试题

**1. 什么是redis ? **

Redis是现在最受欢迎的NoSQL数据库之一,Redis是一个使用ANSI C编写的开源、包含多种数据结构、支持网络、基于内存、可选持久性的键值对存储数据库,其具备如下特性:
    1> 基于内存运行,性能高效
    2> 支持分布式,理论上可以无限扩展
    3> key-value存储系统
  4> 开源的使用ANSI C语言编写、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API

**2. Redis 的数据类型 ? **

String
Hash
List
Set
Zset

**3. 使用 Redis 有哪些好处 ? **

1 读写性能优秀;
2 支持数据持久化,支持AOF和RDB两种持久化方式;
3 支持主从复制,主机可以自动将数据复制到从机上,可以实现读写分离;
4 数据结构丰富,支持多种数据的存储。

**4. Redis 相比 Memcached 有哪些优势 ? **

1 memcached所有的值均是简单的字符串,redis作为其替代者,支持更为丰富的数据类型
2 redis的速度比memcached快很多redis的速度比memcached快很多
3 redis可以持久化其数据redis可以持久化其数据

**5. Memcached 与 Redis 的区别都有哪些 ? **

1 数据类型不同,redis有五种(list set string hash zset),memcached只有一种string
2 Redis支持数据的备份,即master-slave模式的数据备份。
3 Redis支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用。
4 内存的使用率上memcached数据结构简单 只有一种string ,不用记录数据的类型。而reids需要记录

**6. Redis 是单进程单线程的吗?为何它那么快那么高效? **

单线程
单线程效率高原因:
    1> 纯内存操作
    2> 核心是基于非阻塞的 IO 多路复用机制
  3> 单线程反而避免了多线程的频繁上下文切换问题

**7. 一个字符串类型的值能存储最大容量是多少 ? **

512M

**8. Redis 的持久化机制是什么?各自的优缺点 ? **

RDB与AOF
RDB的优缺点:
 => 优点
            1> RDB文件小,非常适合定时备份,用于灾难恢复
            2> Redis加载RDB文件的速度比AOF快很多,因为RDB文件中直接存储的时内存数据,而AOF文件中存储的是一条条命令,需要重演命令。
 => 缺点
            1> RDB无法做到实时持久化,若在两次bgsave间宕机,则会丢失区间(分钟级)的增量数据,不适用于实时性要求较高的场景
            2> RDB的cow机制中,fork子进程属于重量级操作,并且会阻塞redis主进程,存在老版本的Redis不兼容新版本RDB格式文件的问题

AOF的优缺点:
 => 优点
            1> AOF只是追加写日志文件,对服务器性能影响较小,速度比RDB要快,消耗的内存较少

 => 缺点
            1> AOF方式生成的日志文件太大,需要不断AOF重写,进行瘦身。
            2> 即使经过AOF重写瘦身,由于文件是文本文件,文件体积较大(相比于RDB的二进制文件)。
            3> AOF重演命令式的恢复数据,速度显然比RDB要慢。

**9. Redis 常见性能问题和解决方案有哪些 ? **

1 Master 最好不要做任何持久化工作,如 RDB 内存快照和 AOF 日志文件
2 如果数据比较重要,某个 Slave 开启 AOF 备份数据,策略设置为每秒同步一次
3 为了主从复制的速度和连接的稳定性, Master 和 Slave 最好在同一个局域网内
4 尽量避免在压力很大的主库上增加从库
5 主从复制不要用图状结构,用单向链表结构更为稳定,
      即: Master <- Slave1 <- Slave2 <-Slave3…

**10. Redis 过期键的删除策略 ? **

1 定时删除
    在设置键的过期时间的同时,创建一个定时器,让定时器在键的过期时间来临时,立即执行对键的删除操作。
2 惰性删除
    放任过期键不管,每次从键空间中获取键时,检查该键是否过期,如果过期,就删除该键,如果没有过期,就返回该键。
3 定期删除
    每隔一段时间,程序对数据库进行一次检查,删除里面的过期键,至于要删除哪些数据库的哪些过期键,则由算法决定。

**11. Redis 的回收策略(淘汰策略) ? **

volatile-lru:从已设置过期时间的数据集(server.db[i].expires)中挑选最近最少使用的数据淘汰
volatile-ttl:从已设置过期时间的数据集(server.db[i].expires)中挑选将要过期的数据淘汰
volatile-random:从已设置过期时间的数据集(server.db[i].expires)中任意选择数据淘汰
allkeys-lru:从数据集(server.db[i].dict)中挑选最近最少使用的数据淘汰
allkeys-random:从数据集(server.db[i].dict)中任意选择数据淘汰
no-enviction(驱逐):禁止驱逐数据

**12. 为什么Redis 需要把所有数据放到内存中 ? **

Redis 为了达到最快的读写速度将数据都读到内存中,并通过异步的方式将数据写入磁盘。所以 redis 具有快速和数据持久化的特征。如果不将数据放在内存中,磁盘 I/O 速度为严重影响 redis 的性能。在内存越来越便宜的今天,redis 将会越来越受欢迎。如果设置了最大使用的内存,则数据已有记录数达到内存限值后不能继续插入新值。

**13. Redis 的同步机制了解么 ? **

一、全同步

全同步过程如下:

1)在slave启动时,会向master发送一条SYNC指令。
2)master收到这条指令后,会启动一个备份进程将所有数据写到rdb文件中去。
3)更新master的状态(备份是否成功、备份时间等),然后将rdb文件内容发送给等待中的slave。

注意,master并不会立即将rdb内容发送给slave。而是为每个等待中的slave注册写事件,当slave对应的socket可以发送数据时,再讲rdb内容发送给slave。

二、部分同步

当Redis的master/slave服务启动后,首先进行全同步。之后,所有的写操作都在master上,而所有的读操作都在slave上。因此写操作需要及时同步到所有的slave上,这种同步就是部分同步。

部分同步过程如下:

1)master收到一个操作,然后判断是否需要同步到salve。
2)如果需要同步,则将操作记录到aof文件中。
3)遍历所有的salve,将操作的指令和参数写入到savle的回复缓存中。
4)一旦slave对应的socket发送缓存中有空间写入数据,即将数据通过socket发出去。

原文链接:https://blog.csdn.net/look4liming/article/details/83013275

**14. Pipeline 有什么好处,为什么要用 Pipeline ? **

就是一个pipeline管道批量执行指令,可以节省多次IO往返的时间,但是如果指令间有依赖建议分批发送

**15. 是否使用过 Redis 集群,集群的原理是什么 ? **

1 Redis Sentinal 着眼于高可用,在 master 宕机时会自动将 slave 提升为master,继续提供服务。
2 Redis Cluster 着眼于扩展性,在单个 redis 内存不足时,使用 Cluster 进行分片存储。

**16. Redis 集群方案什么情况下会导致整个集群不可用 ? **

有A,B,C三个节点的集群,在没有复制模型的情况下,如果节点B失败了,那么整个集群就会以为缺少5501-11000这个范围的槽而不可用

**17. Redis 支持的 Java 客户端都有哪些?官方推荐用哪个 ? **

Redisson、Jedis、lettuce 等等,官方推荐使用 Redisson。

**18. Jedis 与 Redisson 对比有什么优缺点 ? **

1 Jedis是Redis的Java实现的客户端,其API提供了比较全面的Redis命令的支持;
2 Redisson实现了分布式和可扩展的Java数据结构,和Jedis相比,功能较为简单,不支持字符串操作,不支持排序、事务、管道、分区等Redis特性。Redisson的宗旨是促进使用者对Redis的关注分离,从而让使用者能够将精力更集中地放在处理业务逻辑上。

**19. Redis 如何设置密码及验证密码 ? **

设置密码:config set requirepass auskat
授权密码:auth auskat

**20. 说说 Redis 哈希槽的概念 ? **

Redis 集群中内置了 16384 个哈希槽,当需要在 Redis 集群中放置一个 key-value时,redis 先对 key 使用 crc16 算法算出一个结果,然后把结果对 16384 求余数,这样每个 key 都会对应一个编号在 0-16383 之间的哈希槽,redis 会根据节点数量大致均等的将哈希槽映射到不同的节点。

2 相关信息

  • 博文不易,辛苦各位猿友点个关注和赞,感谢

相关文章

网友评论

      本文标题:Redis 常规面试题及解答(上)

      本文链接:https://www.haomeiwen.com/subject/khkhfltx.html