redis中的常用5大数据类型

 更新时间:2024年04月23日 09:34:07   作者:csdn_HZW  
这篇文章主要介绍了redis中的常用5大数据类型,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

1、string(字符串)

String是Redis中最常用的一种数据类型,也是Redis中最简单的一种数据类型。

首先,表面上它是字符串,但其实他可以灵活的表示字符串、整数、浮点数3种值。

Redis会自动的识别这3种值。

2、list(列表)

实际上是一个链表,before Node after , left,right 都可以插入值

  • 如果key 不存在,创建新的链表
  • 如果key存在,新增内容
  • 如果移除了所有值,空链表,也代表不存在!

在两边插入或者改动值,效率最高! 中间元素,相对来说效率会低一点~

消息排队!消息队列 (Lpush Rpop), 栈( Lpush Lpop)!

3、hash(哈希)

哈希的描述:

  • 哈希是一种键值对存储结构,它类似于关联数组或字典。
  • 在哈希中,每个键都唯一地对应一个值,而值可以是字符串、数字或其他数据类型。
  • 哈希适合存储具有结构化数据的对象,比如用户信息、产品信息等。
  • 在哈希中,可以对单个字段进行读写操作,而不需要读取整个数据结构。

哈希的底层数据结构:

  • 哈希的底层数据结构是哈希表(Hash Table)。
  • 在哈希表中,每个键值对被存储在哈希表的一个桶(Bucket)中。
  • 桶是一个数组,它的大小取决于哈希表的大小,通常会随着元素的增加而动态调整。
  • 哈希表通过哈希函数将键映射到桶的位置,并在桶中存储键值对。

下面举个例子:

当你插入一条数据到哈希中时,它的存储过程如下:

假设你要执行以下命令将一条数据插入到哈希中:

HSET myhash field1 value1
  • 计算哈希值:对键 myhash 进行哈希运算,得到一个哈希值,该哈希值将确定数据在哈希表中的存储位置。
  • 映射到桶:根据计算得到的哈希值,确定数据存储在哈希表的哪个桶中。
  • 存储键值对:在确定的桶中,存储键值对数据 {field1: value1}

让我们假设经过哈希计算后,得到的哈希值为 0x12345678,那么这条数据将存储在哈希表中的桶 0x1234 中。

假设该桶中已经有一些数据存在,哈希表和桶的存储可能如下所示:

Hash Table:
Bucket 0x1234:   --> {field2: value2} --> {field1: value1}
                  --> {field3: value3} --> {field4: value4}
                  --> ...
 
Bucket 0x5678:   --> {field5: value5}
                  --> ...
 
Bucket ...       --> ...

在这个示例中:

  • 哈希表包含多个桶,每个桶存储了一部分键值对数据。
  • 0x1234 中存储了一些键值对数据,其中包括 {field1: value1}
  • 这个桶可能使用链表等数据结构来存储数据,以处理哈希冲突,确保每个键值对都可以被正确地存储和检索。

注意:

哈希和下面要介绍的set的底层数据结构有点相似,但是哈希里面存储的是键值对,偏向于键值对;set中偏向于值的集合。

4、set(集合)

集合的描述

  • 集合是一种无序、唯一的数据结构,它类似于数学上的集合。
  • 在集合中,每个元素都是唯一的,且无序存储。
  • 集合适合存储不重复的元素,比如用户的标签、商品的标签等。
  • 集合支持添加、删除、查询等操作,可以对整个集合进行操作,也可以对单个元素进行操作。

集合(Set)的底层数据结构可以有两种形式:整数集合(IntSet)和哈希表(Hash Table)。

整数集合主要用于存储数字类型的元素,而哈希表则用于存储其他类型的元素或者大数量的元素。

整数集合(IntSet):

  • 整数集合是一种特殊的数据结构,它专门用于存储整数类型的元素。
  • 整数集合采用紧凑的数组形式存储元素,这样可以节省内存空间。
  • 当集合中的元素都是整数类型,并且数量较小时,Redis 会使用整数集合作为集合的底层数据结构。

