Redis技术总结

embedded/2024/12/22 21:54:02/

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

5.redis为什么这么快


http://www.ppmy.cn/embedded/19925.html

相关文章

SpringBoot模块化时遇到Could not autowire. No beans of ‘xxxService‘ type found.错误

SpringBoot模块化时遇到Could not autowire. No beans of xxxService type found.错误 一、SpringBoot模块化时遇到Could not autowire. No beans of xxxService type found.错误二、解决办法一三、解决办法二 一、SpringBoot模块化时遇到Could not autowire. No beans of ‘xx…

UE4_动画基础_FootIK

角色由于胶囊体的阻挡,双脚与地面平行,不会与斜坡、台阶等贴合,有一条腿会处于悬空状态,通过双骨骼IK节点使一只脚太高,让后胶囊体下降,修正双脚的角度。这就是逆向运动IK的方法。 一、新建第三人称模板游戏…

react,Chart

一、基础图:https://ant-design-charts.antgroup.com/ Ant Design Charts 1. 首先要下载ant-design/charts,然后在页面中添加如下柱状图代码: import React from react; import { Column } from ant-design/chartsconst DemoColumn: React.FC () …

Qt中的 tableView 设置 二进制 十六进制 序号表头

二 进制序号 因为QTableView的垂直表头并不支持使用委托来自定义。 相反&#xff0c;可以通过将自定义的QWidget作为QHeaderView的标签来实现这一目标。 代码&#xff1a; #include <QApplication> #include <QMainWindow> #include <QVBoxLayout> #include …

洛谷 P4178 Tree 题解 点分治

Tree 题目描述 给定一棵 n n n 个节点的树&#xff0c;每条边有边权&#xff0c;求出树上两点距离小于等于 k k k 的点对数量。 输入格式 第一行输入一个整数 n n n&#xff0c;表示节点个数。 第二行到第 n n n 行每行输入三个整数 u , v , w u,v,w u,v,w &#xff…

【06】JAVASE-数组讲解【从零开始学JAVA】

Java零基础系列课程-JavaSE基础篇 Lecture&#xff1a;波哥 Java 是第一大编程语言和开发平台。它有助于企业降低成本、缩短开发周期、推动创新以及改善应用服务。如今全球有数百万开发人员运行着超过 51 亿个 Java 虚拟机&#xff0c;Java 仍是企业和开发人员的首选开发平台。…

SpringCloud整合Ribbon负载均衡器

目录 一、模块一&#xff1a;提供数据 1.1 首先将第一个实例打包 1.2 使用命令行设置不同权重 1.3 打开图形化界面看看权重是否配置成功。 二、模块二&#xff1a;调用模块一 三、修改默认负载均衡策略 四、自定义规则 ​编辑 五、完整代码 5.1 目录结构 5.2 配置文件 …

每日JAVA高级面试题

Java 高级面试问题及答案 以下是一些在Java高级面试中可能会遇到的问题&#xff0c;以及对这些问题的探讨和回答。 问题 1: Java内存模型是什么&#xff1f;请解释其重要性。 探讨&#xff1a; Java内存模型&#xff08;Java Memory Model, JMM&#xff09;是Java虚拟机&…