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

Redis中有常见数据类型

Redis的数据类型

string数据类型

string是redis最基本的类型,而且string类型是二进制安全的。意思是redis的string可以包含任何 数据,比如jpg图片或者序列化的对象

String类型是最基本的数据类型,一个redis中字符串value最多可以是512M

redis底层提供了三种不同的数据结构实现字符串对象,根据不同的数据自动选择合适的数据结 构。这里的字符串对象并不是指的纯粹的字符串,数字也是可以的

当保存的数据中包含字符时,String类型就会用简单动态字符串SDS结构体来保存

  •  redis中的String并不是以\0结束,而是根据len来决定文件是否结束。其主要目的是为了存储 非String的数据,例如图片,影像等二进制数据
  • 由于String结构体中存储了长度,所以在获得长度的时间复杂度为O(1)
  • String在扩容的时候,如果数据的长度小于10MB则,每次扩容为之前以后数据的2倍。如果超 过10MB则每次只增加1MB的长度 

主要应用场景:

  • 1、存储数据。如常见存储 K-V 字符串、JSON字符串。
  • 2、程序计数 INCR 命令递 增或递增一个数。
  • 3、分布式锁,使用 SET key value NX ,NX 不存在才写入。
  • 4、单点登录。可作 为存储共享会话实现单点登录。 

Hash数据类型

hash类型实际上是以key为标识存储key-value对。redis hash是一个string类型的field和value的映射 表,添加,删除操作都是平均O(1),hash特别适合用于存储对象 

有压缩链表ziplist和字典结构hashtable两种底层实现 

  • hashtable采用链地址法解决hash冲突问题
  • 当hash对象可以同时满足以下两个条件时,哈希对象使用ziplist编码,超过限制则使用 hashtable结构存储数据 

                哈希对象保存的所有键值对的键和值的字符串长度都小于64字节

                哈希对象保存的键值对数量小于512个 

ziplist编码的哈希对象使用压缩列表作为底层实现, 每当有新的键值对要加入到哈希对象时,会先 将保存了键的压缩列表节点推入到压缩列表表尾, 然后再将保存了值的压缩列表节点推入到压缩 列表表尾。

因此保存了同一键值对的两个节点总是紧挨在一起, 保存键的节点在前, 保存值的节点在后;先 添加到哈希对象中的键值对会被放在压缩列表的表头方向,而后来添加到哈希对象中的键值对会被 放在压缩列表的表尾方向

压缩列表并不是对数据利用某种算法进行压缩,而是将数据按照一定规则编码在一块连续的 内存区域,目的是节省内存

优点: 内存地址连续,省去了每个元素的头尾节点指针占用的内存

缺点: 对于删除和插入操作比较可能会触发连锁更新反应,比如在list中间插入删除一个元素 时,在插入或删除位置后面的元素可能都需要发生相应的移位操作。 

hashtable 编码的哈希对象使用字典作为底层实现, 哈希对象中的每个键值对都使用一个字典键 值对来保存:

  • 字典的每个键都是一个字符串对象, 对象中保存了键值对的键
  • 字典的每个值都是一个字符串对象, 对象中保存了键值对的值 

Hash类型两种编码方式,ziplist 与 hashtable。

  • hashtable 编码的哈希对象使用字典作为底层实现

ziplist 与 hashtable 编码方式之间存在单向转换

  • 既想节省Redis内存空间,又想存储对象数据,又想访问速度快,hash似乎是不二的选择 

List数据类型 

list是redis的一种基础数据结构,内部使用双向链表quicklist实现,所以向列表两端添加元素的时间复杂 度为O(1), 获取越接近两端的元素速度就越快 

redis中的列表对象经常被用作消息队列使用,底层有双向链表linkedList、支持双向遍历的压缩列表 zipList和quickList三种存储方式 

  • 在Redis3.2版本后,引入的qucikList是zipList和双向链表linkedList组成的混合体 

可以作链表使用 

双向链表linkedList链表是双端结构,listNode结构体中带有prev和next指针,因此获取某个节点 的前置节点和后继节点的时间复杂度都是O(1) 

  • 这个链表无环:表头节点的prev和表尾节点的next指针都指向了NULL,对链表的访问以 NULL为终点
  • 带表头指针和表尾指针:通过list结构的head指针和tail指针,程序获取链接的表头节点和表 尾节点的时间复杂度为O(1)
  • 带有链表长度计数器:程序使用list结构体的len属性来对list持有的链表节点进行计数,程序 获取链表中节点数量的复杂度为O(1)
  • 多态:链表节点使用void*指针来保存节点值,可以用于保存不同类型的值 

