Redis 的数据结构和内部编码

Redis的 5 种数据类型

在这里插入图片描述

Redis 底层在实现上述数据结构的时候,会在源码层面,针对上述实现进行 特定的优化 ,来达到节省时间/节省空间效果
特定的优化:内部的具体实现的数据结构,在特定场景下,不是其对应的标准数据结构,而是使用别的数据结构实现,不过仍然保证时间复杂度符合要求
编码方式:redis 数据结构的底层实现
同一个数据类型,背后可能的编码实现方式是不同的,会根据特定场景优化



数据类型对应的内部编码


数据结构内部编码
string1.raw
2.embstr
3.int
hash1.hashtable
2.ziplist
list1.linkedlist
2.ziplist
set1.hashtable
2.intset
zset1.skiplist
2.ziplist

String

1. raw

最基本的字符串.的实现,底层是一个C++的 char数组,类似于或者Java中的 byte数组

2. embstr

针对短字符串进行的特殊优化

3. int

redis 用来实现一些"计数"这样的功能 ,value 为一个整数的时候,此时 redis 会直接使用 int 来保存字符串


hash

1. hashtable

最基本的哈希表

2.ziplist

在哈希表里面元素比较少的时候,就会优化成 ziplist ,通过压缩列表,来够节省空间;
由于元素过少,通过遍历,时间复杂度还是可以认为是 O(1)
压缩原因:当对应的是 hash 的 key 特别多,但是每个 hash 又不大的情况下,就去压缩,压缩之后让整体占用更小的内存


list

1.linkedList

链表

2.ziplist

压缩链表

从 redis 3.2 开始,引入了新的实现方式 quicklist,同时兼顾了linkedlist和ziplist的优点;
quicklist 就是一个链表,每个元素又是一个ziplist,把空间和效率都兼顾到;
quicklist类似于C++中的std:deque


set

1.hashtable

最基本的哈希表

2.intset

针对特殊常景的特殊优化,比如:当集合中存的都是整数时,就会优化为 intset


zset

1.skiplist

skiplist:跳表

跳表也是链表,不同于普通的链表,每个节点上有多个指针域;
通过巧妙的搭配这些指针域的指向,就可以做到,从跳表上查询元素的时间复杂度是O(logN)
示例: 链表笔试题中的一个经典题目【138. 随机链表的复制】

2.ziplist

压缩链表
ziplist 是一种紧凑的、压缩的数据结构,它将多个元素按顺序存储在一起,节省内存空间



object encoding 命令查询内部编码

object encoding key:查看 key 对应的 value 的实际编码方式

示例代码:

127.0.0.1:6379> type key1
string
127.0.0.1:6379> OBJECT encoding key1
"int"
127.0.0.1:6379> type key2
list
127.0.0.1:6379> OBJECT encoding key2
"quicklist"
127.0.0.1:6379> type key3
set
127.0.0.1:6379> OBJECT encoding key3
"intset"
127.0.0.1:6379> type key4
hash
127.0.0.1:6379> OBJECT encoding key4
"ziplist"

redis 会自动根据当前的实际情况选择内部的编码方式,是自动适应的,我们在使用 redis 的时候一般感知不到

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/554060.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ros1 C++ 输出helloworld

1、创建工作空间并初始化 mkdir -p 自定义空间名称/src cd 自定义空间名称 catkin_make运行完,生成文件如下图: 2、进入 src 创建 ros 包并添加依赖 cd src catkin_create_pkg 自定义ROS包名 roscpp rospy std_msgs这里,我的自定义ROS包名…

VUE 页码分页封装

VUE 页码封装组件 pagination/index.vue &#xff1a; <template><div class"pagination-contianer"><el-pagination background layout"prev, pager, next" :total"total" current-change"currentChange"> </e…

SQL255 给出employees表中排名为奇数行的first_name

题目来源&#xff1a; 给出employees表中排名为奇数行的first_name_牛客题霸_牛客网 描述 对于employees表中&#xff0c;输出first_name排名(按first_name升序排序)为奇数的first_name CREATE TABLE employees ( emp_no int(11) NOT NULL, birth_date date NOT NULL, firs…

【服务器部署篇】Linux下Redis安装

作者介绍&#xff1a;本人笔名姑苏老陈&#xff0c;从事JAVA开发工作十多年了&#xff0c;带过刚毕业的实习生&#xff0c;也带过技术团队。最近有个朋友的表弟&#xff0c;马上要大学毕业了&#xff0c;想从事JAVA开发工作&#xff0c;但不知道从何处入手。于是&#xff0c;产…

基于SpringBoot的幼儿园管理系统 免费获取源码

项目源码获取方式放在文章末尾处 项目技术 数据库&#xff1a;Mysql5.7 数据表&#xff1a;16张 开发语言&#xff1a;Java(jdk1.8) 开发工具&#xff1a;idea 前端技术&#xff1a;html 后端技术&#xff1a;SpringBoot 功能简介 项目获取关键字&#xff1a;幼儿园 该…

《大话数据结构》03 线性表

1. 线性表的定义 线性表&#xff1a;零个或多个数据元素的有限序列。 这里需要强调几个关键的地方。 首先它是一个序列。也就是说&#xff0c;元素之间是有顺序的&#xff0c;若元素存在多个&#xff0c;则第一个元素无前驱&#xff0c;最后一个元素无后继&#xff0c;其他每…

基于云计算技术的HIS系统,一体化云HIS、云病历、云LIS系统源码,扩展后能够应用于医联体/医共体