哈希表(Hash Table):

  • 哈希表是一种通用的数据结构,它可以存储任意类型的元素,并且支持动态扩容。
  • 当集合中的元素包含了其他类型,或者数量较大时,Redis 会使用哈希表作为集合的底层数据结构。

在插入数据时,底层数据结构可能会发生变化,具体取决于当前集合的类型和大小:

对于整数集合(IntSet):

  • 如果集合中的元素都是整数类型,并且待插入的元素可以表示为整数,则 Redis 将尝试将元素添加到现有的整数集合中。
  • 如果插入的元素无法表示为整数,或者整数集合无法容纳新的元素,Redis 将会将整数集合转换为哈希表,然后将新的元素插入到哈希表中。

对于哈希表(Hash Table):

  • 如果集合已经使用哈希表作为底层数据结构,Redis 将直接将新的元素添加到哈希表中。
  • 如果集合中的元素都是整数类型,但哈希表的性能更好(例如,集合数量较大),Redis 也会将整数集合转换为哈希表,然后将新的元素插入到哈希表中。

当插入非整数类型的元素到哈希表时,Redis 会通过一系列步骤将该元素插入到哈希表中。

下面是这个过程的简要描述

  • 计算哈希值:对于要插入的元素,Redis 首先会计算其哈希值,以确定在哈希表中的存储位置。
  • 映射到桶:根据计算得到的哈希值,Redis 确定了元素应该存储在哈希表的哪个桶中。
  • 处理哈希冲突:由于不同的元素可能具有相同的哈希值,所以可能会发生哈希冲突。在这种情况下,Redis 会采取适当的方法来解决冲突,例如使用开放定址法、链地址法等。
  • 存储元素:一旦确定了存储位置并解决了哈希冲突,Redis 就会在哈希表的相应桶中存储该元素。

开放定址法和链地址法是解决哈希冲突的两种常见方法。

开放定址法

  • 在开放定址法中,当发生哈希冲突时,不是将冲突的元素放入一个单独的链表中,而是通过一系列的步骤在哈希表中寻找另一个空槽来存放冲突的元素。
  • 具体的步骤包括线性探查、二次探查、双重哈希等。例如,在线性探查中,如果发生冲突,就会依次检查哈希表中的下一个位置,直到找到一个空槽。
  • 开放定址法的优点是节省了存储空间,因为它不需要额外的链表来存储冲突的元素。但是如果哈希表填满了大部分槽位,性能会下降。

链地址法

  • 在链地址法中,哈希表的每个槽位都维护一个链表,用于存储哈希值相同的元素。
  • 当发生哈希冲突时,新的元素将被插入到相应槽位的链表中,而不是直接放入槽位中。
  • 这样,哈希表中的每个槽位都可能对应着一个链表,链表中存储了所有哈希值相同的元素。
  • 链地址法的优点是解决了哈希冲突,保证了元素的正确存储和检索。但是需要额外的空间来存储链表,可能会占用更多的内存。

总的来说,开放定址法通过不断寻找空槽位来解决冲突,而链地址法通过维护链表来存储冲突的元素。

5、zset(有序集合)

有序集合(Sorted Set,通常简称为 ZSET)是 Redis 中的一种数据结构,它类似于集合(SET),但每个成员都关联了一个分数(Score),从而实现了元素的有序存储。

ZSET 的底层数据结构主要由两部分组成:跳跃表(Skip List)和哈希表(Hash Table)。

  • 跳跃表(Skip List):跳跃表是一种随机化数据结构,用于有序元素的快速查找和插入。它是通过在元素的层级之间建立索引来实现快速查找的。跳跃表中的每个节点都包含一个成员(Member)和一个分数(Score),以及若干个指向其他节点的指针,这些指针用于在不同层级之间快速跳跃。通过跳跃表,ZSET 可以实现基于分数的范围查询、快速的成员查找和插入操作。
  • 哈希表(Hash Table):除了跳跃表外,ZSET 还使用了一个哈希表,用于存储成员到分数的映射关系。在哈希表中,键是成员,值是分数。通过哈希表,可以快速地查找指定成员的分数,或者更新成员的分数。哈希表使得 ZSET 可以在常数时间内完成成员与分数之间的映射操作,而不需要遍历跳跃表。

