【Redis】数据结构&&持久化

一、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 文件重写时

  1. 将当前内存数据以 RDB 格式 写入新 AOF 文件的开头
  2. 后续增量数据以 AOF 格式 追加到文件末尾
相关推荐
梦影_12 小时前
MySQL进阶教程(五)—— SQL调优(下)
android·大数据·数据库·后端·sql·mysql·database
考虑考虑12 小时前
mariadb数据库
数据库·后端·mariadb
A boy CDEF girl12 小时前
算法题专栏:优选算法
数据结构·算法·leetcode
John_Hui14 小时前
Windows 10 安装版本:mysql-8.1.0-winx64.zip
数据库·windows·mysql
莫晓燚14 小时前
双机部署若依 (RuoYi‑Vue) 传统环境部署---实战
linux·运维·数据库·redis·mysql·nginx·ruoyi
updayday85415 小时前
客户附件不该发往旧邮箱,如何在发送前拦截 - Ping64 邮件安全管控
大数据·网络·数据库·安全·智能路由器
倔强的石头_15 小时前
连接异常排障手册:拒连、超时、认证失败、空闲断开
数据库
lhbweilai15 小时前
QT(了解各个控件和布局)上
数据库·qt
夕除15 小时前
redis--resp
redis
莫晓燚16 小时前
搭建Redis 主从复制---实战
数据库·redis·缓存