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

Redis五大基础类型解析

1.String类型

特征:即存储字符串的类型,单个字符串存储量最大不超过512MB

常用业务场景:⽤来存储JSON序列化之后对象

底层编码:

int编码

数据结构特点:ptr指针直接指向字符串常量池中对应字符串地址,而且数组中元素只能为数字

使⽤要求:每⼀个字符必须是数字

EmbStr编码

数据结构特点:采⽤简单动态字符串结构,这种结构的特征就在于是⼀个可扩容的字符数组,由当前已使⽤⻓度字段,当前未使⽤⻓度字段以及⼀个字符数组组成。

扩容规则:当字符数组大小小于1MB时,将总长度进行翻倍,如果字符数组大小大于1MB,那么每次增加1MB的长度

使用要求:当字符串大小小于32MB时候,采用的编码

数据结构内存地址所在:为RedisObject对象后的连续内存

Raw编码

数据结构特点:同样采用简单动态字符串作为数据结构

使用要求为当字符串大小超过32MB的时候,自动转为RAW编码

数据结构内存地址所在:不和RedisObject对象在⼀起,而是在内存中其他随机地方

重点:由于EmbStr和Raw编码中简单动态字符串结构(SDS)内存地址不同,所以最开始⽣成String对象的时候,分配内存的次数也不同,由于EmbStr的RedisObject对象和SDS对象是连续的,所以⼀起分配内存就行,但是raw需要两次内存分配

2.List类型

特征:有序,可重复列表。每个List类型可以插入(2的32次方)-1个元素

常⽤业务场景

最新与最老数据的TOP显示:由于底层采用双向链表/压缩列表的方式进行存储,均能获取头节点和尾节点指针,每个节点均有前后指针的关系,非常适合进行操作头部与尾部节点

消息队列:即⽣产者可以使⽤push方法往List类型的头部插入信息,然后消费者通过pop对List类型的尾部进行消费

底层编码:

ZipList编码

数据结构特点:即⼀段连续的内存数组,但是和普通的数组不同,他的每⼀个元素空间都是根据其中存储的元素大小来规定的,并不是死板的固定大小,并有记录当前最后⼀个元素位置的指针。

数据结构特点:即⼀段连续的内存数组,但是和普通的数组不同,他的每⼀个元素空间都是根据其中存储的元素大小来规定的,并不是死板的固定大小,使⽤要求:即当每⼀个元素大小不超过64个字节,总元素个数不超过512个并有记录当前最后⼀个元素位置的指针。

数据结构内存地址所在:作为RedisObject对象后的连续内存,所以⽣成List对象时,此编码只⽤分配⼀次内存

LinkedList编码

数据结构特点:就是双向链表

使⽤要求:当不满⾜zipList编码要求的时候,就会变成LinkedList编码

数据结构内存地址所在:不和RedisObject在⼀起,⽽是在内存中的任意位置

3.Hash类型

特征:每个Hash类型可以存放(2的32次⽅)-1个键值对

常⽤业务场景:购物车的管理,即使⽤⽤户id作为key值,⽤商品id作为field字段,⽤商品数量作为value,那么我们可以使⽤hgetAll指令完成购物⻋全选,hdel删除指定商品等等操作

底层编码:

ZipList编码

数据结构特点:和List类型采⽤此编码时运⽤不太⼀样,Hash类型会把field-value键值对连续的插⼊到压缩列表中,从⽽完成不同键值对的存储

使⽤要求:即当每⼀个元素⼤⼩不超过64个字节,总元素个数不超过512个

数据结构内存地址所在:作为RedisObject对象后的连续内存,所以⽣成List对象时,此编码只⽤分配⼀次内存

Hashtable编码

数据结构特点:底层为哈希表数据结构,⽤以存储field-value键值对

使⽤要求:当不满⾜zipList编码要求的时候,就会变成LinkedList编码

4.Set类型

特征:为⽆序,⽽不可重复集合,可以存放(2的32次⽅)-1个元素

常使⽤业务场景:

元素去重:即⼤量元素去重操作会占⽤⼤量CPU资源,那么把这些数据存储到Set类型中,即可完成去重操作

共同好友等:把⼀个⽤户的好友和另⼀个⽤户的好友进⾏交集处理,得到他们的公同好友,然后进⾏推荐

底层编码:

Inset编码

数据结构特点:即由整型数组组成的连续内存(此数组按元素⼤⼩进⾏排序),但是除了整形数组外,还有有当前数组包含的元素数量以及采⽤整形的编码,可分为int16,int32,int64.分别是整形数组中运⾏存放数值的⼤⼩

