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

redis之五种基本数据类型

ffe3b497389347b381a98dc5a1398841.gif

 

一) 字符串(String)

1 使用场景

2 编码

3 编码转换

二) List(列表)

1 使用场景

2 编码

三) Set(无序集合)

1 使用场景

2 编码

3 编码转换

四) ZSet(有序集合)

1 使用场景

2 编码

3 编码转换

五) Hash

1 使用场景

2 编码

3 编码转换

五种基本数据类型

redis存储任何类型的数据都是以key-value形式保存,并且所有的key都是字符串,所以讨论基础数据结构都是基于value的数据类型

 

常见的5种数据类型是:String、List、Set、Zset、Hash

 

 

 

 

 

一) 字符串(String)

String是redis最基本的类型,value最大是512M,String类型是二进制安全的,可以包含任何数据,如jpg图片或者序列化的对象

 

1 使用场景

1) 缓存:redis作为缓存层,mysql做持久化层,降低mysql的读写压力

 

2) 计数器:redis是单线程模型,一个命令执行完才会执行下一个,同时数据可以一步落地到其他的数据源

 

3) 分布式session

 

4) 分布式锁

 

5) 限流

 

 

 

2 编码

String类型的编码包括:

 

1) int编码:保存用 long 类型的整数值

 

2) embstr编码:长度小于44Byte的短字符串(redis3.2版本之前是39Byte,之后是44Byte),对其进行修改后变成raw编码,无论是否达到44字节

 

3) raw编码: 长度大于44Byte的长字符串(redis3.2版本之前是39Byte,之后是44Byte)

 

 

 

3 编码转换

1) int 编码的值不再是整数,或大小超过了long类型的时,自动转化为raw

2) 由于redis没有对embstr编码的值提供修改方法(embstr编码是只读的),在修改embstr编码的值时,都会先转化为raw编码再进行修改,修改后的对象一定是raw编码的,无论是否达到了44Byte

 

 

 

 

 

二) List(列表)

redis中的List其实就是双端链表

 

 

使用List的技巧

lpush+lpop=Stack(栈)

lpush+rpop=Queue(队列)

lpush+ltrim=Capped Collection(有限集合)

lpush+brpop=Message Queue(消息队列)

 

 

 

1 使用场景

1) 简单队列:发布微博,用lpush加入时间轴,最新消息排行,展示新的列表信息

 

2) 消息队列:PUSH 操作将任务存放在List中,然后工作线程再用 POP操作将任务取出进行执行

 

 

 

2 编码

1) linkedlist:双向链表,当列表元素个数比较多或者某个元素占用空间比较大的时使用,redis3 .2版本之前使用

 

2) ziplist:压缩列表,当列表元素个数比较少并且每个元素占用空间比较小时使用,redis3 .2版本之前使用

 

3) quicklist:快速列表,结合了ziplist和linkedlist各自的优点,redis3 .2版本开始使用

 

 

 

三) Set(无序集合)

redis中的Set类型是无序集合,集合中成员是不可重复的

 

添加,删除,查找元素的复杂度都是 O(1)

 

 

 

1 使用场景

1) 标签:有同一标签或者类似标签的可以给推荐关注的事或者关注的人

 

2) 点赞,点踩,收藏

 

 

 

2 编码

1) hashtable:数据全部存储于dict的键中,值字段闲置不用

 

2) intset:集合中存储的只能是数值数据,且必须是整数

 

 

 

3 编码转换

同时满足以下两个条件时,使用intset编码,否则使用hashtable编码

 

1) Set中所有元素都是整数

 

2) Set中所有元素数量不超过512M(配置文件的set-max-intset-entries参数)

 

 

 

四) ZSet(有序集合)

Zset类型和Set类型基本一样,区别在于Zset类型是有序集合

 

Zset集合中的每个元素都会关联一个 double 类型的权重参数(score),使得集合中的元素能够按score进行有序排列

 

添加,删除,查找元素的复杂度都是 O(1)

 

 

 

1 使用场景

1) 排行榜:如网站需要对用户点赞数从高到低进行排行

