当前位置: 首页 > news >正文

Redis系列---数据管理

目录标题

  • 数据类型
    • String
      • 优点
      • 缺点
      • 底层结构
      • 使用场景
      • 实际使用
    • List
      • 优点
      • 缺点
      • 底层结构
      • 使用场景
      • 实际使用
    • Hash
      • 优点
      • 缺点
      • 底层结构
      • 使用场景
      • 实际使用
    • Set
      • 优点
      • 缺点
      • 底层结构
      • 使用场景
      • 实际使用
    • Zset
      • 优点
      • 缺点
      • 底层结构
      • 使用场景
      • 实际使用
    • HyperLogLog
      • 优点
      • 缺点
      • 底层结构
      • 使用场景
      • 实际使用
    • GEO
      • 优点
      • 缺点
      • 底层结构
      • 使用场景
      • 实际使用
    • Stream
      • 简介
      • 使用场景
      • 实际使用
    • BitMap
  • 类型抉择
  • 空间占用
  • 数据特征
  • 数据删除策略
    • 定时删除
    • 惰性删除
    • 定期删除
  • 数据淘汰策略

数据类型

redis中value的最大容量默认是 512M,各个数据类型初始容量如下:

  1. String:512M
  2. Set,ZSet,List,Hash:2^32 -1 个元素

总结:任何系统都是在内存和性能之间不断抉择,使用最少的内存提供可接受的反应速度。redis亦如此。

String

优点

简单直观,便捷存储单个元素/散列元素。提供字符串函数,append等

缺点

占用过多的键,内存占用量较大,同时用户信息内聚性比较差。难以管理

底层结构

简单动态字符串(simple dynamic string),字节数组+未用空间+已用空间,预分配空间,方便快速扩容及确定字段长度,牺牲空间换时间

使用场景

可以存储任意类型的数据,包括文本、数字等。

实际使用

  • 热点用户个人信息
  • 库存计数器
  • 分布式锁
  • 项目奖品策略
  • 广告点击次数
  • 验证码

List

优点

存储有序数据,支持从列表的两端进行元素的插入和删除操作。

缺点

数据耦合高,取内部元素相对耗时

底层结构

老版本是双向链表+压缩列表,双向链表即pre+value+next,压缩链表即分配一段连续内存,省掉pre和next的损耗,前者适合大量元素,后者适合少量元素;

新版本采用快速链表,是前两者的融合,pre+小型双向链表+next,即将长度较大的双向链表进行分段存储。

  • 压缩列表ziplist (插入元素过多或字符串太大,就需要调用 realloc 扩展内存 )
  • 双向链表linkedlist (需附加指针prev 和 next,较浪费空间,加重内存的碎片化 )

因为双向链表占用的内存比压缩列表要多,所以当创建新列表时,会优先考虑使用压缩列表,并且在有需要的时候才从压缩列表实现转换到双向链表实现。

压缩列表转化成双向链表条件有两个:

  • 列表中某个字符串值超过 list_max_ziplist_value(默认64字节 )
  • 列表的元素个数超过 list_max_ziplist_entries(默认 512个 )

使用场景

有序消息,或者固定容量数据。例如消息队列、最新消息排行

实际使用

消息队列虽然可以但不建议因为redis会丢消息,它是缓存不是持久存储,除非是不重要的消息

  • 广告展示,默认展示最新条数,设置长度固定的list,每次从顶端插入,从尾端剔除元素;
  • 中奖名单,同样固定容量,顶端插入提出尾部元素。

Hash

优点

通过一个key对应多个字段和对应的值,适用于存储对象属性、配置信息等复杂数据结构。

缺点

数据占用空间过大时增删耗时旧,甚至引起reids卡顿

底层结构

压缩列表+hashtable,与list的压缩列表不同的是,它存储的不仅是feild+value交替存储;hashtable即java的hashmap,数组+链表。
渐进式扩容:新老hashtable交替执行,即旧数据慢慢同步至新hashtable中。

