今天给大家整理了一些Redis面试题
1.Redis的特点?
Redis是由意大利人SalvatoreSanfilippo(网名:antirez)开发的一款内存高速缓存数据库。Redis全称为:RemoteDictionaryServer(远程数据服务),该软件使用C语言编写,典型的NoSQL数据库服务器,Redis是一个key-value存储系统,它支持丰富的数据类型,如:string、list、set、zset(sortedset)、hash。Redis本质上是一个Key-Value类型的内存数据库,很像memcached,整个数据库统统加载在内存当中进行操作,定期通过异步操作把数据库数据flush到硬盘上进行保存。因为是纯内存操作,Redis的性能非常出色,每秒可以处理超过10万次读写操作,是已知性能最快的Key-ValueDB。Redis的出色之处不仅仅是性能,Redis最大的魅力是支持保存多种数据结构,此外单个value的最大限制是1GB,不像memcached只能保存1MB的数据,另外Redis也可以对存入的Key-Value设置expire时间。Redis的主要缺点是数据库容量受到物理内存的限制,不能用作海量数据的高性能读写,因此Redis适合的场景主要局限在较小数据量的高性能操作和运算上。
2.为什么redis需要把所有数据放到内存中?
Redis为了达到最快的读写速度将数据都读到内存中,并通过异步的方式将数据写入磁盘。所以redis具有快速和数据持久化的特征。如果不将数据放在内存中,磁盘I/O速度为严重影响redis的性能。在内存越来越便宜的今天,redis将会越来越受欢迎。如果设置了最大使用的内存,则数据已有记录数达到内存限值后不能继续插入新值。
3.Redis常见的性能问题都有哪些?如何解决?
(1)、Master写内存快照,save命令调度rdbSave函数,会阻塞主线程的工作,当快照比较大时对性能影响是非常大的,会间断性暂停服务,所以Master最好不要写内存快照。
(2)、MasterAOF持久化,如果不重写AOF文件,这个持久化方式对性能的影响是最小的,但是AOF文件会不断增大,AOF文件过大会影响Master重启的恢复速度。Master最好不要做任何持久化工作,
包括内存快照和AOF日志文件,特别是不要启用内存快照做持久化,如果数据比较关键,某个Slave开启AOF备份数据,策略为每秒同步一次。
(3)、Master调用BGREWRITEAOF重写AOF文件,AOF在重写的时候会占大量的CPU和内存资源,导致服务load过高,出现短暂服务暂停现象。
(4)、Redis主从复制的性能问题,为了主从复制的速度和连接的稳定性,Slave和Master最好在同一个局域网内
4.Redis最适合的场景有哪些?
(1)、会话缓存(SessionCache)
(2)、全页缓存(FPC)
(3)、队列
(4)、排行榜/计数器
(5)、发布/订阅
5.Memcache与Redis的区别都有哪些?
(1)、存储方式不同,Memcache是把数据全部存在内存中,数据不能超过内存的大小,断电后数据库会挂掉。Redis有部分存在硬盘上,这样能保证数据的持久性。
2)、数据支持的类型不同memcahe对数据类型支持相对简单,redis有复杂的数据类型。
(3)、使用底层模型不同它们之间底层实现方式以及与客户端之间通信的应用协议不一样。Redis直接自己构建了VM机制,因为一般的系统调用系统函数的话,会浪费一定的时间去移动和请求。
(4)、支持的value大小不一样redis最大可以达到1GB,而memcache只有1MB。
6.Redis用过RedisNX吗?Redis有哪几种数据结构?
反正我是不知道redisnx是什么,度娘也不清楚,如果面试中问道自己没有接触过或者没有听过的技术可以直接大胆的告诉他,没有接触过,或者没有听过。
Redis的数据结构有五种,分别是:
String——字符串
String数据结构是简单的key-value类型,value不仅可以是String,也可以是数字(当数字类型用Long可以表示的时候encoding就是整型,其他都存储在sdshdr当做字符串)。
Hash——字典
在Memcached中,我们经常将一些结构化的信息打包成hashmap,在客户端序列化后存储为一个字符串的值(一般是JSON格式),比如用户的昵称、年龄、性别、积分等。
List——列表
List说白了就是链表(redis使用双端链表实现的List),相信学过数据结构知识的人都应该能理解其结构。
Set——集合
Set就是一个集合,集合的概念就是一堆不重复值的组合。利用Redis提供的Set数据结构,可以存储一些集合性的数据。
SortedSet——有序集合
和Sets相比,SortedSets是将Set中的元素增加了一个权重参数score,使得集合中的元素能够按score进行有序排列,
1.带有权重的元素,比如一个游戏的用户得分排行榜
2.比较复杂的数据结构,一般用到的场景不算太多
7.Redis的优缺点
优点:
a)性能极高–Redis能支持超过K+每秒的读写频率。
b)丰富的数据类型–Redis支持二进制案例的Strings,Lists,Hashes,Sets及OrderedSets数据类型操作。
c)原子–Redis的所有操作都是原子性的,同时Redis还支持对几个操作全并后的原子性执行。
attention原子性定义:例如,A想要从自己的帐户中转0块钱到B的帐户里。那个从A开始转帐,到转帐结束的这一个过程,称之为一个事务。如果在A的帐户已经减去了0块钱的时候,忽然发生了意外,
比如停电什么的,导致转帐事务意外终止了,而此时B的帐户里还没有增加0块钱。那么,我们称这个操作失败了,要进行回滚。
回滚就是回到事务开始之前的状态,也就是回到A的帐户还没减0块的状态,B的帐户的原来的状态。此时A的帐户仍然有块,B的帐户仍然有块。
我们把这种要么一起成功(A帐户成功减少0,同时B帐户成功增加0),要么一起失败(A帐户回到原来状态,B帐户也回到原来状态)的操作叫原子性操作。如果把一个事务可看作是一个程序,它要么完整的被执行,要么完全不执行,这种特性就叫原子性。
d)丰富的特性–Redis还支持publish/subscribe,通知,key过期等等特性。
缺点:
a).由于是内存数据库,所以,单台机器,存储的数据量,跟机器本身的内存大小。虽然redis本身有key过期策略,但是还是需要提前预估和节约内存。如果内存增长过快,需要定期删除数据。
b).如果进行完整重同步,由于需要生成rdb文件,并进行传输,会占用主机的CPU,并会消耗现网的带宽。不过redis2.8版本,已经有部分重同步的功能,但是还是有可能有完整重同步的。比如,新上线的备机。
c).修改配置文件,进行重启,将硬盘中的数据加载进内存,时间比较久。在这个过程中,redis不能提供服务。
8.Redis的持久化
RDB持久化:该机制可以在指定的时间间隔内生成数据集的时间点快照(point-in-timesnapshot)。
AOF持久化:记录服务器执行的所有写操作命令,并在服务器启动时,通过重新执行这些命令来还原数据集。AOF文件中的命令全部以Redis协议的格式来保存,新命令会被追加到文件的末尾。Redis还可以在后台对AOF文件进行重写(rewrite),使得AOF文件的体积不会超出保存数据集状态所需的实际大小
无持久化:让数据只在服务器运行时存在。
同时应用AOF和RDB:当Redis重启时,它会优先使用AOF文件来还原数据集,因为AOF文件保存的数据集通常比RDB文件所保存的数据集更完整。
RDB的优缺点:
优点:RDB是一个非常紧凑(