使⽤要求:元素个数⼩于512个,⽽且集合内元素全为数字

数据结构内存地址所在:和RedisObject相连的连续内存

HT编码

数据结构特点:由Value值为空的Hashtable结构组成,被称为字典。

使⽤要求:当不满⾜inset编码要求的时候,就会变成HT编码

5.ZSet类型

特征:为有序,⽽不可重复集合,可以存放(2的32次⽅)-1个元素

常使⽤业务场景:热⻔数据TOP排⾏榜,即利⽤Zset类型,有序不重复特点,把重复的数据进⾏去重并且使⽤score字段排序后,从⼩到⼤排序,反序即可得到热⻔数据TOP排⾏榜

底层编码:

ZipList编码

数据结构特点:压缩列表的另⼀种使⽤,即使⽤⼀个新增的score字段来决定元素在压缩列表中的位置,默认从⼩到⼤

使⽤要求:元素单个⼤⼩不能超过64字节,压缩数组⻓度不能超过128个元素

数据结构内存地址所在:和RedisObject相连的连续内存

skipList编码

数据结构特点:通过跳表与Hashtable的集合编码,利⽤跳表存储hash表中的节点来完成有序,操作主要还是在hash表中,跳表中的⼤⼩由Score字段来决定

使⽤要求:当不满⾜zipList编码要求的时候,就会变成skipList编码

相关文章:

Redis五大基础类型解析

1.String类型 特征:即存储字符串的类型,单个字符串存储量最大不超过512MB 常用业务场景:⽤来存储JSON序列化之后对象 底层编码: int编码 数据结构特点:ptr指针直接指向字符串常量池中对应字符串地址,而…...

在CSDN学Golang云原生(服务网格istio)

一&#xff0c;在Kubernetes上部署istio 在Kubernetes上部署istio&#xff0c;可以按照以下步骤进行&#xff1a; 安装Istio 使用以下命令从Istio官网下载最新版本的Istio&#xff1a; curl -L https://istio.io/downloadIstio | ISTIO_VERSION<VERSION> sh - 其中&…...

Golang 获取本地 IP 地址方法

在 Golang 中&#xff0c;使用 net 包可以很方便地获取到本机IP地址。 借助 net.InterfaceAddrs 方法 简单示例代码如下&#xff1a; package mainimport ("fmt""net" )func main() {addrList, err : net.InterfaceAddrs()if err ! nil {panic(err)}for…...

抖音seo短视频账号矩阵系统技术开发简述

说明&#xff1a;本开发文档适用于抖音seo源码开发&#xff0c;抖音矩阵系统开发&#xff0c;短视频seo源码开发&#xff0c;短视频矩阵系统源码开发 一、 抖音seo短视频矩阵系统开发包括 抖音seo短视频账号矩阵系统的技术开发主要包括以下几个方面&#xff1a; 1.前端界面设…...

运维高级--shell脚本完成分库分表

为什么要进行分库分表 随着系统的运行&#xff0c;存储的数据量会越来越大&#xff0c;系统的访问的压力也会随之增大&#xff0c;如果一个库中的表数据超过了一定的数量&#xff0c;比如说MySQL中的表数据达到千万级别&#xff0c;就需要考虑进行分库分表&#xff1b; 其…...

Mysql 忘记密码怎么重置密码(详细步骤)

每种方法都有其适用的情况&#xff0c;根据具体情况选择合适的方法。无论选择哪种方法&#xff0c;请务必在重置密码后及时删除临时用户并重新启动 MySQL 服务。 一、使用 mysqladmin 重置密码 停止服务 # systemctl 启动的使用这个停止 $ sudo systemctl stop mysql# mac 本机…...

机器学习深度学习——图像分类数据集

&#x1f468;‍&#x1f393;作者简介&#xff1a;一位即将上大四&#xff0c;正专攻机器学习的保研er &#x1f30c;上期文章&#xff1a;机器学习&&深度学习——softmax回归&#xff08;下&#xff09; &#x1f4da;订阅专栏&#xff1a;机器学习&&深度学习…...

【PWN · 栈迁移】[BUUCTF]ciscn_2019_es_2

第一道栈迁移题目&#xff0c;跌跌撞撞理解了 前言 当前溢出可用空间比较少时&#xff08;极端情况下仅能覆写ebp和ret&#xff09;&#xff0c;可以通过栈迁移的方式&#xff0c;扩大shellcode的容纳空间&#xff0c;其核心是将esp移动到一段shellocode开头。而esp总是由ebp赋…...