ziplist和linkedlist 

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

试图往列表新添加一个字符串值,且这个字符串的长度超过默认值64或者ziplist 包含的节点超过 默认值为 512 

因为双向链表占用的内存比压缩列表要多, 所以当创建新的列表键时, 列表会优先考虑使用压缩 列表, 并且在有需要的时候, 才从压缩列表实现转换到双向链表实现 试图往列表新添加一个字符串值,且这个字符串的长度超过默认值64或者ziplist 包含的节点超过 默认值为 512 

Redis中的列表list,在版本3.2之前,列表底层的编码是ziplist和linkedlist实现的,但是在版本3.2之后, 重新引入 quicklist,列表的底层都由quicklist实现。 

双向链表linkedlist便于在表的两端进行push和pop操作,在插入节点上复杂度很低,但是它的内 存开销比较大。首先,它在每个节点上除了要保存数据之外,还要额外保存两个指针;其次,双向 链表的各个节点是单独的内存块,地址不连续,节点多了容易产生内存碎片。

quickList是ziplist和linkedlist二者的结合,是一个ziplist组成的双向链表。每个节点使用ziplist来 保存数据。本质上来说,quicklist里面保存着一个一个小的ziplist

quickList就是一个标准的双向链表的配置,有head有tail;每个节点是一个quicklistNode,包含 prev和next指针。每一个quicklistNode包含一个ziplist,压缩链表里存储键值。所以quicklist是对 ziplist进行一次封装,使用小块的ziplist来既保证了少使用内存,也保证了性能。 

应用场景: 

  • 消息队列:列表类型可以使用 rpush 实现先进先出的功能,同时又可以使用 lpop 轻松的弹出(查 询并删除)第一个元素,所以列表类型可以用来实现消息队列
  • 文章列表:对于博客站点来说,当用户和文章都越来越多时,为了加快程序的响应速度,我们可以 把用户自己的文章存入到 List 中,因为 List 是有序的结构,所以这样又可以完美的实现分页功能, 从而加速了程序的响应速度。 

Zset有序集合 

有序集合对象zset和集合对象set没有很大区别,仅仅是多了一个分数score用来排序 

  • redis中的有序集合底层采用ziplist和skiplist跳表实现,当所有字符串长度都小于设定值值64字 节,并且所存元素数量小于设定值512个使用ziplist实现,其他情况均使用skiplist实现
  • 当ziplist作为zset的底层存储结构时候,每个集合元素使用两个紧挨在一起的压缩列表节点来保 存,第一个节点保存元素的成员,第二个元素保存元素的分值
  • 有序集合的底层实现之一是跳表, 除此之外跳表它在 Redis 中没有其他应用 
  • 整数集合intset是集合键的底层实现之一: 当一个集合只包含整数值元素, 并且这个集合的元素数 量不多时, Redis 就会使用整数集合作为集合键的底层实现
  • 数据少时使用ziplist压缩列表,占用连续内存,每项元素都是(数据+score)的方式连续存储,按照 score从小到大排序。ziplist为了节省内存,每个元素占用的空间可以不同,对于大数据(long long),就多用一些字节存储,而对于小的数据(short),就少用一些字节来存储。因此查找的时候需 要按顺序遍历。ziplist省内存但是查找效率低
  • 跳跃表是一种有序数据结构,它通过在每个节点中维持多个指向其它节点的指针,从而达到快速访 问节点的目的,具有以下性质:

有很多层结构组成

每一层都是一个有序的链表,排列顺序为由高到低,都至少包含两个链表节点,分别是前面的 head节点和后面的nil节点

最底层的链表包含了所有的元素

如果一个元素出现在某一层的链表中,那么在该层之下的链表也全部都会出现

链表中的每个节点都包含两个指针,一个指向同一层的下一个链表节点,另一个指向下一层的 同一个链表节点 

  •  搜索,从最高层的链表节点开始,如果比当前节点要大和比当前层的下一个节点要小,那么则往下 找,也及时和当前层的下一层的节点下一个节点
  • 插入,首先确定插入的层数,有一种方法是抛一个硬币,如果是正面就累加,直到遇到反面为止, 最后记录正面的次数作为插入的层数,当确定插入的层数K后,则需要将新元素插入从底层到K层
  • 删除,在各个层中找到包含指定值得节点,然后将节点从链表中删除即可,如果删除以后只剩下头 尾两个节点,则删除这一层

 

相关文章:

Redis中有常见数据类型