2) 权重分配:带权重的队列,如普通消息的score为1,重要消息的score为2,工作线程根据权重倒序获取,保证重要的任务优先执行

 

 

2 编码

1) ziplist:需要基于ziplist数据结构的基础做排序与去重

 

2) skiplist:底层使用了dict与skiplist两种数据结构

     单独使用dict,虽然能以 O(1) 的时间复杂度查找成员,但dict是无序的,所以进行范围操作的时候都要进行排序;

 

     单独使用skiplist,虽然能执行范围操作,但是查找操作为O(logN)

 

     因此redis使用了dict与skiplist两种数据结构来共同实现Zset,既可以以O(1) 的时间复杂度查找成员,又可以实现范围操作

 

 

 

3 编码转换

当Zset对象同时满足以下两个条件时,使用 ziplist 编码,否者使用 skiplist 编码

 

1) 保存的元素数量小于128(配置文件的zset-max-ziplist-entries参数)

 

2) 保存的所有元素长度都小于64Byte(配置文件的zset-max-ziplist-value参数)

 

 

五) Hash

Hash是一个key(字段) 和 value(属性) 的映射表,hash 特别适合用于存储对象

 

一个Hash可以存多个key-value

 

 

 

1 使用场景

1) 缓存:用户信息,视频信息等

 

2) 用户信息

 

3) 用户主页访问量

 

4) 组合查询

 

 

 

2 编码

1) ziplist

 

2) hashtable

 

 

 

3 编码转换

当同时满足下面两个条件时,使用ziplist编码,否则使用hashtable 编码

 

1) 列表保存元素个数小于512(配置文件的set-max-intset-entries参数)

 

2) 每个元素长度小于64Byte

相关文章:

redis之五种基本数据类型

一) 字符串(String) 1 使用场景 2 编码 3 编码转换 二) List(列表) 1 使用场景 2 编码 三) Set(无序集合) 1 使用场景 2 编码 3 编码转换 四) ZSet(有序集合) 1 使用场景 2 编码 3 编码转换 五) Hash 1 使用场景 2 编码 3 编码转换 五种基本数据类型 redis…...

RocketMQ系统性学习-RocketMQ高级特性之消息大量堆积处理、部署架构和高可用机制

🌈🌈🌈🌈🌈🌈🌈🌈 【11来了】文章导读地址:点击查看文章导读! 🍁🍁🍁🍁🍁🍁&#x1f3…...

Angular 进阶之五: Signals到底用不用?

Angular 在V16的时候推出了Signals,在17正式作为主打功能之一强烈推荐,看过了各种博主的各种科普文章也没说明白,到底这东西值不值得用?毕竟项目大了,重构代码也不是闹着玩儿的。各种科普文章主要在说两点:…...

构建数字化金融生态系统:云原生的创新方法

内容来自演讲:曾祥龙 | DaoCloud | 解决方案架构师 摘要 本文探讨了金融企业在实施云原生体系时面临的挑战,包括复杂性、安全、数据持久化、服务网格使用和高可用容灾架构等。针对网络管理复杂性,文章提出了Spiderpool开源项目,…...

前端性能优化五:css和js位置

1. 精简HTML代码: ①. css链接文件尽量放在页面头部:a. css的加载不会阻塞DOM Tree的解析.b. 但会阻塞DOM Tree渲染,也会阻塞后面JS的执行.c. 将css放在任何body元素之前:(1). 可以确保在文档中解析了所有css的样式包括内联样式和外联的.(2). 减少了浏览器必须重排文档的次数.…...

苏州耕耘无忧物联网:降本增效,设备维护管理数字化转型的引领者

随着科技的快速发展和工业4.0的推动,设备维护管理已经从传统的被动式、经验式维护,转向了更加积极主动、数据驱动的维护模式。在这个过程中,苏州耕耘无忧物联科技有限公司以其深厚的技术积累和丰富的管理经验,引领着设备维护管理数…...

15个热门的开源数据可视化项目