医院信息管理系统云HIS系统源码&#xff0c;云计算技术的HIS系统源码 开发技术&#xff1a; 前端&#xff1a;AngularNginx&#xff1b; 后台&#xff1a;JavaSpring&#xff0c;SpringBoot&#xff0c;SpringMVC&#xff0c;SpringSecurity&#xff0c;MyBatisPlus 等&…

基于ssm校园驿站全天候辅助取货管理系统的设计与实现论文

摘 要 身处网络时代&#xff0c;随着网络系统体系发展的不断成熟和完善&#xff0c;人们的生活也随之发生了很大的变化&#xff0c;人们在追求较高物质生活的同时&#xff0c;也在想着如何使自身的精神内涵得到提升&#xff0c;而读书就是人们获得精神享受非常重要的途径。为了…

DNS服务器的管理与配置

目录 一、相关知识 域名空间 DNS服务器分类 域名解析过程 资源记录 二、安装DNS服务 安装bind软件包 DNS服务的启动与停止 配置主要名称服务器 主配置文件 从例子学起&#xff1a; &#xff08;1&#xff09;建立主配置文件named.conf &#xff08;2&#xff09;…

酒店管理系统

文章目录 酒店管理系统一、项目演示二、项目介绍三、15000字论文参考四、部分功能截图五、部分代码展示六、底部获取项目源码和万字论文参考&#xff08;9.9&#xffe5;带走&#xff09; 酒店管理系统 一、项目演示 酒店管理系统 二、项目介绍 基于springbootvue前后端分离的…

亿级流量系统多级缓存架构6

亿级流量系统多级缓存架构6 服务限流 什么叫限流&#xff1f; Ab测试 yum install httpd-tools即限制流量进入 缓存&#xff0c;是用来增加系统吞吐量&#xff0c;提升访问速度提供高并发。 降级&#xff0c;是在系统某些服务组件不可用的时候、流量暴增、资源耗尽等情况…

宠物店小程序如何搭建制作?宠物店小程序核心功能有哪些?

随着宠物经济的兴起&#xff0c;宠物店的线上服务需求日益增长。微信小程序作为一种便捷的线上服务平台&#xff0c;为宠物店提供了一个与爱宠人士建立联系的新渠道。面对市场上众多的小程序开发选项&#xff0c;宠物店应该如何选择或制作一款适合自己的小程序呢&#xff1f;本…

[spring] Spring Boot REST API - CRUD 操作

Spring Boot REST API - CRUD 操作 这里主要提一下 spring boot 创建 rest api&#xff0c;并对其进行 CRUD 操作 jackson & gson 目前浏览器和服务端主流的交互方式是使用 JSON(JavaScript Object Notation)&#xff0c;但是 JSON 没有办法直接和 Java 的 POJO 创建对应…

【网络运维知识】—路由器与交换机区别

【网络运维知识】—路由器与交换机区别 一、路由器&#xff08;Router&#xff09;和交换机&#xff08;Switch&#xff09;对比1.1 功能1.2 转发方式1.3 范围1.4 处理方式 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 路由器&#xff08…

ShadowFormer:Global Context Helps Images Shadow Removal

本论文主要是对图像阴影去除工作的研究。现有工作都是针对于局部阴影或阴影部分分别进行优化&#xff0c;这就会导致在分界线上有明显不同&#xff08;光照不一致&#xff0c;伪影情况&#xff09;。因此&#xff0c;本文提出一种全局优化算法shandowFormer来解决分界不一致问题…

Springboot+Vue项目-基于Java+MySQL的企业客户管理系统(附源码+演示视频+LW)

大家好&#xff01;我是程序猿老A&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f49e;当前专栏&#xff1a;Java毕业设计 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f380; Python毕业设计 &…

数据结构中的顺序表的删除和查找

对于顺序表&#xff0c;它包括&#xff1a;初始化&#xff0c;取值&#xff0c;查找&#xff0c;插入&#xff0c;以及删除。接下来就讲一讲删除和查找。 删除&#xff1a;它包括头删和尾删&#xff0c;为什么顺序表中要用到删除呢&#xff1f;按我的理解就是&#xff1a;为插入…

SRIO系列-基本概念及IP核使用

参考&#xff1a;串行RapidIO: 高性能嵌入式互连技术 | 德州仪器 SRIO协议技术分析 - 知乎 PG007 目录 一、SRIO介绍 1.1 概要 1.2 SRIO与传统互联方式的比较 1.3 串行SRIO标准 1.4 SRIO层次结构&#xff1a; 1.4.1 逻辑层 1.4.2 传输层协议 1.4.3 物理层 二、Xilinx…

内网隧道技术总结

隧道技术解决的是网络通信问题&#xff0c;因为在内网环境下&#xff0c;我们不同的内网主机管理员会进行不同的网络配置&#xff0c;我们就需要使用不同的方式去控制我们的内网主机。隧道技术是一个后渗透的过程&#xff0c;是可以是我们已经取得了一定的权限&#xff0c;在这…

【Visual Studio 2012中文版】下载安装以及使用方法

文章目录 前言一、下载安装包二、安装步骤1.双击VS2012_ULT_chs.iso文件打开2.双击vs_ultimate.exe打开安装程序3.选择要安装的功能4.软件正在安装&#xff0c;请耐心等待10分钟5.安装成功&#xff0c;点击“启动”6.激活码&#xff08;产品密钥&#xff09; 三、VS2012使用&am…