通俗易懂的口语化讲解Redis

前言

本文对Redis相关知识做了一个相对完整的总结,涉及到Redis数据类型结构、持久化、对象、LRU和LFU、处理命令、主从复制等。特别注意,口语化八股文系列,仅作突击复习核心知识点用,推荐有一定八股基础的人食用,更细的点需要大家自行查询相关详细图文资料

正文

Redis为什么快

  1. 基于内存操作数据
  2. 单线程操作数据避免多线程切换和竞争
  3. 使用IO多路复用模型处理网络请求
  4. 高效的数据结构比如String,Hash,Set,ZSet,List
  5. 合理的数据编码比如SDS,Hash表,ZipList,快表
  6. 虚拟内存机制会将不经常访问的冷数据暂时从内存交换到磁盘,腾出空间给热数据

Redis有哪些数据类型

String、Hash、List、Set、Zset、Bitmap(位存储)、地理位置(Geospatial)、基数统计(HyperLogLogs)、Stream

String类型如字面意思,value存储字符串或者整数,通常用来做KV缓存。Hash的value是键值对,因此适合做对象的缓存。List因为可以左右自由push和pop,所以能当成队列和栈使用。Set的value是无序不重复集合,Zset则是有序不重复集合。基数统计存储一组不重复的数据,以一定误差为代价,节省大量内存并提供了丰富的统计功能,适合统计每日访问数、共同好友数等不太精确的数据。Bitmap操作二进制位记录数据,只有0和1两个状态,适合记录类似打卡、未打卡这样只有两种状态的数据。地理位置主要应用在附近的人这类场景中。Stream是官方5.0版本后推出的一个消息队列的完善实现。

Redis数据类型有哪些底层数据结构

基础五种类型的数据结构在数据量不同大小时会使用不同的编码模式。

  • String:如果存储数字的话,是用int类型的编码;如果存储非数字,小于等于39字节的字符串,是embstr;大于39个字节,则是raw编码。
  • List:如果列表的元素个数小于512个,列表每个元素的值都小于64字节(默认),使用ziplist编码,否则使用linkedlist(quicklist)编码
  • Hash:哈希类型元素个数小于512个,所有值小于64字节的话,使用ziplist编码,否则使用hashtable编码。
  • Set:如果集合中的元素都是整数且元素个数小于512个,使用intset编码,否则使用hashtable编码。
  • Zset:当有序集合的元素个数小于128个,每个元素的值小于64字节时,使用ziplist编码,否则使用skiplist(跳跃表)编码

简单动态字符串(SDS)

简单动态字符串的特点在于动态扩容,其中有两大优势,分别是空间预分配和惰性释放空间,意思就是扩容时分配空间会额外多分配一些,避免后续多次扩容,相应的释放时,不会立刻释放不用的内存空间,而是记录留待后用。还有一个特点是增加长度标记位len,用来记录字符串实际长度。这是在C语言字符串上做的优化,比如有了长度标记位len,在获取字符串长度时不用遍历直接获取即可,时间复杂度O(1),原版需要遍历,时间复杂度O(n)。原版在做字符串拼接修改的时候会造成缓冲区溢出,增加长度标记位len之后,会判断修改后的长度是否大于len,大于的话会提前扩容,避免了缓冲区溢出。

哈希表(Hash)

Redis用一张全局哈希表存储所有字典数据,解决哈希冲突的方法是链地址法,通过字典对象里的next指针指向下一个拥有相同哈希值的节点。

触发扩容分成两种情况,第一种是Redis没有执行bgsave(rdb)或者bgrewriteaof(aof)命令时,负载因子(总节点数/哈希表长度)大于1。第二种是Redis正在备份,负载因子大于5。

扩容时会触

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值