Redis数据结构与对象

1、简单动态字符串(SDS)

Redis只会使用C字符串作为字面量,在多数情况下,Redis使用SDS(Simple Dynamic String简单动态字符串)作为字符串表示。

比如C字符串,SDS具有以下优点:

常数复杂度获取字符串长度。

杜绝缓冲区溢出。

减少修改字符串长度时所需要的内存重分配次数。

二进制安全。

兼容部分C字符串函数。

2、链表

链表被广泛用于实现Redis的各种功能,比如列表键、发布订阅、慢查询、监视器等、

每个链表节点有一个listNode结构来表示,每个节点都有一个指向前置节点和后置节点的指针,所以Redis链表实现是双端链表。

每个链表使用一个list结构来表示,这个结构带有表头节点指针、表尾节点指针,以及链表长度等信息。

因为链表表头节点的前置节点和表尾节点的后置节点都指向null,所以Redis的链表实现是无环链表。

通过为链表设置不同的类型特定函授,Redis的链表可以用于保持各自不同类型的值。

3、字典

字典,又称符号表、关联数组、或映射,是一种用于保持键值对的抽象数据结构。

字典被广泛用于实现Redis的各种功能,其中包括数据库和哈希键。

Redis中的字典使用哈希表作为底层实现,每个字典带有两个哈希表,一个平时使用,另一个仅进行rehash时使用。

当字典被用作数据库的底层实现,或者哈希键的底层实现时,Redis使用MurmurHash2算法来计算键的哈希值。

哈希表使用链地址法来解决键冲突,被分配到同一个索引上的多个键值对会连接成一个单向链表。 

在对哈希表进行扩展或者收缩操作时,程序需要将现有哈希表包含的所有键值对rehash到新哈希表里面,并且这个rehash过程并不是一次性地完成的,而是渐进式地完成。

4、跳跃表

跳跃表是有序集合的底层实现之一。

Redis的跳跃表实现有zskiplist和zskiplistNode两个结构组成,其中zskiplist用于保持跳跃表信息(比如表头节点、尾节点、长度),而zskiplistNode则用于表示跳跃表节点。

每个跳跃表节点的层高都是1至32之间的随机数。

在同一个跳跃表中,多个节点可以包含相同的分支,但每个节点的成员对象必须是唯一的。

跳跃表中的节点按照分支大小进行排序,当分值相同时,节点按照成员对象的大小进行排序。

Redis只在实现有序集合键和在集群节点中用作内部数据结构,除此之外,跳跃表在Redis里面没有其他用途。

5、整数集合

整数集合是集合键的底层实现之一。

整数集合的底层实现为数组,这个数组以有序、无重复的方式保存集合元素,在有需要时,程序会根据新添加元素的类型,改变这个数组的类型。

升级操作为整数集合带来了操作上的灵活性,并且尽可能低节约了内存。

整数集合只支持升级操作,不支持降级操作。

6、压缩列表

压缩列表是一种为节约内存而开发的顺序型数据结构。

压缩列表被用作列表键和哈希键的底层实现之一。

压缩列表可以包含多个节点,每个节点可以保持一个字节数组或者整数值。

添加新节点到压缩列表,或者从压缩列表中删除节点,可能会引发连锁更新操作,但这种操作出现的几率并不高

7、对象

Redis数据库中的每个键值对的键和值都是一个对象。

Redis共有字符串、列表、哈希、集合、有序集合五种类型的对象,每种类型的对象只有都有两种或以上的编码方式,不同的编码可以在不同的使用场景上优化对象的使用效率。

服务器在执行某些命令之前,会先检查给定键的类型能否执行指定的命令,而检查一个键的类型就是检查键的值对象的类型。

Redis的对象系统带有引用计数实现的内存回收机制,当一个对象不再被使用时,该对象所占用的内存就会被自动释放。

Redis会共享值为0到9999的字符串对象。

对象会记录自己的最后一次被访问的时间,这个时间可以用于计算对象的空转时间。 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Redis使用多种数据结构来实现不同的功能。如果只使用字符串类型,并且不使用Redis的持久化功能,那么Redis与Memcache非常相似,它们都可以用作缓存。 除了字符串类型,Redis还支持其他数据结构,如列表(List)、哈希(Hash)、集合(Set)和有序集合(Sorted Set)。 对于数据量较少的情况,Redis 3.0的List对象会使用压缩列表(ziplist)作为底层数据结构,它具有节省内存空间和紧凑的特点。 有序集合(Zset)是Redis中唯一一个同时使用两种数据结构来实现的对象,它使用跳表(Skip List)和哈希表(Hash Table)来实现高效的范围查询和单点查询。 通过选择合适的数据结构Redis可以提供高效的数据存储和查询能力。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [redis数据结构及用法汇总](https://blog.csdn.net/qq_42671928/article/details/123677676)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [Redis数据结构](https://blog.csdn.net/mz474920631/article/details/125200050)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值