1.基本数据结构,底层原理,以及应用
String
底层使用了SDS简单动态字符,string一共三种编码方式,int,embstr,raw
int主要存储long型整数
string有两个数据结构redisObject和SDS
embstr和raw底层sds,主要区别是embstr的redisobject和sds连续存储在一起,而redisobject和sds通过指针相连,不连续。
当int型时,大于19用embstr,大于44用raw
浮点数,字符串默认embstr,大于44用raw
主要用途是存储用户信息,token,分布式锁,计数器等
List
底层使用了压缩链表和双向链表
压缩链表,包括zlbytes总字节数,zltail从首节点到尾节点一共多少字节,zllen节点数量,entries节点,zlend结束符,连续
他是一种紧凑型的数据结构,节省资源
双向链表,无环,包含两部分,一个list,一个listnode数据结构,listnode是双向链表,list通过指针链接到listnode的头尾节点。不连续
当存储每个节点小于64时,或总长度小于128时,用压缩链表
主要用途是消息队列
Set
底层使用了intset和哈希表
inset有三部分,编码,长度,数据,编码有三种,int16,int32,int64,分别是2,4,8字节
哈希表是两层的key -value
当集合中int数组数量大于512,或只要有其他类型都会使用哈希表
主要用途是共同粉丝,共同好友
ZSet
底层使用了压缩链表和跳表
压缩链表,紧凑型数据结构,连续存储
跳表是在链表基础上改进的。比当前节点大,比下一个小,则往下找。
当存储每个节点小于64,总长度小于128,用压缩链表
主要用途排行榜
Hash
底层哈希表或压缩链表
压缩链表,zlbyte总字节数,zltail首尾字节数,偏移量,zllen长度,zlend结束符,entry节点
哈希表,两层key-value
主要用途,存储对象
2.redis内存淘汰策略
一共有六种
淘汰最久未使用的
淘汰最近未使用的
随机淘汰
在过期的键值对中,再加上面三种情况
3.redis过期删除策略
定时删除 - 过期了就删除
定期删除 - 一段时间清理一次
惰性删除 - 过期了先不删除,等下次查询时判断是否过期在删除
4.redis持久化
三种策略
rdb
快照存储,读取恢复数据快,每次采取覆盖方式写数据。
流程,先去判断父线程有没有子线程,如果没有,调用fork去创建子线程保存数据。bgsave
会丢失一次数据
aof
操作信息,采取追加的方式,数据会越来越多,但实时性强
流程先写入aof buffer,根据刷盘策略刷到磁盘,no 系统策略,everysec每秒,always每次操作
混合持久化
第一次先写rdb,后续追加aof
当达到一定条件时重写rdb
数据恢复先读取rdb,在读取aof