redis五种数据结构特点

redis五种数据结构特点

  • redis-string
    • 介绍
    • SDS内部存储数据结构
    • 三种编码方式
    • 特点总结
  • redis-list
    • 介绍
    • quicklist
    • 特点总结
  • redis-hash
    • 特点总结
  • redis-set
    • 介绍
  • 特点总结
  • redis-zset
    • 介绍
    • 特点总结

redis使用五种数据结构,分别是string(字符串),list(列表),hash(哈希表),set(集合),zset(有序列表)。
下面介绍他们的一些特点

redis-string

介绍

string是redis中最基础的数据结构,就是KV键值对中V值的类型是字符串。

SDS内部存储数据结构

redis没有使用char数组来存储字符串,而是使用SDS(simple dynamic string)来存储字符串。SDS是一种数据结构,定义为:

struct sdshdr {//记录buf数组中已使用字节的数量//等于sds所保存字符串的长度int len;//记录buf数组中未使用字节的数量int free;//字节数组,用于保存字符串char buf[];
}

free属性表示这个SDS未使用的空间;
len属性表示这个SDS保存了一个len字节长的字符串;
buf属性是一个char类型的数组,它是一个柔性数组,前面的字节保存了字符串,最后一个字节则保存了空字符’\0’。(保留这种设计是为了让SDS可以直接重用一部分C字符串函数库里面的函数)

相比于c字符串,SDS的优势:

  1. SDS获取字符串长度的时间复杂度是O(1),c字符串是O(n);
  2. SDS在字符串长度增减时自动处理分配空间,杜绝内存溢出的操作;相比c字符串,减少了内存重分配的次数;
  3. SDS是二进制安全的。C字符串中的字符必须符合某种编码(比如ASCII),并且除了字符串的末尾之外,字符串里面不能包含空字符,否则最先被程序读入的空字符将被误认为是字符串结尾,这些限制使得C字符串只能保存文本数据,而不能保存像图片、音频、视频、压缩文件这样的二进制数据。而SDS不会出现因为特殊字符导致字符串被截断的问题,SDS的API都是二进制安全的(binary-safe),所有SDS API都会以处理二进制的方式来处理SDS存放在buf数组里的数据。

三种编码方式

redis为了更好的节省空间,采用不同方式的存储。

  • 当保存的是 Long 类型整数时,RedisObject 中的指针就直接赋值为整数数据了,这样就不用额外的指针再指向整数了,节省了指针的空间开销。
  • 当保存的是字符串数据,并且字符串小于等于 44 字节时,RedisObject 中的元数据、指针和 SDS 是一块连续的内存区域,这样就可以避免内存碎片。这种布局方式也被称为 embstr 编码方式。
  • 当保存的是字符串数据,并且字符串大于 44 字节时,SDS 的数据量就开始变多了,Redis 就不再把 SDS 和 RedisObject 布局在一起了,而是会给 SDS 分配独立的空间,并用指针指向 SDS 结构。这种布局方式被称为 raw 编码模式。

特点总结

  • 采用SDS数据结构进行存储,相比c字符串效率更高,更安全
  • 当字符串是long类型整数时,直接采用int格式存储;
  • 当字符串是<=44字节的字符串,采用embstr格式存储;
  • 当字符串是>44字节的字符串,采用raw格式存储;

redis-list

介绍

list在redis中代表一种可以双向插入,删除的链表。

quicklist

quicklist是redis中list使用的数据结构,它是由双向链表和ziplist组成的。
其主体是一个双向链表,链表中的每一个元素是一个ziplist,每当ziplist超过list-max-ziplist-size大小的时候(默认8字节),就会新建一个ziplist。
这样设计的好处是即保留了链表头尾插入,删除元素的高效,也使得中间元素的查询变得更加高效。

特点总结

  • 采用quicklist进行存储

redis-hash

特点总结

  • redis中的hash使用ziplist和hashtable作为存储数据结构
  • 使用ziplist的条件:
    – key < 64 bytes
    – value < 64 bytes
    – 元素个数 < 521
    – 否则就会使用hashtable
  • redis中的hashtable是使用dictht实现的 在这里插入图片描述
    其中,table 结构是一个 dictEntry 类型的数组,而 dictEntry 是一个单向链表中的节点,代表的是 hashtable 中的一条记录,包含了该条记录的 key、value 以及指向下一个节点(下一条记录)的指针(hash 碰撞)。
    dictEntry 中的 key 和 val 都是 void 类型,意味着可以存储任意数据类型。所以,即使 Redis 中一些数据类型本身的底层实现也是 hashtable(set、zset、hash 等),但仍然可以存储在 redisDb 中的 dict 中。
    dictht 中的 size 表示 hashtable 中 bucket 的数量,sizemask 是 size 的位掩码,用于计算对应的 key 应该存储在哪个 bucket 当中(位运算的效率高于取模运算)。而 used 则用来存储当前 hashtable 中实际存储的记录(元素)的数量。

redis-set

介绍

set在redis中代表无序集合,其中元素的key值不可以重复出现。

特点总结

  • set存储结构是两种:intset和hashtable
  • intset使用条件:
    – V值类型是数字
    – 元素个数 < 512
    – 否则使用hashtable来存储

