全网最新、最全的 Redis 面试题
1. 什么是 redis?
Redis 是一个基于内存的高性能 key-value 数据库。
2. Reids 的特点
Redis 本质上是一个 Key-Value 类型的内存数据库,很像
memcached,整个数据库统统加载在内存当中进行操作,定期通过异步操作把数据库数据 flush 到硬盘上进行保存。
因为是纯内存操作, Redis 的性能非常出色, 每秒可以处理超过 10 万次读写操作,是已知性能最快的 Key-Value DB。
Redis 的出色之处不仅仅是性能, Redis 最大的魅力是支持保存多种数据结构,此外单个 value 的最大限制是 1GB,不像 memcached 只能保存1MB 的数据,因此 Redis 可以用来实现很多有用的功能。
比方说用他的 List 来做 FIFO 双向链表,实现一个轻量级的高性 能消息队列服务,用他的 Set 可以做高性能的 tag 系统等等。另外 Redis 也可以对存入的 Key-Value 设置 expire 时间,因此也可以被当作一 个功能加强版的 memcached 来用。
Redis 的主要缺点是数据库容量受到物理内存的限制,不能用作海量数据的高性能读写,因此 Redis 适合的场景主要局限在较小数据量的高性能操作和运算上。
3. 使用 redis 有哪些好处?
- 速度快,因为数据存在内存中,类似于 HashMap, HashMap 的优势就是查找和操作的时间复杂度都是 O(1)
- 支持丰富数据类型, 支持 string, list, set, sorted set, hash
- 支持事务,操作都是原子性,所谓的原子性就是对数据的更改要么全部执行,要么全部不执行
- 丰富的特性:可用于缓存,消息,按 key 设置过期时间,过期后将会自动删除
- memcached 所有的值均是简单的字符串, redis 作为其替代者, 支持更为丰富的数据类型
- redis 的速度比 memcached 快很多
- redis 可以持久化其数据
- 存储方式 Memecache 把数据全部存在内存之中,断电后会挂掉,数据不能超过内存大小。 Redis 有部份存在硬盘上, 这样能保证数据的持久性。
- 数据支持类型 Memcache 对数据类型支持相对简单。 Redis 有复杂的数据类型。
- 使用底层模型不同 它们之间底层实现方式 以及与客户端之间通信的应用协议不一样。 Redis 直接自己构建了 VM 机制 , 因为一般的系统调用系统函数的话,会浪费一定的时间去移动和请求。
4.redis 相比 memcached 有哪些优势?
- 存储方式 Memecache 把数据全部存在内存之中,断电后会挂掉,数据不能超过内存大小。 Redis 有部份存在硬盘上, 这样能保证数据的持久性。
- 数据支持类型 Memcache 对数据类型支持相对简单。 Redis 有复杂的数据类型。
- 使用底层模型不同 它们之间底层实现方式 以及与客户端之间通信的应用协议不一样。 Redis 直接自己构建了 VM 机制 , 因为一般的系统调用系统函数的话,会浪费一定的时间去移动和请求。
5.Memcache 与 Redis 的区别都有哪些?
- 存储方式 Memecache 把数据全部存在内存之中,断电后会挂掉,数据不能超过内存大小。 Redis 有部份存在硬盘上, 这样能保证数据的持久性。
- 数据支持类型 Memcache 对数据类型支持相对简单。 Redis 有复杂的数据类型。
- 使用底层模型不同 它们之间底层实现方式 以及与客户端之间通信的应用协议不一样。 Redis 直接自己构建了 VM 机制 , 因为一般的系统调用系统函数的话,会浪费一定的时间去移动和请求。
6.redis 常见性能问题和解决方案:
- Master 写内存快照, save 命令调度 rdbSave 函数,会阻塞主线程的工作,当快照比较大时对性能影响是非常大的,会间断性暂停服务,所以Master 最好不要写内存快照。
- Master AOF 持久化,如果不重写 AOF 文件,这个持久化方式对性能的影响是最小的,但是 AOF 文件会不断增大, AOF 文件过大会影响Master 重启的恢复速度。Master 最好不要做任何持久化工作, 包括内存快照和 AOF 日志文件,特别是不要启用内存快照做持久化,如果数据比较关键,某个 Slave 开启 AOF 备份数据,策略为每秒同步一次。
- Master 调用 BGREWRITEAOF 重写 AOF 文件, AOF 在重写的时候会占大量的 CPU 和内存资源,导致服务 load 过高,出现短暂服务暂停现象。