一、redis数据结构有哪几种Redis 常用的数据类型有五种String、List、Hash、Set、Sorted SetZSet。另外 Redis 还有 Bitmap、HyperLogLog、Geo、Stream 等扩展数据类型。底层实现会根据数据量和场景选择不同的数据结构比如 SDS、ziplist/listpack、hashtable、quicklist、skiplist 等。其中常问的数据类型是 ZSetRedis 的 ZSet 底层有两种结构小数据量使用 listpack大数据量使用 skiplistdict。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中RDBRedis Database Backup File 是默认开启的而 AOFAppend-Only File需要手动配置开启。RDBRedis数据备份文件也被叫做Redis数据快照。把内存中的所有数据都记录到磁盘文件中当Redis实例故障重启后读取磁盘快照文件恢复数据。RDB 异步持久化的底层原理RDB异步持久化 即bgSave就是开启一个子进程由子进程读取内存数据并写入RDB文件。优点宕机后恢复速度快、文件体积小缺点数据安全性有问题因为RDB执行间隔时间长两次RDB之间写入的数据有丢失风险。但是RDB的间隔时间又不能设置的过短因为RDB的过程是比较耗时的如果间隔时间过短根本忙不过来。AOFAOF全称为Append Only File (追加文件)。Redis处理的每一个写命令都会记录在AOF文件。所以可以把Aof文件看做命令日志文件。优点数据安全性更高例如everysec策略只会丢失1秒以内的数据缺点宕机后恢复速度慢因为AOF文件记录的是命令需要依次执行文件体积大需要进行AOF文件重写此时会占用大量资源混合持久化开启混合持久化后当 AOF 文件重写时将当前内存数据以RDB 格式写入新 AOF 文件的开头后续增量数据以AOF 格式追加到文件末尾