网络编程(13): 网络通信常用命令(后续待补充)

ifconfig 一般用于查看网卡信息 ping 一般用于侦测本机到目标网络主机的网络是否通常: ping ip/域名 telnet 可以用于指定ip地址和端口的侦听服务是否存在&#xff1a;telnet ip port, 也可以模拟客户端给服务器发数据 netstat 用于查看网络连接状态 -a: 显示所有选项 -t&#…...

flask创建数据库连接池

flask创建数据库连接池 在Python中&#xff0c;您可以使用 Flask-SQLAlchemy 这个扩展来创建一个数据库连接池。Flask-SQLAlchemy 是一个用于 Flask 框架的 SQLAlchemy 操作封装&#xff0c;实现了 ORM(Object Relational Mapper)。ORM 主要用于将类与数据库中的表建立映射关系…...

C语言手撕顺序表

目录 一、概念 1、静态顺序表&#xff1a;使用定长数组存储元素。 2、动态顺序表&#xff1a;使用动态开辟的数组存储 二、接口实现 1、对顺序表的初始化 2、对数据的销毁 3、对数据的打印 4、检查是否需要扩容 5、尾插 6、头插 7、尾删 8、头删 9、在pos位置插入x …...

常见的排序算法

常见的排序算法 常见的排序算法包括&#xff1a; 冒泡排序&#xff08;Bubble Sort&#xff09;&#xff1a;依次比较相邻的元素&#xff0c;将较大的元素交换到右侧&#xff0c;逐步将最大元素移动到末尾。插入排序&#xff08;Insertion Sort&#xff09;&#xff1a;将数组…...

C#如何使用SQLite数据库?

文章目录 0.引言1.SQLite工具准备2.创建窗体项目并添加SQLite的命名空间3.编写使用SQLite代码4.结果展示 0.引言 SQLite是一个轻量级的嵌入式数据库&#xff0c;它的库文件非常小巧&#xff0c;不需要独立的服务器进程或配置。这使得它非常适合在资源受限的环境中使用&#xff…...

如何将表格中的状态数据转换为Tag标签显示

考虑到系统前端页面的美观程度&#xff0c;通常通过Tag标签来代替某条数据中的状态信息。仅通过一点操作&#xff0c;便能够使得页面美观程度得到较大提升&#xff0c;前后对比如下所示。代码基于Vue以及Element-ui组件实现。 修改前&#xff1a; 修改后&#xff1a; 修改前…...

centos中修改防火墙端口开放配置

1、直接进入文件修改 vim /etc/sysconfig/iptables 2、添加需要开放的端口 &#xff08;1&#xff09;添加需要开放的单个端口 4001 -A INPUT -m state --state NEW -m tcp -p tcp --dport 4001 -j ACCEPT &#xff08;2&#xff09;添加需要开放的某个网段端口 4001:4020 …...

程序设计 算法基础

✅作者简介&#xff1a;人工智能专业本科在读&#xff0c;喜欢计算机与编程&#xff0c;写博客记录自己的学习历程。 &#x1f34e;个人主页&#xff1a;小嗷犬的个人主页 &#x1f34a;个人网站&#xff1a;小嗷犬的技术小站 &#x1f96d;个人信条&#xff1a;为天地立心&…...

【数据结构】之十分好用的“链表”赶紧学起来!(第一部分单向链表)

&#x1f490; &#x1f338; &#x1f337; &#x1f340; &#x1f339; &#x1f33b; &#x1f33a; &#x1f341; &#x1f343; &#x1f342; &#x1f33f; &#x1f344;&#x1f35d; &#x1f35b; &#x1f364; &#x1f4c3;个人主页 &#xff1a;阿然成长日记 …...

ubuntu开机自启动

ubuntu开机自启动 1、建一个test.sh脚本&#xff0c;并写入 #!/bin/sh gnome-terminal -x bash -c ‘cd /home/文件路径/;python3 main.py’ exit 0 2、:wq!保存 3、创建rc-local.service文件&#xff08;sudo vim /etc/systemd/system/rc-local.service&#xff09;&#xf…...

Git将其他分支合并至主分支

主要思想&#xff1a; 把分支代码合并到master&#xff0c;合给谁&#xff0c;就先切换到谁的分支 1. 当前分支是dev&#xff0c;开发完成后&#xff0c;需要合并到master分支 先把该提交的提交&#xff0c;需要push的push完成后&#xff0c;再切换分支。 否则也会告诉你要提交…...