数据可视化(即 BI仪表盘)是图形表示的数据。它涉及产生将表示的数据之间的关系传达给图像查看者的图像。这种通信是通过在可视化过程中使用图形标记和数据值之间的系统映射来实现的。该映射建立了如何在视觉上表示数据值,确定图形标记的属性(例如大小或颜色)如何以及在多大程…...

【第七在线】数据分析与人工智能在商品计划中的应用

随着技术的不断进步,数据分析和人工智能(AI)已经成为了现代商品计划的关键组成部分。在服装行业,这两项技术正在帮助企业更好地理解市场需求、优化库存管理、提高生产效率和提供更好的客户体验。本文将深入探讨数据分析和人工智能…...

【圣诞】极安云科赠书活动第①期:CTF实战:从入门到提升

【圣诞】极安云科赠书活动第①期:CTF实战:从入门到提升 9787111724834 9787121376955 9787302556275 ISBN编号:9787111724834 书名:CTF实战:从入门到提升 定:99.00元 开本:184mm260&#xff…...

分布式搜索elasticsearch概念

什么是elasticsearch? elasticsearch是一款非常强大的开源搜索引擎,可以帮助我们从海量数据中快速找到需要的内容 目录 elasticsearch的场景 elasticsearch的发展 Lucene篇 Elasticsearch篇 elasticsearch的安装 elasticsearch的场景 elasticsear…...

Linux环境安装Hadoop

