一、redis数据结构有哪几种
Redis 常用的数据类型有五种:String、List、Hash、Set、Sorted Set(ZSet)。另外 Redis 还有 Bitmap、HyperLogLog、Geo、Stream 等扩展数据类型。底层实现会根据数据量和场景选择不同的数据结构,比如 SDS、ziplist/listpack、hashtable、quicklist、skiplist 等。
其中常问的数据类型是 ZSet
Redis 的 ZSet 底层有两种结构,小数据量使用 listpack,大数据量使用 skiplist+dict。
listpack 是连续内存结构,优点是节省内存,但是查询和插入效率较低,需要遍历,时间复杂度是 O(N)。
当数据量增大后,ZSet 有大量范围查询、排名查询和插入操作,listpack 性能不足,所以 Redis 会转换成 skiplist。
skiplist 是一种多层链表结构,平均查询和插入复杂度都是 O(logN),非常适合有序集合。
同时 Redis 还会配合 dict 使用,因为 dict 可以通过 member 快速找到 score,而 skiplist 负责按照 score 排序和范围查询。
listpack
和 ZipList 压缩列表几乎一样,但解决了连锁更新的问题,所以是新设计出来取代 ZipList 压缩列表的
SkipList 跳表
无论是 ZipList 还是 QuickList,在访问时,本质都是一个个遍历的访问,他们在查找首尾结点时性能高。但是要做范围查找时,只能一个一个遍历直到范围的起始点。
SkipList 跳表 是一种多层链表
- 元素按 score 分数进行升序排序存储
- 一个节点内可能包含多个指针,每个指针的跨度不同。链表遍历慢的原因就是因为指针的跨度为1
- 当做范围查找时,利用高层级的指针,快速跳过大量无关节点,快速定位到范围的起始点
- 跳表通过牺牲少量内存空间(存储多层指针),换取了更高效的范围查找性能

二、Redis持久化
在 Redis 的默认配置文件(redis.conf)中,RDB(Redis Database Backup File) 是 默认开启 的,而 AOF(Append-Only File)需要手动配置开启。
RDB
Redis数据备份文件,也被叫做Redis数据快照。
把内存中的所有数据都记录到磁盘文件中,当Redis实例故障重启后,读取磁盘快照文件,恢复数据。
RDB 异步持久化的底层原理
RDB异步持久化 即bgSave,就是开启一个子进程,由子进程读取内存数据,并写入RDB文件。
优点:宕机后恢复速度快、文件体积小
缺点:数据安全性有问题,因为RDB执行间隔时间长,两次RDB之间写入的数据有丢失风险。但是RDB的间隔时间又不能设置的过短,因为RDB的过程是比较耗时的,如果间隔时间过短,根本忙不过来。
AOF
AOF全称为Append Only File (追加文件) 。Redis处理的每一个写命令 都会记录在AOF文件。所以可以把Aof文件看做命令日志文件。
优点:数据安全性更高,例如everysec策略,只会丢失1秒以内的数据
缺点:宕机后恢复速度慢,因为AOF文件记录的是命令,需要依次执行;文件体积大,需要进行AOF文件重写,此时会占用大量资源
混合持久化
开启混合持久化后,当 AOF 文件重写时
- 将当前内存数据以 RDB 格式 写入新 AOF 文件的开头
- 后续增量数据以 AOF 格式 追加到文件末尾