Redis面试篇

前言

准备开一个新的系列,总结一些面试里吹牛皮的地方,不涉及太多细节,但是方方面面的都吹会起来。
这篇文章主要写Redis的方方面面。

基础结构

1.String会预分配空间,就像java的ArrayList,1MB以下每次扩容空间翻倍,1MB以上每次加1MB,最大512MB
2.List在列表元素少时,使用ZipList(双向指针,空间连续性,扫描磁盘更快)
3.Hash对象在扩容的时候,会创建一个新Hash对象,使用渐进式复制,用到哪个字段了再把这个字段的值赋值到新对象
4.Zset使用跳表来做排序

复合结构

1.位图结构,位图最小的单位是bit,每个bit是由0或1构成
2.GeoHash结构(坐标),用Zset实现,Score用经纬度+base32
3.HyperLogLog去重记数,有误差1%,12KB的大小,例如:记录某个页面有多少人访问过(会重复访问)
4.BloomFilter(布隆过滤器),用位数组(二进制)实现,判断某个值一定存在或一定不存在,一个key对应几位,只要几位都是1就是存在

Redis附加功能

1.Pipeline,把多条消息捏在一起发送给Redis服务器,客户端提供的功能
2.scan、hscan、sscan可以对String、Hash、Set进行分页模糊匹配
3.Redis漏油桶机制,Redis Cell
4.分布式锁,setnx(存在就设置返回1,否则返回0),返回1代表坑位被占领了,拿到锁
5.消息队列

  • 用List结构,实现简单的生产消费者
  • 发布订阅模式subscribe订阅,publish推送,psubscribe模糊订阅
    没有Ack确认机制
    消息没办法持久化,如果Redis宕机了,消息就找不回来了

Redis吹牛PLUS

1.Redis缓存穿透、雪崩、击穿(这个自己百度啦,都说烂了)
2.Redis有自己的通讯协议,RESP(Redis Serialization Protocol)
3.Redisserver默认有16个数据库,每一个数据库下有两个数组,dict数组保存键的值,expires数组保存键的过期时间
4.Redis多线程,Redis6.0之后支持多线程,Redis主线程是单线程的,但是IO是多线程的,会维护一个指令队列,先到先服务
5.过期键

  • 清理过期键的方式:定时清理,惰性清理(用的时候才会判断是否过期),定期清理(结合前两种,一次清理一定量的key)
  • 过期键不会写入RDB文件和AOF文件。过期键被删除时,会追加一条DEL命令到AOF文件
  • 主服务器里删除过期键,会给每个节点发送一个DEL指令。从服务器删除过期键,等主服务器发DEL指令。

你可能感兴趣的:(Redis面试篇)