Redis的数据类型 string数据类型 string是redis最基本的类型,而且string类型是二进制安全的。意思是redis的string可以包含任何 数据,比如jpg图片或者序列化的对象 String类型是最基本的数据类型,一个redis中字符串value最多可以是512M r…...

【知识梳理】Go语言核心编程

基础知识 Go语言就是为了解决编程语言对并发支持不友好、编译速度慢、编程复杂这三个问题而诞生的 特点: Go语言选择组合思想,抛弃继承关系通过接口组合,自由组合成新接口,用接口实现层与层之间的解耦语言特性对比: package mainimport "fmt"func main() {fmt…...

Java中动态调用setter以及getter

0x00 前言 对于非专业程序员的安全人员来说,因为没有代码项目的积累,很多知识体系都不完善,所以有必要在一些常用的内容进行学习的总结。 在很多的调用链中都会用到**“动态调用setter以及getter”**这个知识点,比如经典的CB链&a…...

基于 NeRF 的 App 上架苹果商店!照片转 3D 只需一部手机,网友们玩疯了

前言 只用一部手机,现实中的 2D 照片就能渲染出 3D 模型? 没错,无需再手动上传电脑或安装激光雷达,苹果手机自带 App 就能生成 3D 模型。 这个名叫 Luma AI 的“NeRF APP”,正式上架 App Store 后爆火: 小…...

C++类与对象(中)

✅<1>主页&#xff1a;我的代码爱吃辣 &#x1f4c3;<2>知识讲解&#xff1a;C &#x1f525;<3>创作者&#xff1a;我的代码爱吃辣 ☂️<4>开发环境&#xff1a;Visual Studio 2022 &#x1f4ac;<5>前言&#xff1a;C类中一共有六个默认成员函…...

计算机软件技术基础复习

数据结构 文章目录数据结构第一节 数据结构的基本概念第二节 线性结构线性表顺序表和链表的特点实现循环队列第三节 非线性结构树操作系统操作系统概述进程和程序存储空间的组织数据库技术数据库设计软件技术软件生命周期第一节 数据结构的基本概念 数据结构&#xff1a;指相互…...

python爬虫--beautifulsoup模块简介

BeautifulSoup 的引入 我们学习了正则表达式的相关用法&#xff0c;但是一旦正则写的有问题&#xff0c;可能得到的就不是我们想要的结果了&#xff0c;而且对于一个网页来说&#xff0c;都有一定的特殊的结构和层级关系&#xff0c;而且很多标签都有 id 或 class 来对作区分&…...

Swfit Copy On Write 原理解析

1. Swift Copy On write 原理是什么 Swift 中的 Copy On Write (COW) 技术是一种内存优化技术&#xff0c;其原理是在需要修改数据时才进行拷贝&#xff0c;以避免不必要的内存消耗。 COW 的实现主要依赖于 Swift 中的结构体和类的特性。对于结构体而言&#xff0c;它是值类型…...

【面试题】经典面试题:让 a == 1 a == 2 a == 3 成立?

一、问题解析 if (a == 1 && a == 2 && a == 3) {console.log(Win) } 复制代码 如何打印除Win? 看到题目的第一眼,我是蒙蔽的.怎么可能会有如此矛盾的情况发生呢?就相当于一个人怎么可能即是小孩,又是成年人,还是老年人呢? 冷静下来,发现一些端倪。...

我是歌手-C语言

“我是歌手”是成名歌手之间的比赛节目&#xff0c;2轮比赛中观众支持率最低者出局。 这里我们假设有n个歌手进行了m轮比赛&#xff0c;请求出局者&#xff08;m轮总分最低者&#xff09;。 输入n个歌手&#xff08;编号依次为1&#xff0c;2&#xff0c;......n&#xff09;…...

Acwing---112.雷达设备

雷达设备1.题目2.基本思想3.代码实现1.题目 假设海岸是一条无限长的直线&#xff0c;陆地位于海岸的一侧&#xff0c;海洋位于另外一侧。 每个小岛都位于海洋一侧的某个点上。 雷达装置均位于海岸线上&#xff0c;且雷达的监测范围为 d&#xff0c;当小岛与某雷达的距离不超…...

SSJ-21A AC220V静态【时间继电器】

系列型号&#xff1a; SSJ-11B静态时间继电器&#xff1b;SSJ-21B静态时间继电器 SSJ-21A静态时间继电器&#xff1b;SSJ-22A静态时间继电器 SSJ-22B静态时间继电器SSJ-42B静态时间继电器 SSJ-42A静态时间继电器SSJ-41A静态时间继电器 SSJ-41B静态时间继电器SSJ-32B静态时间继电…...

m序列发生器——Verilog设计

引言 本篇文章利用Verilog编写一个m序列发生器模块。本文会给出具体的设计、测试源码。 设计说明 模块功能说明: 支持任意位宽的随机数生成;支持本原多项式配置;支持初始种子配置;设计环境: 设计语言:Verilog HDL 设计验证平台:MATLAB R20222a、Vivado 2018.3 m 序列…...

Mysql—触发器

触发器 简介 触发器用于直接在某种操作后&#xff08;数据的增删改查等&#xff09;&#xff0c;通过事件执行设置触发器时的 sql 语句&#xff0c;具有原子性。 可通过 sql 语句直接编写&#xff0c;关键词&#xff1a;CREATE TRIGGER 触发器名称。 例如&#xff1a;在表 st…...

DVWA靶场通关和源码分析

文章目录一、Brute Force1.low2、medium3、High4、Impossible二、Command Injection1、Low2、Medium3、High三、CSRF1、Low2、Medium3、High4、Impossible四、File Inclusion1、Low2、Medium3、High五、File Upload1、Low2、Medium3、High4、Impossible六、 SQL注入1、Low2、Me…...

RocketMQ5.0.0消息存储<二>_消息存储流程

目录 一、消息存储概览 二、Broker接收消息 三、消息存储流程 1. DefaultMessageStore类 2. 存储流程 1)&#xff1a;同步与异步存储 2)&#xff1a;CommitLog异步存储消息 3)&#xff1a;提交消息&#xff08;Commit&#xff09; 四、参考资料 一、消息存储概览 如下图所…...

