redis面试题

发布时间 2023-03-23 16:38:30作者: 杨阳洋^_^!

redis面试题

1.什么是Redis?

  Redis(Remote Dictionary Server) 是一个使用 C 语言编写的,开源的(BSD许
可)高性能非关系型(NoSQL)的键值对数据库。

2.Redis有哪些优缺点

优点
  1.读写性能优异, Redis能读的速度是110000次/s,写的速度是81000次/s。
  2.支持数据持久化,支持AOF和RDB两种持久化方式。
  3.支持事务,Redis的所有操作都是原子性的,同时Redis还支持对几个操作合并后的原子性执行。
  4.数据结构丰富,除了支持string类型的value外还支持hash、set、zset、list等数据结构。
  5.支持主从复制,主机会自动将数据同步到从机,可以进行读写分离。
缺点
  1.数据库容量受到物理内存的限制,不能用作海量数据的高性能读写,因此Redis
  2.适合的场景主要局限在较小数据量的高性能操作和运算上。
  3.Redis 不具备自动容错和恢复功能,主机从机的宕机都会导致前端部分读写请求失败,需要等待机器重启或者手动切换前端的IP才能恢复。
  4.主机宕机,宕机前有部分数据未能及时同步到从机,切换IP后还会引入数据不一致的问题,降低了系统的可用性。
  5.Redis 较难支持在线扩容,在集群容量达到上限时在线扩容会变得很复杂。为避免这一问题,运维人员在系统上线时必须确保有足够的空间,这对资源造成了很大的
浪费。

3.为什么要用 Redis 而不用 map/guava 做缓存?

  缓存分为本地缓存和分布式缓存。以 Java 为例,使用自带的 map 或者 guava实现的是本地缓存,最主要的特点是轻量以及快速,生命周期随着 jvm 的销毁
而结束,并且在多实例的情况下,每个实例都需要各自保存一份缓存,缓存不具有一致性。
  使用 redis 或 memcached 之类的称为分布式缓存,在多实例的情况下,各实例共用一份缓存数据,缓存具有一致性。缺点是需要保持 redis 或 memcached
服务的高可用,整个程序架构上较为复杂。

4.Redis为什么这么快

  1、完全基于内存,绝大部分请求是纯粹的内存操作,非常快速。数据存在内存中,类似于 HashMap,HashMap 的优势就是查找和操作的时间复杂度都是O(1);
  2、数据结构简单,对数据操作也简单,Redis 中的数据结构是专门进行设计的;
  3、采用单线程,避免了不必要的上下文切换和竞争条件,也不存在多进程或者多线程导致的切换而消耗 CPU,不用去考虑各种锁的问题,不存在加锁释放锁
操作,没有因为可能出现死锁而导致的性能消耗;
  4、使用多路 I/O 复用模型,非阻塞 IO;
  5、使用底层模型不同,它们之间底层实现方式以及与客户端之间通信的应用协议不一样,Redis 直接自己构建了 VM 机制 ,因为一般的系统调用系统函数的
话,会浪费一定的时间去移动和请求;

5.Redis有哪些数据类型

Redis主要有5种数据类型,包括String,List,Set,Zset,Hash,满足大部分的使用要求  
  STRING:字符串、整数或者浮点数对整个字符串或者字符串的其中一部分执行操作,对整数和浮点数执行自增或者自减操作,做简单的键值对缓存
  LIST:列表从两端压入或者弹出元素对单个或者多个元素进行修剪,只保留一个范围内的元素存储一些列表型的数据结构,类似粉丝列表、文章的评论列表之类的数据
  SET:无序集合
  HASH:包含键值对的无序散列表
  ZSET:有序集合
 

6.什么是Redis持久化?

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

7.Redis 的持久化机制是什么?各自的优缺点?

Redis 提供两种持久化机制 RDB(默认) 和 AOF 机制:
  RDB:是Redis DataBase缩写快照
  RDB是Redis默认的持久化方式。按照一定的时间将内存的数据以快照的形式保存到硬盘中,对应产生的数据文件为dump.rdb。通过配置文件中的save参数来
定义快照的周期。
  RDB优点:
    1、只有一个文件 dump.rdb,方便持久化。
    2、容灾性好,一个文件可以保存到安全的磁盘。
    3、性能最大化,fork 子进程来完成写操作,让主进程继续处理命令,所以是IO 最大化。使用单独子进程来进行持久化,主进程不会进行任何 IO 操作,保证了
  redis 的高性能
    4.相对于数据集大时,比 AOF 的启动效率更高。
  RDB缺点:
    1、数据安全性低。RDB 是间隔一段时间进行持久化,如果持久化之间 redis 发生故障,会发生数据丢失。所以这种方式更适合数据要求不严谨的时候)
    2、AOF(Append-only file)持久化方式: 是指所有的命令行记录以 redis 命令请 求协议的格式完全持久化存储)保存为 aof 文件。
  AOF:持久化
  AOF持久化(即Append Only File持久化),则是将Redis执行的每次写命令记录到单独的日志文件中,当重启Redis会重新将持久化的日志中文件恢复数据。
当两种方式同时开启时,数据恢复Redis会优先选择AOF恢复。
    AOF优点:
      1、数据安全,aof 持久化可以配置 appendfsync 属性,有 always,每进行一次 命令操作就记录到 aof 文件中一次。
      2、通过 append 模式写文件,即使中途服务器宕机,可以通过 redis-check-aof 工具解决数据一致性问题。
      3、AOF 机制的 rewrite 模式。AOF 文件没被 rewrite 之前(文件过大时会对命令 进行合并重写),可以删除其中的某些命令(比如误操作的 flushall))
    AOF缺点:
      1、AOF 文件比 RDB 文件大,且恢复速度慢。
      2、数据集大的时候,比 rdb 启动效率低。

8.如何选择合适的持久化方式

  1.一般来说, 如果想达到足以媲美PostgreSQL的数据安全性,你应该同时使用两种持久化功能。在这种情况下,当 Redis 重启的时候会优先载
入AOF文件来恢复原始的数据,因为在通常情况下AOF文件保存的数据集要比RDB文件保存的数据集要完整。
  2.如果你非常关心你的数据, 但仍然可以承受数分钟以内的数据丢失,那么你可以只使用RDB持久化。
  3.有很多用户都只使用AOF持久化,但并不推荐这种方式,因为定时生成RDB快照(snapshot)非常便于进行数据库备份, 并且 RDB 恢复数据
集的速度也要比AOF恢复的速度要快,除此之外,使用RDB还可以避免AOF程序的bug。
  4.如果你只希望你的数据在服务器运行的时候存在,你也可以不使用任何持久化方式。

9.Redis的过期键的删除策略

过期策略通常有以下三种:
  定时过期:每个设置过期时间的key都需要创建一个定时器,到过期时间就会立即清除。该策略可以立即清除过期的数据,对内存很友好;但是会占用大量的CPU资
源去处理过期的数据,从而影响缓存的响应时间和吞吐量。
  惰性过期:只有当访问一个key时,才会判断该key是否已过期,过期则清除。该策略可以最大化地节省CPU资源,却对内存非常不友好。极端情况可能出现大量的
过期key没有再次被访问,从而不会被清除,占用大量内存。定期过期:每隔一定的时间,会扫描一定数量的数据库的expires字典中一定数
量的key,并清除其中已过期的key。该策略是前两者的一个折中方案。通过调整定时扫描的时间间隔和每次扫描的限定耗时,可以在不同情况下使得CPU和内存资源达
到最优的平衡效果。
  Redis中同时使用了惰性过期和定期过期两种过期策略。