Redis 学完了,于是就在网上搜罗了一些高频面试题,并写出正确的解答方式,希望能帮助各位面试成功~~~
建议收藏, 后期如果遇到其它的问题, 我会继续在这片文章中追加的!
1、什么是Redis?简述它的优缺点?
- 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适合的场景主要局限在较小数据量的高性能操作和运算上。
2、Redis和 MySQL 有啥区别?
- MySQL 是关系型数据库,主要用于存放持久化数据,将数据存储在硬盘中,读取速度较慢。
- Redis是NOSQL,即非关系型数据库,也是缓存数据库,即将数据存储在缓存中,缓存的读取速度快,能够大大的提高运行效率,但是保存时间有限
- 在类型上MySQL 是关系型数据库,而Redis是缓存数据库;
- 作用上MySQL 用于持久化的存储数据到硬盘,而Redis用于存储使用较为频繁的数据到缓存中
3、Redis为啥比MySQL快?
- Redis是基于内存存储的,MySQL是基于磁盘存储的
- Redis存储的是
key-value
格式的数据,而MySQL引擎的底层实现是B+Tree 。即:Redis 是非关系型数据库, MySql 是关系型数据库 - MySQL数据存储是存储在表中,查找数据时要先对表进行全局扫描或者根据索引查找,这涉及到磁盘的查找,磁盘查找如果是按条点查找可能会快点,但是顺序查找就比较慢;而Redis不用这么麻烦,本身就是存储在内存中,会根据数据在内存的位置直接取出。
4、Redis支持哪几种数据类型?
- 字符串(strings)
- 散列(hashes)
- 列表(lists)
- 集合(sets)
- 有序集合(sorted sets)
5、 Redis 的RDB 和 AOF 有什么区别?
RDB: RDB是在指定的时间间隔内将内存中的数据集快照写入磁盘,也就是行话讲的Snapshot快照,它恢复时是将快照文件直接读到内存里。Redis会单独创建(fork)一个子进程来进行持久化,会先将数据写入到一个临时文件中,待持久化过程都结束了,再用这个临时文件替换上次持久化好的文件。整个过程中,主进程是不进行任何IO操作的。这就确保了极高的性能。如果需要进行大规模数据的恢复,且对于数据恢复的完整性不是非常敏感,那RDB方式要比AOF方式更加的高效。RDB的缺点是最后一次持久化后的数据可能丢失。
AOF: AOF以日志的形式来记录每个写操作,将Redis执行过的所有指令记录下来(读操作不记录),只许追加文件但不可以改写文件,redis启动之初会读取该文件重新构建数据,换言之,redis重启的话就根据日志文件的内容将写指令从前到后执行一次以完成数据的恢复工作,但是Aof 运行效率要慢于 rdb
6、Redis AOF不也要把日志写到磁盘么,那和MySQL的IO有啥区别,凭啥Redis就快?
- Redis AOF 只有在写入日志的时候才使用磁盘IO, 而在读写数据的时候是在内存中进行的, 所以速度非常快。而 MySql 的读写数据都是在磁盘上进行的, 所以这是本质的区别!
7、为什么Redis 是使用单线程,而没有使用多线程, 使用多线程不是更快吗?
- 我们首先要明白,Redis很快!官方表示,因为Redis是基于内存的操作,CPU不是Redis的瓶颈,
Redis的瓶颈最有可能是机器内存的大小或者网络带宽
。既然单线程容易实现,而且CPU不会成为瓶颈,那就顺理成章地采用单线程的方案了!Redis是基于内存的,采用的是单进程单线程模型的 KV 数据库,由C语言编写,官方提供的数据是可以达到100000+的QPS(每秒内查询次数)。这个数据不比采用单进多线程的同样基于内存的 KV数据库 Memcached 差!
8、Redis有哪几种数据淘汰策略?
- noeviction:返回错误当内存限制达到并且客户端尝试执行会让更多内存被使用的命令(大部分的写入指令,但DEL和几个例外)
- allkeys-lru: 尝试回收最少使用的键(LRU),使得新添加的数据有空间存放。
- volatile-lru:尝试回收最少使用的键(LRU),但仅限于在过期集合的键,使得新添加的数据有空间存放。
- allkeys-random: 回收随机的键使得新添加的数据有空间存放。
- volatile-random:回收随机的键使得新添加的数据有空间存放,但仅限于在过期集合的键。
- volatile-ttl:回收在过期集合的键,并且优先回收存活时间(TTL)较短的键,使得新添加的数据有空间存放。
9、一个字符串类型的值能存储最大容量是多少?
- 512M
10、说说Redis哈希槽的概念?
- Redis集群没有使用一致性hash,而是引入了哈希槽的概念,Redis集群有 16384 个哈希槽,每个key通过CRC16校验后对16384取模来决定放置哪个槽,集群的每个节点负责一部分hash槽。
11、Redis集群的主从复制模型是怎样的?
- 为了使在部分节点失败或者大部分节点无法通信的情况下集群仍然可用,所以集群使用了主从复制模型,每个节点都会有N-1个复制品.
12、Redis集群会有写操作丢失吗?为什么?
- Redis并不能保证数据的强一致性,这意味这在实际中集群在特定的条件下可能会丢失写操作。
13、Redis集群最大节点个数是多少?
- 16384个。
14、Redis集群如何选择数据库?
- Redis集群目前无法做数据库选择,默认在0数据库。
15、遇到缓存一致性问题,你怎么解决的?
由于缓存和数据库不属于同一个数据源,本质上非原子操作,所以是无法保证强一致性的,只能去实现
最终一致性。
解决方案:
- 延时双删:先更新数据库同时删除缓存,等2秒后再删除一次缓存,等到读的时候在回写到缓存。
- 利用工具(canal)将数据库的binlog日志采集发送到MQ中,然后通过ACK机制确认处理删除缓存
16、Redis中的管道有什么用?
- 一次请求/响应服务器能实现处理新的请求即使旧的请求还未被响应。这样就可以将多个命令发送到服务器,而不用等待回复,最后在一个步骤中读取该答复。
- 这就是管道(pipelining),是一种几十年来广泛使用的技术。例如许多POP3协议已经实现支持这个功能,大大加快了从服务器下载新邮件的过程。
17、怎么理解Redis事务?
- 事务是一个单独的隔离操作:事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。
- 事务是一个原子操作:事务中的命令要么全部被执行,要么全部都不执行。
18、Redis事务相关的命令有哪几个?
- MULTI、EXEC、DISCARD、WATCH
19、Redis key的过期时间和永久有效分别怎么设置?
- EXPIRE和PERSIST命令
20、Redis回收进程如何工作的?
- 一个客户端运行了新的命令,添加了新的数据。Redi检查内存使用情况,如果大于maxmemory的限制, 则根据设定好的策略进行回收。
一个新的命令被执行,等等。 - 所以我们不断地穿越内存限制的边界,通过不断达到边界然后不断地回收回到边界以下。如果一个命令的结果导致大量内存被使用(例如很大的集合的交集保存到一个新的键),不用多久内存限制就会被这个内存使用量超越
21、Redis常见的性能问题都有哪些?如何解决?
- Master写内存快照,save命令调度rdbSave函数,会阻塞主线程的工作,当快照比较大时对性能影响是非常大的,会间断性暂停服务,所以Master最好不要写内存快照。
- Master AOF持久化,如果不重写AOF文件,这个持久化方式对性能的影响是最小的,但是AOF文件会不断增大,AOF文件过大会影响Master重启的恢复速度。Master最好不要做任何持久化工作,包括内存快照和AOF日志文件,特别是不要启用内存快照做持久化,如果数据比较关键,某个Slave开启AOF备份数据,策略为每秒同步一次。
- Master调用BGREWRITEAOF重写AOF文件,AOF在重写的时候会占大量的CPU和内存资源,导致服务load过高,出现短暂服务暂停现象。
- Redis主从复制的性能问题,为了主从复制的速度和连接的稳定性,Slave和Master最好在同一个局域网内。
22、Memcache与Redis的区别都有哪些?
- 存储方式不同,Memcache是把数据全部存在内存中,数据不能超过内存的大小,断电后数据库会挂掉。Redis有部分存在硬盘上,这样能保证数据的持久性。
- 数据支持的类型不同memcahe对数据类型支持相对简单,redis有复杂的数据类型。
- 使用底层模型不同 它们之间底层实现方式以及与客户端之间通信的应用协议不一样。Redis直接自己构建了VM机制,因为一般的系统调用系统函数的话,会浪费一定的时间去移动和请求。
- 支持的value大小不一样redis最大可以达到1GB,而memcache只有1MB。
23、如何选择合适的持久化方式?
- 一般来说, 如果想达到足以媲美PostgreSQL的数据安全性,你应该同时使用两种持久化功能。在这种情况下,当 Redis 重启的时候会优先载入AOF文件来恢复原始的数据,因为在通常情况下AOF文件保存的数据集要比RDB文件保存的数据集要完整。
- 如果你非常关心你的数据, 但仍然可以承受数分钟以内的数据丢失,那么你可以只使用RDB持久化。
- 有很多用户都只使用AOF持久化,但并不推荐这种方式,因为定时生成RDB快照(snapshot)非常便于进行数据库备份, 并且 RDB 恢复数据集的速度也要比AOF恢复的速度要快,除此之外,使用RDB还可以避免AOF程序的bug。 4、如果你只希望你的数据在服务器运行的时候存在,你也可以不使用任何持久化方式。
24、 什么是 RedLock?
Redis 官方站提出了一种权威的基于 Redis 实现分布式锁的方式名叫 Redlock,此种方式比原先的单节点的方法更安全。它可以保证以下特性:
- 安全特性:互斥访问,即永远只有一个 client 能拿到锁
- 避免死锁:最终 client 都可能拿到锁,不会出现死锁的情况,即使原本锁住某资源的 client crash 了或者出现了网络分区
- 容错性:只要大部分 Redis 节点存活就可以正常提供服务
25、说一下你对缓存雪崩、击穿、穿透的理解
- 这个请看我的另外一篇讲解,这里不在赘述了 Redis的缓存穿透和雪崩问题,以及解决方案
暂无评论