【单片机方案】蓝牙体温计方案介绍

蓝牙体温计方案的工作原理利用了温度传感器输出电信号&#xff0c;直接输出数字信号或者再将电流信号(模拟信号)转换成能够被内部集成的电路识别的数字信号&#xff0c;然后通过显示器(如液晶、数码管、LED矩阵等)显示以数字形式的温度&#xff0c;能记录、读取被测温度的最高值…...

React 的受控组件和非受控组件有什么不同

大家好&#xff0c;我是前端西瓜哥&#xff0c;今天我们来看看 React 的受控组件和非受控组件有什么不同。 受控组件 受控组件&#xff0c;指的是将表单元素的值交给组件的 state 来保存。 例子&#xff1a; import ./styles.css import { useState } from reactconst App …...

【逐步剖C】-第六章-结构体初阶

一、结构体的声明 1. 结构体的基本概念 结构体是一些值的集合&#xff0c;这些值称为成员变量。结构体的每个成员可以是不同类型的变量。结构体使得C语言有能力描述复杂类型。 如学生&#xff0c;有姓名、学号、性别等&#xff1b;如书&#xff0c;有作者&#xff0c;出版日期…...

Java 并发在项目中的使用场景

1、并发编程的三个核心问题&#xff1a;&#xff08;1&#xff09;分工&#xff1a;所谓分工指的是如何高效地拆解任务并分配给线程&#xff08;2&#xff09;同步&#xff1a;而同步指的是线程之间如何协作&#xff08;3&#xff09;互斥&#xff1a;互斥则是保证同一时刻只允…...

15.面向对象程序设计

文章目录面向对象程序设计15.1OOP&#xff1a;概述继承动态绑定15.2定义基类和派生类15.2.1定义基类成员函数与继承访问控制与继承15.2.2定义派生类派生类对象及派生类向基类的类型转换派生类构造函数派生类使用基类的成员继承与静态成员派生类的声明被用作基类的类防止继承的发…...

Element UI框架学习篇(一)

Element UI框架学习篇(一) 1.准备工作 1.1 下载好ElementUI所需要的文件 ElementUI官网 1.2 插件的安装 1.2.1 更改标签的时实现自动修改 1.2.2 element UI提示插件 1.3 使用ElementUI需要引入的文件 <link rel"stylesheet" href"../elementUI/element…...

【算法】【C语言】

差分算法力扣1094题目描述学习代码思考力扣1094 题目描述 车上最初有 capacity 个空座位。车 只能 向一个方向行驶&#xff08;也就是说&#xff0c;不允许掉头或改变方向&#xff09; 给定整数 capacity 和一个数组 trips , trip[i] [numPassengersi, fromi, toi] 表示第 …...

【✨十五天搞定电工基础】基本放大电路

本章要求1. 理解放大电路的放大作用和共发射极放大电路的性能特点&#xff1b; 2. 掌握静态工作点的估算方法和放大电路的微变等效电路分析法&#xff1b; 3. 了解放大电路输入、输出电阻和电压放大倍数的计算方法&#xff0c;了解放大电路的频率特性、 互补功率放大…...