redis-zset

介绍

zset在redis中代表有序集合,其中元素key值不可以重复出现,按照给定的score排序

特点总结

  • zset使用ziplist和skiplist作为存储结构
  • 使用ziplist的条件:
    – 元素个数 < 128
    – key < 64 bytes
    – value < 64bytes
    – 否则使用skiplist

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

verilog语法进阶-分布式ram

概述: FPGA的LUT查找表是用RAM设计的&#xff0c;所以LUT可以当成ram来使用&#xff0c;也并不是所有的LUT都可以当成ram来使用&#xff0c;sliceM的ram可以当成分布式ram来使用&#xff0c;而sliceL的ram只能当成rom来使用&#xff0c;也就是只能读&#xff0c;不能写&#x…

Linux 内存池源码剖析

1 传统的分配与释放内存的函数缺点: void *malloc(size_t size); void *calloc(size_t nmemb,size_t size);void *realloc(void *ptr, size_t size);void free(void *ptr);缺点1: 高并发时较小内存块使用导致系统调用频繁,降低了系统的执行效率 缺点2: 频繁使用时增加了系统…

跟随鼠标动态显示线上点的值(基于Qt的开源绘图控件QCustomPlot进行二次开发)

本文为转载 原文链接&#xff1a; 采用Qt快速绘制多条曲线&#xff08;折线&#xff09;&#xff0c;跟随鼠标动态显示线上点的值&#xff08;基于Qt的开源绘图控件QCustomPlot进行二次开发&#xff09; 内容如下 QCustomPlot是一个开源的基于Qt的第三方绘图库&#xff0c;能…

【Docker】实战:nginx、redis

▒ 目录 ▒ &#x1f6eb; 导读开发环境 1️⃣ Nginx 拉取 Nginx 镜像nginx.conf启动 Nginx访问 Nginx 2️⃣ redis拉取 Redis 镜像启动 Redis 容器测试 Redis &#x1f4d6; 参考资料 &#x1f6eb; 导读 开发环境 版本号描述文章日期2023-12-15操作系统Win10 - 22H222621.2…

瑞友天翼应用虚拟化系统 多处SQL 注入漏洞复现(可RCE)

0x01 产品简介 瑞友天翼应用虚拟化系统是西安瑞友信息技术资讯有限公司研发的具有自主知识产权,基于服务器计算架构的应用虚拟化平台。它将用户各种应用软件集中部署在瑞友天翼服务器(群)上,客户端通过WEB即可快速安全的访问经服务器上授权的应用软件,实现集中应用、远程接…

介绍一款低代码数据可视化平台

一、前言 随着企业数字化拉开序幕&#xff0c;低代码( Low Code Development)开发的概念开始火起来&#xff0c;即用少量的代码就能开发复杂的业务系统。然后更进一步&#xff0c;由此又催生出一个新的概念&#xff1a;无代码开发( No Code Development)。 低代码和无代码开发平…

Axios入门案例——后端学习

目录 后端准备 导入依赖 解决跨域 User实体类 DemoController测试接口 前端准备 项目结构 axios.js axios.html 开始测试 后端结果 前端结果 后端准备 导入依赖 案例会用到以下的三个依赖。 <dependency><groupId>org.springframework.boot</gro…

CVE-2023-50164 Apache Struts2漏洞复现

CVE-2023-50164 简介&#xff1a; 从本质上讲&#xff0c;该漏洞允许攻击者利用 Apache Struts 文件上传系统中的缺陷。它允许他们操纵文件上传参数并执行路径遍历。这种利用可能会导致在服务器上执行任意代码&#xff0c;从而导致各种后果&#xff0c;例如未经授权的数据访问…

vue-实现高德地图-省级行政区地块显示+悬浮显示+标签显示

<template><div><div id"container" /><div click"showFn">显示</div><div click"removeFn">移除</div></div> </template><script> import AMapLoader from amap/amap-jsapi-load…

CSS的盒子模型(重点)

网页布局的三大核心&#xff1a;盒子模型、浮动、定位 网页布局的过程&#xff1a; 1. 先准备好相关的网页元素&#xff0c;网页元素基本都是盒子 Box 。 2. 利用 CSS 设置好盒子样式&#xff0c;然后摆放到相应位置。 3. 往盒子里面装内容.网页布局的核心本质&#xff1a; 就…

百度地图 TypeError: Cannot set properties of undefined (setting ‘Bm‘)

这类问题出现的原因一般是&#xff0c;页面还没有加载完&#xff0c;地图开始加载&#xff0c;或者地图加载在页面加载之前 在项目中&#xff0c;我用isMapLoading控制地图的加载&#xff0c;false–加载&#xff0c;true不加载&#xff0c;在data()中设置isMapLoadingtrue

Star 4.1k!Gitee GVP开源项目!新一代桌面应用开发框架 ElectronEgg!

前言 随着现代技术的快速升级迭代及发展&#xff0c;桌面应用开发已经变得越来越普及。然而对于非专业桌面应用开发工程师在面对这项任务时&#xff0c;可能会感到无从下手&#xff0c;甚至觉得这是一项困难的挑战。 本篇文章将分享一种新型桌面应用开发框架 ElectronEgg&…