Redis数据结构与对象

SDS:Simple Dynamic String 简单动态字符串

  • 1.与C字符串相比,获取字符串长度的复杂度为O(1)
  • 2.不会产生溢出问题。
  • 3.空间预分配,如果对SDS修改之后,SDS的len小于1MB,则len和free相同。如果大于1MB,那么会分配1MB的未使用空间。
  • 4.扩展SDS空间之前,SDS API会先检查未使用空间是否足够,如果足够API就会直接使用未使用空间,而无须执行内存重分配。
  • 5.惰性空间释放
  • 6.可以保存二进制数据或者文本数据。

链表

  • 1.双端链表,获取某个节点的前置节点和后置节点的复杂的都是O(1)
  • 2.无环,以NULL为终点。
  • 3.带表头指针和表尾指针。
  • 4.带链表长度计数器。
  • 5.多态,通过为链表设置不同的类型特定函数,可以用于保存各种不同类型的值。

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

字典,(符号表、关联数组、映射)

Redis需要创建当前服务器的子进程,而大多数操作系统都采用写时复制(COW)技术来优化子进程的使用效率。
哈希表扩容:
1.当服务器没有执行BGSAVE或BGREWRITAOF命令,并且负载因子大一等于1时;
2.当服务器正在执行BGSAVE或BGREWRITAOF命令,并且负载因子大一等于5时;
哈希表缩容:
当负载因子小于 0.1 时。

渐进式rehash:分而治之
因为在渐进式rehash的过程中,字典会同时使用ht[0]和ht[1]两个哈希表,所以在渐进式rehash进行期间,字典的删除(delete)、查找(find)、更新(update)等操作会在两个哈希表上进行。

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

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

跳跃表(skiplist)

平均复杂度O(logN)、最坏O(N)

Redis只在两个地方用到了跳跃表,一个是实现有序集合键,另一个是在集群节点中用作内部数据结构,跳跃表是有序集合的底层实现之一。

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

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

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

整数集合

整数集合(intset)是集合键的底层实现之一,当一个集合只包含整数值元素,并且这个集合的元素数量不多时,Redis就会使用整数集合作为集合键的底层实现。

升级:整数集合升级策略有两个好处,一个是提升整数集合的灵活性,另一个是尽可能地节约内存。

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

压缩列表(ziplist)

压缩列表是列表键和哈希键地底层实现之一。

压缩列表是Redis为了节约内存而开发的,是由一系列特殊编码地连续内存块组成地顺序型(sequential)数据结构。

一个压缩列表可以包含任意多个节点(Entry),每个节点可以保存一个字节数组或者一个整数值。

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

对象

字符串对象、列表对象、哈希对象、集合对象和有序集合对象。
内存回收机制:基于引用计数法的内存回收机制。

Redis使用对象来表示数据库中的键和值,每次当我们在Redis的数据库中新创建一个键值对时,我们至少会创建两个对象,一个对象用作键值对的键(键对象),另一个对象用作键值对的值(值对象)。对于Redis数据库保存的键值对来说,键总是一个字符串对象,而值可以是五种对象中的任意一种。

 

 

  • 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、付费专栏及课程。

余额充值