(1)下载Hadoop安装包并上传 下载Hadoop安装包到本地,并导入到Linux服务器的/opt/software路径下 (2)解压安装包 解压安装文件并放到/opt/module下面 [roothadoop100 ~]$ cd /opt/software [roothadoop100 software…...

swing快速入门(二十五)

注释很详细,直接上代码 新增内容 1.ImageIO.write读取并显示图片 2.ImageIO.writeImageIO.write读取并保存图片 package swing21_30;import javax.imageio.ImageIO; import java.awt.*; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent…...

智能优化算法应用:基于卷尾猴算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用:基于卷尾猴算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用:基于卷尾猴算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.卷尾猴算法4.实验参数设定5.算法结果6.参考文…...

前端传输formDate格式的数据,后端不能用@RequestBody接收

写了个接口,跟前端对接,前端说怎么一直415的报错 我寻思不对啊,我swagger都请求成功了,后来发现前端一直是以formdata格式提交的数据,这样我其实是可以不加RequestBody的; 知识点: RequestBody…...

【AivaAI】做音乐,无人能比它更专业

关于Aiva Aiva AIVA是音乐制作初创公司AIVA Technologies打造的一款人工智能产品。是人工智能领域头款获得国际认证的虚拟作曲家。 Aiva登录 可以选择Google登录,或者其他邮箱登录。 输入用户名,登录完成。 开始制作音乐 在主页选择“创建曲目…...

嵌入式开发网络配置——windows连热点,开发板和电脑网线直连

目录 电脑 WiFi 上网,开发板和电脑直连 使用场景 设置VMware虚拟机的网络配置 Ubuntu设置——版本18.04 ​编辑 windows设置 开发板设置 原因:虚拟机Linux移植可执行程序到开发板失败 最后发现虚拟机的Linuxping不通开发板 下面是我的解决方法 …...

基于Netty构建Websocket服务端

除了构建TCP和UDP服务器和客户端,Netty还可以用于构建WebSocket服务器。WebSocket是一种基于TCP协议的双向通信协议,可以在Web浏览器和Web服务器之间建立实时通信通道。下面是一个简单的示例,演示如何使用Netty构建一个WebSocket服务器。 项目…...

基于Rocket MQ扩展的无限延迟消息队列

基于Rocket MQ扩展的无限延迟消息队列 背景: Rocket MQ支持的延迟队列时间是固定间隔的, 默认19个等级(包含0等级): 0s, 1s, 5s, 10s, 30s, 1m, 2m, 3m, 4m, 5m, 6m, 7m, 8m, 9m, 10m, 20m, 30m, 1h. 我们的需求是实现用户下单后48小时或72小时给用户发送逼单邮件. 使用默认的…...

Python办公自动化 – 日志分析和自动化FTP操作

Python办公自动化 – 日志分析和自动化FTP操作 以下是往期的文章目录,需要可以查看哦。 Python办公自动化 – Excel和Word的操作运用 Python办公自动化 – Python发送电子邮件和Outlook的集成 Python办公自动化 – 对PDF文档和PPT文档的处理 Python办公自动化 – 对…...

MyBatis 关联查询

目录 一、一对一查询(sqlMapper配置文件) 1、需求: 2、创建account和user实体类 3、创建AccountMapper 接口 4、创建并配置AccountMapper.xml 5、测试 二、一对多查询(sqlMapper配置文件) 1、需求:…...

JavaSec-RCE

简介 RCE(Remote Code Execution),可以分为:命令注入(Command Injection)、代码注入(Code Injection) 代码注入 1.漏洞场景:Groovy代码注入 Groovy是一种基于JVM的动态语言,语法简洁,支持闭包、动态类型和Java互操作性&#xff0c…...

【单片机期末】单片机系统设计

主要内容:系统状态机,系统时基,系统需求分析,系统构建,系统状态流图 一、题目要求 二、绘制系统状态流图 题目:根据上述描述绘制系统状态流图,注明状态转移条件及方向。 三、利用定时器产生时…...

如何在最短时间内提升打ctf(web)的水平?

刚刚刷完2遍 bugku 的 web 题,前来答题。 每个人对刷题理解是不同,有的人是看了writeup就等于刷了,有的人是收藏了writeup就等于刷了,有的人是跟着writeup做了一遍就等于刷了,还有的人是独立思考做了一遍就等于刷了。…...

docker 部署发现spring.profiles.active 问题

报错: org.springframework.boot.context.config.InvalidConfigDataPropertyException: Property spring.profiles.active imported from location class path resource [application-test.yml] is invalid in a profile specific resource [origin: class path re…...

AI,如何重构理解、匹配与决策?

AI 时代,我们如何理解消费? 作者|王彬 封面|Unplash 人们通过信息理解世界。 曾几何时,PC 与移动互联网重塑了人们的购物路径:信息变得唾手可得,商品决策变得高度依赖内容。 但 AI 时代的来…...

Kubernetes 网络模型深度解析:Pod IP 与 Service 的负载均衡机制,Service到底是什么?

Pod IP 的本质与特性 Pod IP 的定位 纯端点地址:Pod IP 是分配给 Pod 网络命名空间的真实 IP 地址(如 10.244.1.2)无特殊名称:在 Kubernetes 中,它通常被称为 “Pod IP” 或 “容器 IP”生命周期:与 Pod …...

微服务通信安全:深入解析mTLS的原理与实践

🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、引言:微服务时代的通信安全挑战 随着云原生和微服务架构的普及,服务间的通信安全成为系统设计的核心议题。传统的单体架构中&…...

篇章二 论坛系统——系统设计

目录 2.系统设计 2.1 技术选型 2.2 设计数据库结构 2.2.1 数据库实体 1. 数据库设计 1.1 数据库名: forum db 1.2 表的设计 1.3 编写SQL 2.系统设计 2.1 技术选型 2.2 设计数据库结构 2.2.1 数据库实体 通过需求分析获得概念类并结合业务实现过程中的技术需要&#x…...

链式法则中 复合函数的推导路径 多变量“信息传递路径”

非常好,我们将之前关于偏导数链式法则中不能“约掉”偏导符号的问题,统一使用 二重复合函数: z f ( u ( x , y ) , v ( x , y ) ) \boxed{z f(u(x,y),\ v(x,y))} zf(u(x,y), v(x,y))​ 来全面说明。我们会展示其全微分形式(偏导…...

Python的__call__ 方法

在 Python 中,__call__ 是一个特殊的魔术方法(magic method),它允许一个类的实例像函数一样被调用。当你在一个对象后面加上 () 并执行时(例如 obj()),Python 会自动调用该对象的 __call__ 方法…...