Redis面试题

Posted toria

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Redis面试题相关的知识,希望对你有一定的参考价值。

1.什么是Redis?

   Redis是一个key-value 数据库,非关系型数据库(nosql),整个数据库统统加载在内存当中进行操作,具有很高的存取性能,一般用作缓存数据库,减少正常存储数据库的压力。

  因为是纯内存操作,Redis的性能非常出色,每秒可以处理超过 10万次读写操作,是已知性能最快的Key-Value DB。

  Redis的出色之处不仅仅是性能,Redis最大的魅力是支持保存多种数据结构。

  Redis的主要缺点是数据库容量受到物理内存的限制,不能用作海量数据的高性能读写,因此Redis适合的场景主要局限在较小数据量的高性能操作和运算上

2. Redis好处?

  (1) 速度快,因为数据存在内存中。类似于HashMap,HashMap的优势就是查找和操作的时间复杂度都是O(1)

  (2) 支持丰富数据类型,支持string(字符串类型),list(列表类型),set(集合类型),sorted set(有序集合类型),hash(散列类型)

  (3) 支持事务,操作都是原子性,所谓的原子性就是对数据的更改要么全部执行,要么全部不执行

  (4) 丰富的特性:可用于缓存,消息,按key设置过期时间,过期后将会自动删除

3.redis相比memcached有哪些优势?

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

4.Redis支持的数据类型?

  • String(字符串类型)
    • string类型是Redis最基本的数据类型,一个键最大能存储512MB。
    • set key value 设置值、 get key 获取值、 incr key  加一、  decr key 减一
  • hash(哈希)
    • Redis hash是一个string类型的field和value的映射表,hash特别适合用于存储对象。
    • hset  key field value    设置值
    • hget  key field   获取值
    • hincrby key field num  设置增数量
  • list(列表)
    • Redis 列表是简单的字符串列表,按照插入顺序排序
    • lpush list a b c d  (从list左边添加元素)、 rpush list 1 2 3 4  (从list右边添加元素)
    • lrange list 0 -1(从0 到 -1 元素查看:也就表示查看所有)
    • lpop list (从list左边取,删除)、  rpop list (从list右边取,删除)
  • set(集合)
    • Redis的Set是string类型的无序集合。集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。
    • sadd set1 a b c d d    (向set1中添加元素) 元素不重复
    • smembers set1(查询元素)、  srem set1 a(删除元素)
  • sorted set(zset,有序集合)
    • Redis zset 和 set 一样也是string类型元素的集合,且不允许重复的成员。不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。

 

    • zadd zset1 1 a 2 b 3 c (添加元素 zadd key score member,这里添加元素a:1分、元素b:2分、元素c:3分 )
    • zrange zset1  0  -1   (查看zset1的所有元素,默认从小到大)
    • zrange zset1  0  -1  withscores  (查看zset1的所有元素,包括分数score)
    • zrevrange zset1 0 -1                  (查看zset1的所有元素,从大到小)
    • zincrby zset1 5 a                        (对zset1的a元素增加5分)

