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

今天去腾讯面试,被问到多个redis问题,面试的时候没有答好,还好把问题记下来。
下面我们一起来看看
腾讯通道面:

  1. redis为什么可以达到单机10万QPS,为什么这么快?
  2. redis 底层数据结构
  3. 哨兵模式和集群模式有什么区别
  4. 怎么解决redis key过热的问题?
    图片说明
    我们逐个分析

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

    主要有这么3个原因:
  5. Redis为什么这么快
    完全基于内存,绝大部分请求是纯粹的内存操作,非常快速。
    采用单线程,避免了不必要的上下文切换和竞争条件,也不存在多进程或者多线程导致的切换而消耗 CPU;
    使用多路I/O复用模型,非阻塞IO;
    使用底层模型不同,它们之间底层实现方式以及与客户端之间通信的应用协议不一样,Redis直接自己构建了VM 机制 ,因为一般的系统调用系统函数的话,会浪费一定的时间去移动和请求;
  6. 同步非阻塞I/O—多路复用
    多路I/O复用模型是利用 select、poll、epoll 可以同时监察多个流的 I/O 事件的能力,在空闲的时候,会把当前线程阻塞掉,当有一个或多个流有 I/O 事件时,就从阻塞态中唤醒,于是程序就会轮询一遍所有的流(epoll 是只轮询那些真正发出了事件的流),并且只依次顺序的处理就绪的流,这种做法就避免了大量的无用操作。这里“多路”指的是多个网络连接,“复用”指的是复用同一个线程。
  • 多路:多个TCP连接(Socket或Channel) 多个客户端的连接
  • 复用:复用一个或多个线程 复用是服务端的一个或多个线程
  • 服务端帮你监视连接
  • 多路复用要操作系统支持
  • 有一个多路复用叫做select
  1. 单线程redis和多核CPU
    单一线程也只能用到一个CPU核心,所以可以在同一个多核的服务器中,可以启动多个实例,组成master-master或者master-slave的形式,耗时的读命令可以完全在slave进行。

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

在《Redis设计与实现》这样描述:
Redis 数据库里面的每个键值对(key-value) 都是由对象(object)组成的:
数据库的键总是一个字符串对象(string object);
数据库的值则可以是字符串对象、列表对象(list)、哈希对象(hash)、集合对象(set)、有序集合(sort set)对象这五种对象中的其中一种。
下面我们来探讨Redis底层数据类型具体实现。

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

  1. 简单动态字符串
  2. 链表
  3. 字典
  4. 跳跃表
  5. 整数集合
  6. 压缩列表
  7. 对象

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

Redis的哨兵模式和集群模式

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

怎么解决redis key过热的问题

#腾讯##面经#
全部评论
直接收藏 压箱底 没想到吧
点赞 回复 分享
发布于 2021-09-14 19:54

相关推荐

10-13 11:03
门头沟学院 Java
一面: 1. 做个简单的自我介绍。2. 详细介绍一下实习中你觉得做得比较好的一个项目,包括整体的业务背景、整体的系统设计以及你在里面做了哪些事。3. 这里提到的事务,比如简单的DB和缓存场景,用事务来做其实也有问题吧?比如先写数据库,假设超时然后事务回滚了,但缓存数据还在,超时事务回滚了也没办法很好地保证这种强一致性,对吗?4. 你提到的写完数据库后删除缓存,在这种场景下还会有什么问题吗?比如极限情况下的更新和查询冲突。5. 针对这个项目,你们平时是怎么排查处理消息队列(卡夫卡)的消息堆积问题的?6. HashMap中解决哈希冲突的链表和红黑树,它们本质的区别在哪儿?为什么要把链表转为红黑树呢?为什么要选择红黑树呢?logN的搜索效率的数据结构不只有红黑树,为什么选择红黑树呢?7. HashMap是线程不安全的,ConcurrentHashMap是如何保证线程安全的?用到了CAS和加锁的话,是怎么样的过程,为什么要那么做呢?8. Redis里面的sds相比于C的字符串有哪些区别?有扩容操作那么还会有缩容操作吗?9. Redis为什么单线程快?怎么处理多个服务?什么是IO多路复用?内部是怎么实现的?10. 实际场景中,怎么用Java实现主线程等待所有子线程处理完后,再汇总结果继续执行的场景?11. 给一个场景,如果是下完订单后半小时内没有付款就取消订单,那么用什么做法来做?12. 手撕中等二面:1. 问实习2. MySQL中索引是怎么实现的?(比如你说的主键索引底层实现)3. 假设单独对A列建了一个二级索引,现在有两个查询语句,哪一句的执行效率比较高?(语句1:select A,B from xx where A=1;语句2:select A from xx where A=1, 对A建立了索引)4. 用数据库进行写操作时,会给数据库加事务,发生错误时事务回滚是怎么做到的呢?5. 你刚才说数据库里有三个重要的log,除了跟回滚相关的log,另外两个是什么呀?6. Redo log是存在什么场景呢?7. 现在有一个场景,抖音个人主页会展示用户发的视频列表,要求列表按视频被点赞数量倒序排列(点赞最多的排在第一个),且抖音用户量大、页面访问量高。如果让你设计这个个人主页,从表结构(以MySQL为例)角度会怎么设计?8. 视频表中会存储视频被点赞的数量,而你之前提到用Redis有序集合缓存用户视频列表并按点赞数排序,这两个数据源(MySQL和Redis)之间是怎么进行更新,以保证数据一致性的呢?9. 你判断抖音个人主页的点赞数量场景,是否可以容忍数据有延迟?10. 如果一个用户发了很多很多视频,按用户维度将所有视频放到Redis有序集合中会导致key过大,每次展示时阻塞时间久,有什么思路解决这个问题吗?11. 手撕中等三面:1、基本都在问项目,而且面试体验很差2、两个各含 50 亿个 URL 的文件(每条URL64个字节),内存仅 4GB,找出共同 URL3、手撕中等秒挂
梦雨雨:同学,瞅瞅我司,医疗独角兽~ 我的主页最新动态,绿灯直达,免笔试~
点赞 评论 收藏
分享
评论
1
44
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务