分类 运维面试题 下的文章

Linux云计算交流群:720995729

Redis 有哪些特性?
答案:

  • 性能高, 读的速度是100000次/s,写的速度是80000次/s
  • 数据持久化,支持RDB 、AOF
  • 支持事务。通过MULTI和EXEC指令包起来。
  • 多种数据结构类型
  • 主从复制
  • 其他特性:发布/订阅、通知、key过期等

Redis 为什么这么快?
答案:

  • 完全基于内存,没有磁盘IO上的开销,异步持久化除外
  • 单线程,避免多个线程切换的性能损耗
  • 非阻塞的IO多路复用机制
  • 底层的数据存储结构优化,使用原生的数据结构提升性能。

Redis 底层的基础数据结构有哪些?

答案:

  • 字符串。没有采用C语言的传统字符串,而是自己实现的一个简单动态字符串SDS的抽象类型,并保存了长度信息。
  • 链表(linkedlist)。双向无环链表结构,每个链表的节点由一个listNode结构来表示,每个节点都有前置和后置节点的指针
  • 字典(hashtable)。保存键值对的抽象数据结构,底层使用hash表,每个字典带有两个hash表,供平时使用和rehash时使用。
  • 跳跃表(skiplist)。跳跃表是有序集合的底层实现之一。redis跳跃表由zskiplist和zskiplistNode组成,zskiplist用于保存跳跃表信息(表头、表尾节点、⻓度等),zskiplistNode用于表示表跳跃节点,每个跳跃表的层高都是1-32的随机数,在同一个跳跃表中,多个节点可以包含相同的分值,但是每个节点的成员对象必须是唯一的,节点按照分值大小排序,如果分值相同,则按照成员对象的大小排序。
  • 整数集合(intset)。用于保存整数值的集合抽象数据结构,不会出现重复元素,底层实现为数组。
  • 压缩列表(ziplist)。为节约内存而开发的顺序性数据结构,可以包含多个节点,每个节点可以保存一个字节数组或者整数值。

Redis 支持哪些数据类型?
答案:

  • 字符串对象string:int整数、embstr编码的简单动态字符串、raw简单动态字符串
  • 列表对象list:ziplist、linkedlist
  • 哈希对象hash:ziplist、hashtable
  • 集合对象set:intset、hashtable
  • 有序集合对象zset:ziplist、skiplist

Redis 常用的 5 种数据结构和应用场景?
答案:

  • String:缓存、计数器、分布式锁等
  • List:链表、队列、微博关注人时间轴列表等
  • Hash:用户信息、Hash 表等
  • Set:去重、赞、踩、共同好友等
  • Zset:访问量排行榜、点击量排行榜等

为什么采用单线程?
答案:官方回复,CPU不会成为Redis的制约瓶颈,Redis主要受内存、网络限制。例如,在一个普通的 Linux 系统上,使用pipelining 可以每秒传递 100 万个请求,所以如果您的应用程序主要使用 O(N) 或 O(log(N)) 命令,则几乎不会使用太多 CPU,属于IO密集型系统。

Redis 6.0 之后又改用多线程呢?
答案:Redis的多线程主要是处理数据的读写、协议解析。执行命令还是采用单线程顺序执行。主要是因为redis的性能瓶颈在于网络IO而非CPU,使用多线程进行一些周边预处理,提升了IO的读写效率,从而提高了整体的吞吐量。antirez 在 RedisConf 2019 分享时提到,Redis 6 引入的多线程 IO 对性能提升至少一倍以上。

原文链接:https://blog.csdn.net/itomge/article/details/122118060