八股文之Redis篇

文章目录

  • 前言
  • Redis底层中的数据结构
  • Redis中的编码方式
  • Redis数据类型对应的编码方式
  • 缓存穿透
  • 缓存击穿
  • 缓存雪崩
  • 双写一致性
  • 持久化
  • 数据过期策略
  • 数据淘汰策略
  • 分布式锁
  • 主从复制(高并发读)
  • 主从数据同步原理
  • 哨兵机制(Sentinel)
  • Redis集群(哨兵模式)脑裂
  • 分片集群结构
  • Redis是单线程架构,为什么还能这么快
  • IO多路复用模型
  • 用户空间和内核空间
  • Redis网络模型

前言

Redis的应用场景有很多,比如缓存、分布式锁、消息队列、延迟队列、排行榜,每一个场景都会有对应的问题和成熟的解决方案,都需要进行了解,特别要结合自身的项目进行侧重。下面会列出多种面试会问到的点,以及一些解决方案。

Redis底层中的数据结构

  • SDSSimple Dynamic String):简单动态字符串,代替了C语言的中的char *定义的字符串,因为其有很多问题,比如:内存分配带来的开销、安全性问题(C 语言的字符串没有保存字符串的长度信息,容易导致缓冲区溢出和越界访问等安全问题)、复杂的字符串操作问题,所以SDS的优点有如下:O(1) 时间获取字符串的长度、支持动态扩容、使用预分配来减少内存分配次数、拥有二进制安全(涉及到二进制字符、字符串长度信息、越界访问等等)。
  • IntSet:IntSet是Redis中Set集合的一种实现方式,基于整数数组来实现,具备长度可变、有序等特性,Redis会确保intSet中的元素唯一、有序,具备类型升级机制、可以节省内存空间、底层采用二分查找的方式来查询,数据量不多的情况下使用最佳。
  • Dict(dictionary):实现键与值得映射关系得数据结构,包括Dict + dictHashTable + dictEntry,渐进式rehash
  • ZipList:是一种特殊的双端链表,由一系列特殊编码的连续内存块组成,可以在任意一段进行插入和弹出操作,并且读取操作的时间复杂度是O(1),节省内存,但是必须是连续空间,一旦内存占用多,则申请内存得效率很低
  • QuickList:Redis3.2引入的,是一个双端链表,只不过链表中得每一个节点都是ZipList
  • SkipList:是一个双向链表,元素按照升序排列存储,节点包含多个指针,指针的跨度不同,最多32层,实现相比红黑树更加简单,层数越大,跨度越大,crud效率和红黑树基本一致
  • RedisObject:Redis中的任意数据类型的键和值都会被封装成一个RedisObject

Redis中的编码方式

八股文之Redis篇_第1张图片

Redis数据类型对应的编码方式

八股文之Redis篇_第2张图片
String:编码方式RAW编码,基于SDS实现,存储上限为512mb,如果SDS长度小于44字节,则会采用EMBSTR编码,如果存储的字符串是整数值,并且大小在LONG_MAX范围内,则会采用INT编码:直接将数据保存在RedisObject的ptr指针位置(刚好8字节)
List:3.2版本之前,Redis采用ZipList和LinkedList来实现List,当元素数量小于512并且元素大小小于64字节时采用ZipList,超过则采用LinkedList编码实现。在3.2版本之后,Redis统一采用QuickList实现List
Set:采用HT编码(Dict)。Dict中的key

你可能感兴趣的:(八股文,Redis,redis,数据库,缓存)