让我们来看一个示例,假设我们有一个 ZSET,存储了一些成员及其对应的分数。

假设我们有以下 ZSET:

ZADD myzset 10 member1
ZADD myzset 20 member2
ZADD myzset 30 member3

在底层,这个 ZSET 的数据可能会被存储如下:

跳跃表(Skip List)

Level 2:        member3 ---------------> NULL
Level 1:        member2 -------> member3
Base Level:     member1 -> member2 -> member3

在跳跃表中,每个节点包含成员和分数信息,并且包含指向同一层级下一个节点的指针。

较高层级的节点包含更多的指针,以实现更快的跳跃。

哈希表(Hash Table)

Key:     Value:
member1  10
member2  20
member3  30

在哈希表中,键是成员,值是成员对应的分数。

通过哈希表,Redis 可以快速地查找成员对应的分数,或者更新成员的分数。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • redis事务常用操作详解

    redis事务常用操作详解

    在本篇文章里小编给大家分享了关于redis事务常用操作的相关知识点内容,有兴趣的朋友们可以跟着学习参考下。
    2019-07-07
  • Redis使用ZSET实现消息队列使用小结

    Redis使用ZSET实现消息队列使用小结

    这篇文章主要介绍了Redis使用ZSET实现消息队列使用总结,本文通过实例代码给大家介绍的非常详细,需要的朋友可以参考下
    2023-03-03
  • 详解如何清理Redis内存碎片

    详解如何清理Redis内存碎片

    操作系统的剩余空间总量足够,但申请一块N字节连续地址的空间时,剩余内存空间中没有大小为N字节的连续空间,那么这些剩余内存空间中,小于N字节的连续内存空间就是内存碎片,本文详细介绍了如何清理Redis内存碎片,需要的朋友可以参考一下
    2023-04-04
  • Spring redis使用报错Read timed out排查及解决过程

    Spring redis使用报错Read timed out排查及解决过程

    项目使用spring集成redis,偶尔会出现read timed out的情况,刚开始以为是网络不稳定引起的,后面发现影响业务测试的准确性,这篇文章主要给大家介绍了关于Spring redis使用报错Read timed out排查及解决过程的相关资料,需要的朋友可以参考下
    2024-02-02
  • 基于Redis6.2.6版本部署Redis Cluster集群的问题

    基于Redis6.2.6版本部署Redis Cluster集群的问题

    这篇文章主要介绍了基于Redis6.2.6版本部署Redis Cluster集群,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-04-04
  • Redis有序集合类型的操作_动力节点Java学院整理

    Redis有序集合类型的操作_动力节点Java学院整理

    今天通过本文给大家说一下Redis中最后一个数据类型 “有序集合类型”,需要的的朋友参考下吧
    2017-08-08
  • Redis 中spark参数executor-cores引起的异常解决办法

    Redis 中spark参数executor-cores引起的异常解决办法

    这篇文章主要介绍了Redis 中spark参数executor-cores引起的异常解决办法的相关资料,需要的朋友可以参考下
    2017-03-03
  • Redis数据结构之跳跃表使用学习

    Redis数据结构之跳跃表使用学习

    这篇文章主要为大家介绍了Redis数据结构之跳跃表使用学习,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-07-07
  • 利用Supervisor管理Redis进程的方法教程

    利用Supervisor管理Redis进程的方法教程

    Supervisor 是可以在类 UNIX 系统中进行管理和监控各种进程的小型系统。它自带了客户端和服务端工具,下面这篇文章主要给大家介绍了关于利用Supervisor管理Redis进程的相关资料,需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-08-08
  • redis主从复制原理的深入讲解

    redis主从复制原理的深入讲解

    这篇文章主要给大家介绍了关于redis主从复制原理的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用redis具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-04-04

最新评论