redis数据类型(5种)和底层实现

article/2025/8/29 8:59:06

redis数据类型(5种)和底层实现

Redis的特点

要用好Redis,首先要明白它的特点:

  • 读写速度快。redis官网测试读写能到10万左右每秒。速度快的原因这里简单说一下,第一是因为数据存储在内存中,我们知道机器访问内存的速度是远远大于访问磁盘的,其次是Redis采用单线程的架构,避免了上下文的切换和多线程带来的竞争,也就不存在加锁释放锁的操作,减少了CPU的消耗,第三点是采用了非阻塞IO多路复用机制
  • 数据结构丰富。 Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构。这也是这篇文章要讲的。
  • 支持持久化。Redis提供了RDB和AOF两种持久化策略,能最大限度地保证Redis服务器宕机重启后数据不会丢失。
  • 支持高可用。可以使用主从复制,并且提供哨兵机制,保证服务器的高可用。
  • 客户端语言多。因为Redis受到社区和各大公司的广泛认可,所以客户端语言涵盖了所有的主流编程语言,比如Java,C,C++,PHP,NodeJS等等。

Redis的数据结构

下面我们就学习Redis的数据结构,也是使用Redis要知道的最基础的知识。

Redis是一个Key-Value型的内存数据库,它所有的key都是字符串,而value常见的数据类型有五种:string,list,set,zset,hash。

Redis的这些数据结构,在底层都是使用redisObject来进行表示。redisObject中有三个重要的属性,分别是type、 encoding 和 ptr

type表示保存的value的类型。通常有以下几种,也就是常见的五种数据结构:

  • 字符串 REDIS_STRING
  • 列表 REDIS_LIST
  • 集合 REDIS_SET
  • 有序集合 REDIS_ZSET
  • 字典 REDIS_HASH

string(字符串)

这是redis中最常用的数据类型,字符串对象的 encoding 有三种,分别是:int、raw、embstr

常用的命令有常用命令: set、get、decr、incr、mget 等。

我们知道Redis是用C语言开发的,但是底层存储不是使用C语言的字符串类型,而是自己开发了一种数据类型SDS进行存储,SDS即Simple Dynamic String ,是一种动态字符串。

hash(字典)

哈希对象的编码有两种,分别是:ziplist、hashtable

当哈希对象保存的键值对数量小于 512,并且所有键值对的长度都小于 64 字节时,使用ziplist(压缩列表)存储;否则使用 hashtable 存储。

Redis中的hashtable跟Java中的HashMap类似,都是通过"数组+链表"的实现方式解决部分的哈希冲突。

list(链表)

列表对象的编码有两种,分别是:ziplist、linkedlist。当列表的长度小于 512,并且所有元素的长度都小于 64 字节时,使用ziplist存储;否则使用 linkedlist 存储。

Redis中的linkedlist类似于Java中的LinkedList,是一个链表,底层的实现原理也和LinkedList类似。这意味着list的插入和删除操作效率会比较快,时间复杂度是O(1)。

set(集合)

set类型的特点很简单,无序,不重复,跟Java的HashSet类似。它的编码有两种,分别是intset和hashtable。如果value可以转成整数值,并且长度不超过512的话就使用intset存储,否则采用hashtable。

hashtable在前面讲hash类型时已经讲过,这里的set集合采用的hashtable几乎一样,只是哈希表的value都是NULL。这个不难理解,比如用Java中的HashMap实现一个HashSet,我们只用HashMap的key就是了。

zset(有序集合)

zset是Redis中比较有特色的数据类型,它和set一样是不可重复的,区别在于多了score值,用来代表排序的权重。也就是当你需要一个有序的,不可重复的集合列表时,就可以考虑使用这种数据类型。

zset的编码有两种,分别是:ziplist、skiplist。当zset的长度小于 128,并且所有元素的长度都小于 64 字节时,使用ziplist存储;否则使用 skiplist 存储。

这里要讲一下skiplist,也就是跳跃表。它的底层实现比较复杂,这里简单地提一下。

跳表是在双向链表之上加多层索引构成的,相对于双向链表,支持快速查找,更新,删除,所以适用于需求灵活的场景。

查找某一个数据时,先在索引里面查找出一个大的范围,然后再下降到原始链表中精确查找。

因为加一层索引后,查找一个结点需要遍历的次数减少了,所以查找效率大大提升。【空间换时间】

针对链表长度比较大的时候,构建索引查找效率的提升就会非常明显。

在这里插入图片描述

跳表的特点

(1) 跳表结合了链表和类似二分查找的思想;

(2) 有很多层结构,由原始链表和一些通过“跳跃”生成的链表组成;

(3) 每一层都是一个有序的链表;

(4) 最底层(Level 1)的链表包含所有元素,越上层“跳跃”的越高,元素(索引)越少;

(5) 查找时从顶层向下,不断缩小搜索范围;

(6) 上层链表是下层链表的子序列;

(7) 每个节点包含两个指针,一个指向同一链表中的下一个元素,一个指向下面一层的元素。

跳表的搜索

在这里插入图片描述

现在访问节点7 经过的节点为1->6->7

链表是有序的,但不能使用二分查找("类似"二分法)。类似二叉搜索树,我们把一些结点提取出来,作为索引。在实际开发中,原始链表中存储的可能是很大的对象,而索引结点只需要存储关键值和几个指针,其额外占用的空间可以被忽略掉。

类似"二分法)。类似二叉搜索树,我们把一些结点提取出来,作为索引。在实际开发中,原始链表中存储的可能是很大的对象,而索引结点只需要存储关键值和几个指针,其额外占用的空间可以被忽略掉。

