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 相关信息
- 博文不易,辛苦各位猿友点个关注和赞,感谢
网友评论