写点什么

被腾讯问蒙的各种 Redis 复杂问题

用户头像
hanaper
关注
发布于: 2 小时前
被腾讯问蒙的各种Redis复杂问题

今天去腾讯面试,被问到多个 redis 问题,面试的时候没有答好,还好把问题记下来。

下面我们一起来看看

腾讯通道面:

  • 1、redis 为什么可以达到单机 10 万 QPS,为什么这么快?

  • 2、redis 底层数据结构

  • 3、哨兵模式和集群模式有什么区别

  • 4、怎么解决 redis key 过热的问题?

我们逐个分析

第一个问题:redis 为什么可以达到单机 10 万 QPS,为什么这么快?

主要有这么 3 个原因:

  1. Redis 为什么这么快

  • 完全基于内存,绝大部分请求是纯粹的内存操作,非常快速。

  • 采用单线程,避免了不必要的上下文切换和竞争条件,也不存在多进程或者多线程导致的切换而消耗 CPU;

  • 使用多路 I/O 复用模型,非阻塞 IO;

  • 使用底层模型不同,它们之间底层实现方式以及与客户端之间通信的应用协议不一样,Redis 直接自己构建了 VM 机制 ,因为一般的系统调用系统函数的话,会浪费一定的时间去移动和请求;

2. 同步非阻塞 I/O—多路复用 多路 I/O 复用模型是利用 select、poll、epoll 可以同时监察多个流的 I/O 事件的能力,在空闲的时候,会把当前线程阻塞掉,当有一个或多个流有 I/O 事件时,就从阻塞态中唤醒,于是程序就会轮询一遍所有的流(epoll 是只轮询那些真正发出了事件的流),并且只依次顺序的处理就绪的流,这种做法就避免了大量的无用操作。这里“多路”指的是多个网络连接,“复用”指的是复用同一个线程。

  • 多路:多个 TCP 连接(Socket 或 Channel) 多个客户端的连接

  • 复用:复用一个或多个线程 复用是服务端的一个或多个线程

  • 服务端帮你监视连接

  • 多路复用要操作系统支持

  • 有一个多路复用叫做 select

3. 单线程 redis 和多核 CPU 单一线程也只能用到一个 CPU 核心,所以可以在同一个多核的服务器中,可以启动多个实例,组成 master-master 或者 master-slave 的形式,耗时的读命令可以完全在 slave 进行。

第二个问题:redis 底层数据结构?

《Redis 设计与实现》这样描述:

Redis 数据库里面的每个键值对(key-value) 都是由对象(object)组成的:

  • 数据库的键总是一个字符串对象(string object);

  • 数据库的值则可以是字符串对象、列表对象(list)、哈希对象(hash)、集合对象(set)、有序集合(sort set)对象这五种对象中的其中一种。

下面我们来探讨 Redis 底层数据类型具体实现。

Redis 底层数据结构有一下数据类型:

第三个问题:哨兵模式和集群模式有什么区别?

Redis的哨兵模式和集群模式

第四个问题:怎么解决 redis key 过热的问题?

怎么解决redis key过热的问题

发布于: 2 小时前阅读数: 5
用户头像

hanaper

关注

还未添加个人签名 2018.05.07 加入

还未添加个人简介

评论

发布
暂无评论
被腾讯问蒙的各种Redis复杂问题