5.什么是Redis持久化?Redis有哪几种持久化方式?优缺点是什么?

  持久化就是把内存的数据写到磁盘中去,防止服务宕机了内存数据丢失

  (Redis 数据都放在内存中如果机器挂掉,内存的数据就不存在。所以需要做持久化,将内存中的数据保存在磁盘,下一次启动的时候就可以恢复数据到内存中。

 

  Redis 提供了两种持久化方式:RDB(默认) 和AOF

  • RDB :快照形式  ,定期将当前时刻的数据保存磁盘中。会产生一个dump.rdb文件
    • 特点:性能较好,数据备份。但可能会存在数据丢失。
  • AOF :append only file  (所有对redis的操作命令记录在aof文件中),恢复数据,重新执行一遍即可。
    • 特点:每秒保存,数据比较完整。但耗费性能。  

  【注】如果两个都配了优先加载AOF。(同时开启两个持久化方案,则按照 AOF的持久化放案恢复数据。)

4.为什么redis需要把所有数据放到内存中?

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

5.Redis是单进程单线程的。

   redis利用队列技术将并发访问变为串行访问,消除了传统数据库串行控制的开销

6.Redis有哪几种数据淘汰策略?

  作为缓存系统都要定期清理无效数据,就需要一个主键失效和淘汰策略。
  在Redis当中,有生存期的key被称为volatile。在创建缓存时,要为给定的key设置生存期,当key过期的时候(生存期为0),它可能会被删除。

  更新生存时间:可以对一个已经带有生存时间的 key 执行EXPIRE命令,新指定的生存时间会取代旧的生存时间

  最大缓存配置:在 redis 中,允许用户设置最大使用内存大小 server.maxmemory,默认为0,没有指定最大缓存,如果有新的数据添加,超过最大内存,则会使redis崩溃,所以一定要设置。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:禁止驱逐数据,永不回收数据

  问题:mysql里有2000w数据,redis中只存20w的数据,如何保证redis中的数据都是热点数据?

    redis内存数据集大小上升到一定大小的时候,就会施行数据淘汰策略。

7.Redis 有哪些架构模式?讲讲各自的特点

  主从模式(redis2.8版本之前的模式)、哨兵sentinel模式(redis2.8及之后的模式)、redis cluster模式(redis3.0版本之后)
 
(1)主从模式
  主从模式指的是使用一个redis实例作为主机,其余的实例作为备份机。主机和从机的数据完全一致,主机支持数据的写入和读取等各项操作,而从机则只支持与主机数据的同步和读取,也就是说,客户端可以将数据写入到主机,由主机自动将数据的写入操作同步到从机。主从模式很好的解决了数据备份问题,并且由于主从服务数据几乎是一致的,因而可以将写入数据的命令发送给主机执行,而读取数据的命令发送给不同的从机执行,从而达到读写分离的目的。如下所示主机redis-A分别有redis-B、redis-C、redis-D、redis-E四个从机:
技术图片

  优点:

  1. 解决数据备份问题
  2. 做到读写分离,提高服务器性能

  缺点:

  1. 每个客户端连接redis实例的时候都是指定了ip和端口号的,如果所连接的redis实例因为故障下线了,而主从模式也没有提供一定的手段通知客户端另外可连接的客户端地址,因而需要手动更改客户端配置重新连接。
  2. 主从模式下,如果主节点由于故障下线了,那么从节点因为没有主节点而同步中断,因而需要人工进行故障转移工作。
  3. 无法实现动态扩容。
 (2)哨兵模式(sentinel)
 
   由一个或多个Sentinel实例组成的Sentinel系统可以监视任意多个主服务器,以及这些主服务器属下的所有从服务器,并在被监视的主服务器进入下线状态时,自动将下线主服务器属下的某个从服务器升级为新的主服务器。
  对于一组主从节点,sentinel只是在其外部额外添加的一组用于监控作用的redis实例。在主从节点和sentinel节点集合配置好之后,sentinel节点之间会相互发送消息,以检测其余sentinel节点是否正常工作,并且sentinel节点也会向主从节点发送消息,以检测监控的主从节点是否正常工作。

  优点:

  • 如果主服务器异常,则会进行主从转换,将其中一个从服务器升级为为主服务器,将之前的主服务器作为从服务器。

  缺点:

  1. 如果是从节点下线了,sentinel是不会对其进行故障转移的,连接从节点的客户端也无法获取到新的可用从节点
  2. 无法实现动态扩容
(3)集群模式(cluster)
技术图片

  在这个图中,每一个蓝色的圈都代表着一个redis的服务器节点。它们任何两个节点之间都是相互连通的。客户端可以与任何一个节点相连接,然后就可以访问集群中的任何一个节点。对其进行存取和其他操作。

  一般集群建议搭建三主三从架构,三主提供服务,三从提供备份功能。

 

  每一个节点都存有这个集群所有主节点以及从节点的信息。

    它们之间通过互相的ping-pong判断是否节点可以连接上。如果有一半以上的节点去ping一个节点的时候没有回应,集群就认为这个节点宕机了,然后去连接它的备用节点。如果某个节点和所有从节点全部挂掉,我们集群就进入faill状态。还有就是如果有一半以上的主节点宕机,那么我们集群同样进入faill状态。这就是我们的redis的投票机制,具体原理如下图所示:

技术图片
 投票过程:集群中所有master参与,如果半数以上master节点与master节点通信超时(cluster-node-timeout),认为当前master节点挂掉。

  优点:

  1. 有效的解决了redis在分布式方面的需求
  2. 遇到单机内存,并发和流量瓶颈等问题时,可采用Cluster方案达到负载均衡的目的
  3. 可实现动态扩容
  4. P2P模式,无中心化
  5. 通过Gossip协议同步节点信息
  6. 自动故障转移、Slot迁移中数据可用

  缺点:

  1. 为了性能提升,客户端需要缓存路由表信息。
  2. 节点发现、reshard操作不够自动化。

 

推荐redis三种模式对比

 

参考 redis面试题

  30道Redis面试题,面试官能问的都被我找到了

以上是关于Redis面试题的主要内容,如果未能解决你的问题,请参考以下文章

redis 常见的面试题,既是面试题也是知识点

Redis面试题:持久化文件与淘汰策略

面试题:2018最全Redis面试题整理

锁屏面试题百日百刷-Redis篇

锁屏面试题百日百刷-Redis篇

50道Redis面试题及答案整理,史上最全!