注意:每隔两个节点往上提升一层建立索引只是理想情况,实际上是通过随机层数K(丢硬币决定 K,随机算法)来实现。


http://chatgpt.dhexx.cn/article/LZTghGIi.shtml

相关文章

Redis数据类型及编码

Redis数据类型及编码 说到Redis的数据类型,我们大概会很快想到Redis的5种常见的数据类型:字符串(String)、列表(List)、散列(Hash)、集合(Set)、有序集合(Sorted Set),以及他们的特点和运用场景及常用命令。不过在讲五大数据类型之前&#x…

Redis 基础 -- Redis数据类型之set

文章目录 1. Redis数据类型之set1.1 set类型介绍1.2 set类型基本操作1.3 set 类型数据的扩展操作:获取随机的数据1.4 set 类型数据的扩展操作:集合的交、并、差集1.4.1 sinter命令1.4.2 sunion命令1.4.3 sdiff命令1.4.4 sinterstore命令1.4.5 sunionstor…

Redis 数据类型

1、string类型 (1)存储的数据:单个数据,最简单的数据存储类型,也是最常用的数据存储类型。 string,他就是存一个字符串儿,注意是value那一部分是一个字符串,它是redis中最基本、最…

NoSQL数据库之Redis(三):常用五大数据类型

目录 Redis键(key)常用命令 Redis字符串(String)常用命令原子性数据结构 Redis列表(List)常用命令数据结构 Redis集合(Set)常用命令数据结构 Redis哈希(Hash)常用命令数据结构 Redis有序集合Zset(sorted set)常用命令数据结构跳跃表(跳表) redis常见数据…

redis的五种数据类型

🏆作者简介:哪吒,CSDN2022博客之星Top1、CSDN2021博客之星Top2、多届新星计划导师✌、博客专家💪 ,专注Java硬核干货分享,立志做到Java赛道全网Top N。 🏆本文收录于,Java基础教程系列,目前已经700+订阅,CSDN最强Java专栏,包含全部Java基础知识点、Java8新特性、…

Redis 的五种基本数据类型

一、String 类型 1.1 介绍 String 类型,也就是字符串类型,是 Redis 中最简单的存储类型。其 value 是字符串,不过根据字符串的格式不同,又可以分为 3 类: string:普通字符串int:整数类型&…

【Redis学习】Redis10大数据类型

总体概述 这里说的数据类型是value的数据类型,key的类型都是字符串。 redis字符串(String) string是redis最基本的类型,一个key对应一个Tvalue。 string类型是二进制安全的,意思是redis的string可以包含任何数据&am…

【Redis7学习日记】—— Redis十大数据类型

一、十大类型概述 首先,我们要知道此处的数据类型指的是 value 的类型,Redis 的 key 都是字符串类型我们通过一张图,先大致了解一下这些数据结构的样子 1.1 String 类型 String 是 Redis 中最基本的数据类型,一个 key 对应一个…

Redis的8种数据类型

目录 一、概述 1、redis是什么 2、redis能干嘛 3、redis常识 3.1、基本命令 3.2、为什么redis是单线程 二、五大数据类型 1、String 2、List列表 3、Set 4、Hash 5、Zset有序集合 三、三种特殊数据类型 1、geospatial地理位置 2、hyperloglog 3、bitmaps 一、概述…

Redis五种基本数据类型

五种基本数据类型 redis无论什么数据类型,在数据库中都是以key-value形式保存,并且所有的key(键)都是字符串,所以讨论基础数据结构都是讨论的value值的数据类型 主要包括常见的5种数据类型,分别是:String、List、Set、…

离散数学课后习题答案 左孝凌版

离散数学课后习题答案(左孝凌版) ,部分截图如下 太多了,就不在一一复制,可以扫描最上面的二维码,关注微信公众“数据结构和算法”,回复离散数学的拼音简称lssx即可获得下载地址

离散数学实验三 · 最短路径计算

一、实验目的 通过本实验的学习理解Dijkstra算法,并且编码实现最短路径问题。 二、实验内容 Dijkstra算法的理解; 算法概念:设G(V,E)是一个带权有向图,把图中顶点集合V分成两组,第一组为已求出最短路径的顶点集合&…

离散数学 习题篇 —— 等价关系的计数

题目: 集合A(1≤∣A∣≤100)上不同的等价关系一共多少个? 输入格式: 一行,一个整数n(1≤n≤100),表示集合A的元素个数。 输出格式: 集合A上不同等价关系的个数模1097,即输出其个数模1000000007。…

《离散数学》期末练习题

《离散数学》期末练习题 一、填空题 1、若p,q为二命题,p→q真值为0 当且仅当 。 2、A{1,{2,3}},则幂集P(A) 。 3、对于公式x(P(x)∨Q(x)),其中P(x):x1,Q(x):x2,当个体域为{1,2}时…

离散数学——命题逻辑

命题逻辑 命题命题的表示 命题联结词否定词:┐(~,Negation)合取词:∧(Conjunction)析取词:∨(Disjunction)条件词:→(条件,Conditional)双条件词:↔(等值,Biconditional)联结词的注意…

离散数学 (II) 习题 9

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 1、 i 是虚数单位,即 i^2^ −1。考虑如下的 4 个二阶方阵:图一G {A, −A, B, −B, C, −C, D, −D} 是由矩阵组成的集合。(1) 请验证 G 对…

-离散数学-期末练习题解析

一、 选择题二. 填空题三、 计算题四、 简答题五、 证明题六、应用题 一、 选择题 下列句子中,( )是命题。 A . 2是常数 B. 这朵花多好看啊! C. 请把们关上! D. 下午有会吗? A 命题是能判断真假的陈述句 B…