新建hash值时优先使用压缩列表实现,压缩列表使用更加紧凑的连续内存结构可以节省空间,其读写复杂度为O(n);当数据量过大或者字段过多读写效率减低,此时会转化为hashtable,占用更多的内存,读写复杂度降低为O(1)。转化条件:

  • 哈希类型元素个数大于hash-max-ziplist-entries配置(默认512个)
  • 有字段值大于hash-max-ziplist-value配置(默认64字节)

使用场景

总是需要获取单一属性的值,数据既耦合又方便存取。

实际使用

  • 地理位置信息对应关系
  • 项目配置信息

Set

优点

无序集合,可以存储多个字符串元素,并提供高效的集合操作,如交集、并集、差集等。

缺点

大量数据会导致redis卡顿

底层结构

intset+hashTable;采用hashTable存储,只是value统一设置为null,为什么不用ziplist来节省空间是因为必须保证元素的唯一性。

inset可理解为数组,使用intset存储必须满足下面两个条件,否则使用hashtable,条件如下:

  • 对象保存的所有元素都是整数值(int)
  • 对象保存的元素数量不超过512个

使用场景

需要进行集合运算的数据。

  • 例如文章标签管理-可根据多个标签聚合查询文章;
  • 社交网络好友关系-将每个用户的好友列表存储在Redis的集合中,使用集合操作可以快速判断两个用户是否是好友,还可以进行好友推荐等功能。

实际使用

  • 经销商的门店服务列表,业务员可以交叉负责经销商底下的门店,利用经销商和门店的归属关系可以去重聚合出经销商的门店列表;
  • 策略集聚合,一个转盘会对应多个策略集,通过条件判断出新老用户概念,确定出需要聚合哪些的策略。

Zset

优点

存储多个字符串元素,并为每个元素关联一个分数,支持按照分数进行排序和范围查找。

缺点

  • 内存开销:Zset是基于跳表和哈希表实现的,存储数据时,会占用比简单的集合或列表更多的内存。因此,在存储较大规模的数据时,内存开销可能会显著增加。

  • 性能开销:在一些特定操作中,如按得分范围查询(ZRANGEBYSCORE)或根据排名进行范围查询(ZRANGE),操作的复杂度为O(log(N) + M),其中N是集合的大小,而M是返回的小集合大小。这与其他类型的数据结构相比,可能在性能上有所逊色,尤其是在处理大数据量时。

  • 数据排序:虽然Zset提供了自动排序功能,但在某些情况下(如频繁更新得分),这可能导致性能下降,尤其是在需要多次更新和读取的场景下。

底层结构

hashtable+skiplsit,hashtable存储k-score, skiplist中的每个node存储 层级+value+score,插入时按照score排序。

当元素数量不多时,hashtable和SkipList的优势不明显,而且更耗内存。因此zset还会采用ZipList结构来节省内存。

查询效率和红黑树相当。

使用场景

需要排序的数据

实际使用

业务员的补货数量排名。

HyperLogLog

优点

在输入元素的数量或者体积非常非常大时,计算基数所需的空间总是固定 的、并且是很小的。

缺点

HyperLogLog 只会根据输入元素来计算基数,而不会储存输入元素本身,所以 HyperLogLog 不能像集合那样,返回输入的各个元素。

底层结构

类似于java的set

使用场景

比如数据集 {1, 3, 5, 7, 5, 7, 8}, 那么这个数据集的基数集为 {1, 3, 5 ,7, 8}, 基数(不重复元素)为5。 基数估计就是在误差可接受的范围内,快速计算基数。

实际使用

需要用set的地方都可以使用

GEO

优点

进行坐标计算

缺点

相较于一些专门的地理空间数据库(如 PostGIS),Redis Geo 的地理空间索引功能较为基本,可能不适合需要复杂空间分析的应用。

底层结构

有序集合(Sorted Set):Redis 使用有序集合来存储地理位置数据,每个地理位置由一个成员(通常是地点的名称或标识符)和对应的分值(经纬度信息)组成。分值是通过将经纬度转化为一个可以唯一标识该点的整数值。

使用场景

地理位置计算

实际使用

附近门店功能

Stream

简介