Python+request+pytest 接口自动化测试框架入门(与unittest的比较)

1. Pythonrequestpytest 接口自动化测试框架入门 - 简书 pytest和unittest的比较&#xff1a; pytest是一个非常成熟的全功能的Python测试框架&#xff0c;主要有以下几个特点&#xff1a; 简单灵活&#xff0c;容易上手支持参数化能够支持简单的单元测试和复杂的功能测试&a…...

web vue 项目 Docker化部署

Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段&#xff1a; 构建阶段&#xff08;Build Stage&#xff09;&#xff1a…...

质量体系的重要

质量体系是为确保产品、服务或过程质量满足规定要求&#xff0c;由相互关联的要素构成的有机整体。其核心内容可归纳为以下五个方面&#xff1a; &#x1f3db;️ 一、组织架构与职责 质量体系明确组织内各部门、岗位的职责与权限&#xff0c;形成层级清晰的管理网络&#xf…...

JUC笔记(上)-复习 涉及死锁 volatile synchronized CAS 原子操作

一、上下文切换 即使单核CPU也可以进行多线程执行代码&#xff0c;CPU会给每个线程分配CPU时间片来实现这个机制。时间片非常短&#xff0c;所以CPU会不断地切换线程执行&#xff0c;从而让我们感觉多个线程是同时执行的。时间片一般是十几毫秒(ms)。通过时间片分配算法执行。…...

Mac下Android Studio扫描根目录卡死问题记录

环境信息 操作系统: macOS 15.5 (Apple M2芯片)Android Studio版本: Meerkat Feature Drop | 2024.3.2 Patch 1 (Build #AI-243.26053.27.2432.13536105, 2025年5月22日构建) 问题现象 在项目开发过程中&#xff0c;提示一个依赖外部头文件的cpp源文件需要同步&#xff0c;点…...

iOS性能调优实战:借助克魔(KeyMob)与常用工具深度洞察App瓶颈

在日常iOS开发过程中&#xff0c;性能问题往往是最令人头疼的一类Bug。尤其是在App上线前的压测阶段或是处理用户反馈的高发期&#xff0c;开发者往往需要面对卡顿、崩溃、能耗异常、日志混乱等一系列问题。这些问题表面上看似偶发&#xff0c;但背后往往隐藏着系统资源调度不当…...

无人机侦测与反制技术的进展与应用

国家电网无人机侦测与反制技术的进展与应用 引言 随着无人机&#xff08;无人驾驶飞行器&#xff0c;UAV&#xff09;技术的快速发展&#xff0c;其在商业、娱乐和军事领域的广泛应用带来了新的安全挑战。特别是对于关键基础设施如电力系统&#xff0c;无人机的“黑飞”&…...

【JavaSE】多线程基础学习笔记

多线程基础 -线程相关概念 程序&#xff08;Program&#xff09; 是为完成特定任务、用某种语言编写的一组指令的集合简单的说:就是我们写的代码 进程 进程是指运行中的程序&#xff0c;比如我们使用QQ&#xff0c;就启动了一个进程&#xff0c;操作系统就会为该进程分配内存…...

LRU 缓存机制详解与实现(Java版) + 力扣解决

&#x1f4cc; LRU 缓存机制详解与实现&#xff08;Java版&#xff09; 一、&#x1f4d6; 问题背景 在日常开发中&#xff0c;我们经常会使用 缓存&#xff08;Cache&#xff09; 来提升性能。但由于内存有限&#xff0c;缓存不可能无限增长&#xff0c;于是需要策略决定&am…...

数学建模-滑翔伞伞翼面积的设计,运动状态计算和优化 !

我们考虑滑翔伞的伞翼面积设计问题以及运动状态描述。滑翔伞的性能主要取决于伞翼面积、气动特性以及飞行员的重量。我们的目标是建立数学模型来描述滑翔伞的运动状态,并优化伞翼面积的设计。 一、问题分析 滑翔伞在飞行过程中受到重力、升力和阻力的作用。升力和阻力与伞翼面…...

通过MicroSip配置自己的freeswitch服务器进行调试记录

之前用docker安装的freeswitch的&#xff0c;启动是正常的&#xff0c; 但用下面的Microsip连接不上 主要原因有可能一下几个 1、通过下面命令可以看 [rootlocalhost default]# docker exec -it freeswitch fs_cli -x "sofia status profile internal"Name …...