MyBatis 入门教程详解

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…...

shiro、springboot、vue、elementUI CDN模式前后端分离的权限管理demo 附源码

shiro、springboot、vue、elementUI CDN模式前后端分离的权限管理demo 附源码 源码下载地址 https://github.com/Aizhuxueliang/springboot_shiro.git 前提你电脑的安装好这些工具&#xff1a;jdk8、idea、maven、git、mysql&#xff1b; shiro的主要概念 Shiro是一个强大…...

智能优化算法——粒子群优化算法(PSO)(小白也能看懂)

前言&#xff1a; 暑假期间&#xff0c;因科研需要&#xff0c;经常在论文中看到各种优化算法&#xff0c;所以自己学习了一些智能优化的算法&#xff0c;做了一些相关的纸质性笔记&#xff0c;寒假一看感觉又有点遗忘了&#xff0c;并且笔记不方便随时查看&#xff0c;所以希…...

Lesson 6.4 逻辑回归手动调参实验

文章目录一、数据准备与评估器构造1. 数据准备2. 构建机器学习流二、评估器训练与过拟合实验三、评估器的手动调参在补充了一系列关于正则化的基础理论以及 sklearn 中逻辑回归评估器的参数解释之后&#xff0c;接下来&#xff0c;我们尝试借助 sklearn 中的逻辑回归评估器&…...

Oracle数据库入门大全

oracle数据库 Oracle 数据库、实例、用户、表空间、表之间的关系 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pSv0SArH-1675906973035)(vx_images/573695710268888.png 676x)] 数据库 数据库是数据集合。Oracle是一种数据库管理系统&#xff…...

C语言操作符详解(下)

提示&#xff1a;本篇内容是C语言操作符详解下篇 文章目录前言八、条件表达式九、逗号表达式十、 下标引用、函数调用和结构成员1. [ ] 下标引用操作符2. ( ) 函数调用操作符3.结构成员访问操作符十一、表达式求值1. 隐式类型转换举例说明1举例说明2举例说明32.算数转换3.操作…...

宝安中心站是几号线/今日小说排行榜

1.应用场景 主要用于使用 Bootstrap 快速实现 UI. 2.学习/操作 1.文档/音视频资源 https://getbootstrap.com/ https://getbootstrap.com/docs/5.0/getting-started/introduction/ // 最新版本 5.0 文档 https://getbootstrap.com/docs/3.4/ // 3.x 文档 https://www.boot…...

男性产品哪个网站可以做/运营推广计划怎么写

想要学好C的C堆栈&#xff0c;那么就要了解什么是C堆栈&#xff0c;所为C堆栈就是一种数据项按序排列的数据结构&#xff0c;只能在一端(称为栈顶(top))对数据项进行插入和***&#xff0c;分为堆和栈两部分。在C中&#xff0c;内存分成5个区&#xff0c;他们分别是堆、栈、自由…...

工业设计代做网站/百度信息流账户搭建

一.单继承 一个子类对父类的某个方法重写后&#xff0c;可以用super重新调用父类的这个方法 格式 super().方法()例如 class Parent:def __init__(self):print("Parent") class Son1(Parent):pass class Son2(Parent):def __init__(self):print("Son2")…...

网站整体风格设计/一个关键词要刷多久

工作之余抽点时间出来写写博文&#xff0c;希望对新接触的朋友有帮助。今天在这里和大家一同学习一下引用指针 函数是C/C程序的基本功能单元&#xff0c;其重要性不言而喻。函数设计的纤细缺点很容易致使该函数被错用&#xff0c;所以光使函数的功能正确是不敷的。本章重点论述…...

wordpress $comment/广州网络推广公司有哪些

HTML是Web统一语言&#xff0c;这些容纳在尖括号里的简单标签&#xff0c;构成了如今的Web&#xff0c;1991年&#xff0c;Tim Berners-Lee编写了一份叫做“HTML标签”的文档&#xff0c;里面包含了大约20个用来标记网页的HTML标签。他直接借用SGML的标记格式&#xff0c;也就是…...

做网站客户最关心的是什么/互联网全网推广

初始化仓库 创建分支并切换 $ git checkout -b dev//或者分两步$ git branch dev$ git checkout dev 查看当前分支状态 $ git branch 对工作区的修改和提交 把dev合并到master上 $ git checkout master//fastforward模式&#xff08;会将dev分支上的修改合并到master上&#xf…...