Stream 是 Redis 5.0 版本新增加的数据结构,主要用于消息队列(MQ,Message Queue),Redis 本身是有一个 Redis 发布订阅 (pub/sub) 来实现消息队列的功能。
但它有个缺点就是消息无法持久化,如果出现网络断开、Redis 宕机等,消息就会被丢弃。

使用场景

在处理可丢失的信息时可以采用该方式,但一定要配合兜底的定时任务,防止消息丢失后完全处理失败。

实际使用

入金后修改只读账号状态

BitMap

Bitmap数据类型可以看作是一种特殊的字符串,它所占用空间中的每一个bit都只能是0或1。Redis内部将每个字符(bit)作为一个元素来处理,因此我们可以在非常小的空间中存储大量的位信息。这使得Bitmap非常适合于存储和处理大规模的布尔型信息,如用户的在线状态、活跃用户、用户访问记录等。

统计消费者的参与情况,和业务员的工作情况。

类型抉择

  • 多个集合操作(聚合操作)----用Set;
  • 集合数据排序(排序操作) ---- 分页排序建议使用ZSet;
  • 集合数据只有0、1两种状态(二值型数据)----------- 0/1状态数据建议使用Bitmap;
  • 集合中不重复元素个数(基数统计)----如果数据量达到亿级的话建议使用HyperLogLog。

当然以上都是套话,任何抉择都一样,搞清楚自己的需求,对症下药即可,当你对各种数据类型的特性了解之后,自然就可以做出最正确的选择。何时何地何事都如此。

空间占用

以String类型计算,k是tc:jdb:/UZJXTIP0CTZ6L0 v是32010670;

  • 2.4kw 5G
  • 1ww 25G

总结起来就是 1个kv占用218B。而在计算机中,一个英文字母/整数通常占用1个字节(1 B)。这是因为在使用 ASCII 编码时,单个英文字母(无论是大写还是小写)或者整数都可以用一个字节表示。

所以redis的空间占用大概是字节数的7倍。

数据特征

Redis是一种内存级数据库,所有数据均存放在内存中,内存中的数据可以通过TTL指令获取其状态。TTL返回的值有三种情况:正数,-1,-2

  • 正数:代表该数据在内存中还能存活的时间
  • -1:永久有效的数据
  • -2:已经过期的数据 或被删除的数据 或 未定义的数据

redis中的过期时间是单独存储的,Hash结构,field是内存地址,value是过期时间,保存了所有key的过期描述,在最终进行过期处理的时候,对该空间的数据进行检测, 当时间到期之后通过field找到内存该地址处的数据,然后进行相关操作。

在这里插入图片描述

数据删除策略

删除策略就是针对已过期数据的处理策略,已过期的数据是真的就立即删除了吗?其实并不是,redis有多种删除策略,在不同的场景下使用不同的删除方式会有不同效果。

不同的删除策略就是对内存占用与CPU占用之间的不同侧重。目前有三种删除策略:

  1. 定时删除:时间换空间,通过对cpu的无间断占用节约内存
  2. 惰性删除:空间换时间,通过对内存的占用节约cpu资源
  3. 定期删除:折中方案,花费少量cpu资源节约少量内存

定时删除

创建一个定时器,当key设置有过期时间,且过期时间到达时,由定时器任务立即执行对键的删除操作
在这里插入图片描述

惰性删除

数据到达过期时间,不做处理,等该数据被访问时进行过期判断。如果未过期,直接返回数据,如果已过期,先删除数据,再返回数据不存在
在这里插入图片描述

定期删除

定时删除和惰性删除这两种方案都是走的极端,那有没有折中方案?是的,redis还引入了一种定期删除策略,进行了空间和性能的折中处理

已知redis 会将每个设置了过期时间的 key 放入到一个独立的字典中,该方案是默认每秒进行十次过期扫描(100ms一次),过期扫描不会遍历过期字典中所有的 key,而是采用了一种简单的贪心策略。

  • 从过期字典中随机 20 个 key;
  • 删除这 20 个 key 中已经过期的 key;
  • 如果过期的 key 比率超过 1/4,那就重复步骤 1;

数据淘汰策略

相关文章:

Redis系列---数据管理

目录标题 数据类型String优点缺点底层结构使用场景实际使用 List优点缺点底层结构使用场景实际使用 Hash优点缺点底层结构使用场景实际使用 Set优点缺点底层结构使用场景实际使用 Zset优点缺点底层结构使用场景实际使用 HyperLogLog优点缺点底层结构使用场景实际使用 GEO优点缺…...

【Linux系统编程】第四十二弹---多线程编程全攻略:涵盖线程创建、异常处理、用途、进程对比及线程控制

✨个人主页: 熬夜学编程的小林 💗系列专栏: 【C语言详解】 【数据结构详解】【C详解】【Linux系统编程】 目录 1、线程创建 2、线程异常 3、线程用途 4、进程 VS 线程 5、线程控制 5.1、创建和等待线程 1、线程创建 线程能看到进程的大…...

Rust 力扣 - 2379. 得到 K 个黑块的最少涂色次数

文章目录 题目描述题解思路题解代码题目链接 题目描述 题解思路 本题可以转换为求长度为k的子数组中白色块的最少数量 我们遍历长度为k的窗口,我们只需要记录窗口内的白色块的数量即可,遍历过程中刷新白色块的数量的最小值 题解代码 impl Solution {…...

“单元测试”应该怎么写比较好

如何正确写单元测试 单元测试重要性写单元测试时存在的问题1、如何命名测试类&方法1.1、测试类命名规范1.2、测试方法命名规范 2、测试类的要求2.1测试行覆盖率100%2.2、单一职责2.3、可重复2.4、外部隔离,无任何外部依赖2.5、正确的使用断言2.6、不应该为了测试…...

腾讯开源首个文图生3D大模型Hunyuan3D-1.0

🦉 AI新闻 🚀 腾讯开源首个文图生3D大模型Hunyuan3D-1.0 摘要:腾讯混元于11月5日开源了Hunyuan3D-1.0,这是首个同时支持文本生成和图像生成的3D开源大模型。该模型采用两阶段生成方法,可以在10秒内生成3D资产。第一阶…...

c语言简单编程练习10

1、typedef和#define的区别 在用作数据类型替换时的区别&#xff1a; #include <stdio.h> #include <unistd.h>typedef char * A; //typedef需要&#xff1b; #define B char *int main(int argc, char *argv[]) {A a,b;B c,d;printf("a_size%ld\n"…...

时序预测 | Matlab基于TSA-LSTM-Attention被囊群优化算法优化长短期记忆网络融合注意力机制多变量多步时间序列预测

时序预测 | Matlab基于TSA-LSTM-Attention多变量多步预测 目录 时序预测 | Matlab基于TSA-LSTM-Attention多变量多步预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 时序预测 | Matlab基于TSA-LSTM-Attention被囊群优化算法优化长短期记忆网络融合注意力机制多变量多…...

数据结构[2016]

一、设有二维数组A[6][8],每个元素占6个字节存储&#xff0c;实现存放&#xff0c;A[0][0]的起始地址为1000,计算&#xff1a; (10分) (1)数组最后一个元素A[5][7]的起始地址&#xff1b; (2)按行优先存放时&#xff0c;元素A[1][4]的起始地址&#xff1b; (3)按列优先存放时…...

DBAPI连接阿里云 maxcompute 报错

使用正确的驱动包 访问以下链接寻找驱动包 https://github.com/aliyun/aliyun-odps-jdbc/releases/tag/v3.4.3 注意要使用odps-jdbc-3.4.3-jar-with-dependencies.jar &#xff0c;这个是完整的jar包 不要使用odps-jdbc-3.4.3.jar&#xff0c;这个不是完整的&#xff0c;它还…...

Web3对社交媒体的影响:重新定义用户互动方式

随着互联网的发展和人们对隐私、安全、所有权的需求不断提高&#xff0c;Web3 的概念逐渐深入人心。Web3 的出现标志着一个去中心化、用户主导的网络时代的到来&#xff0c;这也将对社交媒体产生深远的影响。Web3 不仅推动社交媒体从中心化模式向用户主导的去中心化模式转变&am…...

【LeetCode】【算法】322. 零钱兑换

LeetCode 322. 零钱兑换 题目 给你一个整数数组 coins &#xff0c;表示不同面额的硬币&#xff1b;以及一个整数 amount &#xff0c;表示总金额。 计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何一种硬币组合能组成总金额&#xff0c;返回-1。 你可以认为每…...

人工智能技术:未来生活的“魔法师”

想象一下&#xff0c;未来的某一天&#xff0c;你醒来时&#xff0c;智能助手已经为你准备好了早餐&#xff0c;你的智能家居系统根据你的心情和日程安排调整了室内的光线和音乐&#xff0c;而你的自动驾驶汽车已经在门口等你。这不是科幻小说&#xff0c;这是人工智能技术为我…...

docker加载目录中所有的镜像

docker加载目录中所有的镜像 首先我们知道读取单个命令如下: docker load -i example_image.tar.gz读取两三个也是: docker load -i image1.tar.gz image2.tar.gz image3.tar.gz但是如果是几十个&#xff0c;那么上面的命令就显得捉襟见肘了&#xff1b;比如当前我有个image…...

使用免费的飞书机器人,实现消息推送实时通知

大家好&#xff0c;我是小悟。 实际工作中&#xff0c;我们会经常遇到需要给用户发送业务通知的功能需求&#xff0c;如果是小程序端&#xff0c;那么就使用小程序提供的模板消息通知&#xff0c;如果是APP端&#xff0c;一般就是使用个推、极光等第三方平台。 当然还有个万能…...

各种网络设备的工作原理

网络设备的工作原理涉及多种设备&#xff0c;包括路由器、交换机、防火墙等&#xff0c;它们各自承担着不同的功能。以下是对这些设备工作原理的详细解释&#xff1a; 一、路由器路由器是互联网通信中的关键设备&#xff0c;它负责在不同网络之间传输数据包。功能&#xff1a;路…...

FilterListener组件

文章目录 Java Web三大组件一、Filter概述二、Filter开始1_过滤器API介绍2_过滤器开发步骤3_代码实现4_过滤器执行流程小结 三、使用细节1_生命周期2_拦截路径3_过滤器链 四、Listener1_Listener概述2_监听器举例3_Listener开始4_案例:模拟spring框架 Java Web三大组件 组件: 是…...

使用Ubuntu快速部署MinIO对象存储

想拥有自己的私有云存储&#xff0c;安全可靠又高效&#xff1f;MinIO是你的理想选择&#xff01;这篇文章将手把手教你如何在Ubuntu 22.04服务器上部署MinIO&#xff0c;并使用Nginx反向代理和Let’s Encrypt证书进行安全加固。 即使你是新手&#xff0c;也能轻松完成&#xf…...

基于Liquid State Machine的时间序列预测:利用储备池计算实现高效建模

Liquid State Machine (LSM) 是一种 脉冲神经网络 (Spiking Neural Network, SNN) ,在计算神经科学和机器学习领域中得到广泛应用,特别适用于处理 时变或动态数据。它是受大脑自然信息处理过程启发而提出的一种 脉冲神经网络 。 设想你正处于一片平静的湖面,四周环绕着高山,你向…...

oracle使用CTE递归分解字符串

oracle使用CTE递归分解字符串 背景 给定一个不定长度字符串 并且以&#xff0c;分割例如 ‘1&#xff0c;2&#xff0c;3&#xff0c;4’ 使用sql查询 返回1&#xff0c;2&#xff0c;3&#xff0c;4四行 如果‘1&#xff0c;2’ 则返回 1&#xff0c;2 两行 使用sql实现 实…...

华为HarmonyOS借助AR引擎帮助应用实现虚拟与现实交互的能力5-识别平面语义

对于检测到的平面&#xff0c;您可以通过AR Engine识别该平面的语义&#xff0c;包括墙面、地面、座椅面、桌面、天花板、门面、窗面、床面。 创建AR会话 创建AR会话并配置为平面语义识别模式。 AREngine_ARSession *arSession nullptr;// 创建AR会话。HMS_AREngine_ARSessi…...

MAC 安装 brew及其常用命令

​文章&#xff1a;Mac安装brew的四种方法&#xff08;指定能行&#xff09; 以下是在 Mac 上使用 Homebrew 清理缓存和无用包的详细指南&#xff1a; 1. 查看系统状态 # 诊断系统问题 brew doctor# 查看已安装的包 brew list# 查看系统占用空间 brew cleanup -n # 预览需要…...

nVisual标签打印模块的部署与使用

部署 标签打印模块部署需要注意的是 前置条件 标签打印模块是以外部模块形式依附于nVisual主模块的&#xff0c;所以要先部署好nVisual主模块的前后端程序。 部署文件下载 标签打印模块也分前端文件和后端文件&#xff0c;从微盘->软件发布->nVisual official relea…...

python NLTK快速入门

目录 NLTK简介安装NLTK主要模块及用法 词汇与语料库分词与词性标注句法分析情感分析文本分类综合实例&#xff1a;简单的文本分析项目总结 1. NLTK简介 NLTK&#xff08;Natural Language Toolkit&#xff09;是一个强大的Python库&#xff0c;专门用于自然语言处理&#xff…...

技术速递|.NET 9 中 System.Text.Json 的新增功能

作者&#xff1a;Eirik Tsarpalis - 首席软件工程师 排版&#xff1a;Alan Wang System.Text.Json 的9.0 版本包含许多功能&#xff0c;主要侧重于 JSON 架构和智能应用程序支持。它还包括一些备受期待的增强功能&#xff0c;例如可空引用类型支持、自定义枚举成员名称、无序元…...

LLM 使用 Elastic 实现可观察性:Azure OpenAI (二)

作者&#xff1a;来自 Elastic Muthukumar Paramasivam•Lalit Satapathy 我们为 Azure OpenAI GA 包添加了更多功能&#xff0c;现在提供提示和响应监控、PTU 部署性能跟踪和计费洞察&#xff01; 我们最近宣布了 Azure OpenAI 集成的 GA。你可以在我们之前的博客 LLM 可观察性…...

数据库基础(2) . 安装MySQL

0.增加右键菜单选项 添加 管理员cmd 到鼠标右键 运行 reg文件 在注册表中添加信息 这样在右键菜单中就有以管理员身份打开命令行的选项了 1.获取安装程序 网址: https://dev.mysql.com/downloads/mysql/ 到官网下载MySQL8 的zip包, 然后解压 下载后的包为: mysql-8.0.16-…...

高效自动化测试,引领汽车座舱新纪元——实车篇

引言 作为智能网联汽车的核心组成部分&#xff0c;智能座舱不仅是驾驶者与车辆互动的桥梁&#xff0c;更是个性化、智能化体验的源泉。实车测试作为验证智能座舱功能实现、用户体验、行车安全及法规符合性的关键环节&#xff0c;能够最直接地模拟真实驾驶场景&#xff0c;确保…...

GitHub中搜索项目方法

0 Preface/Foreword 1 搜索方法 1.1 项目介绍 如上截图&#xff0c;一个项目包含的基本信息&#xff1a; 项目名项目简介项目介绍Watch数量&#xff0c;接收邮件提醒Star数量&#xff0c;关注&#xff0c;subscribeFork数量&#xff0c;在repo中创建分支 1.2 限定项目名查找…...

浅谈串口服务器的作用

串口服务器是一种网络设备&#xff0c;它允许通过TCP/IP网络远程访问串行设备。它的作用主要包括&#xff1a; 1、远程访问&#xff1a;通过将串行通信转换为以太网通信&#xff0c;串口服务器使得远程访问串行设备成为可能&#xff0c;这对于远程监控和控制非常有用。 2、数据…...

Spark 的Standalone集群环境安装与测试

目录 一、Standalone 集群环境安装 &#xff08;一&#xff09;理解 Standalone 集群架构 &#xff08;二&#xff09;Standalone 集群部署 二、打开监控界面 &#xff08;一&#xff09;master监控界面 &#xff08;二&#xff09;日志服务监控界面 三、集群的测试 &a…...