关注
五大对象分别是 【1】字符串对象 【2】列表对象 【3】哈希对象 【4】集合对象 【5】有序集合对象 【1】字符串对象 如果字符串对象保存的是一个整数值并且这个整数可以用long类型来表示,那么会直接将整数值保存在ptr属性里,设置编码为int。 如果字符串对象保存的是一个字符串值,并且这个字符串值长度大于39字节,那么它将使用一个SDS结构来保存这个字符串值,设置编码为raw。 而如果字符串长度小于39,就会使用embstr编码的方式保存这个字符串值,这种编码方式主要用于保存短字符串,特点是sdshdr的数据区和对象的内存区是连着的。 【2】列表对象 列表对象的底层是使用压缩列表或者链表实现的,也就是redisobejct的prt指针指向一个压缩列表或者链表的结构。而如果选择链表形式,其实链表里面的每个元素又是一个字符串对象(即【1】),因此,字符串对象是唯一一个还会被使用在别的对象里面的对象。 【3】哈希对象 哈希对象底层使用压缩列表或者哈希表来实现。如果使用压缩列表的话,新进来的元素放到压缩列表的末尾 【4】集合对象 集合对象的底层数据结构可以是整数集合或者哈希表。 【5】有序集合对象 有序集合的底层可以是压缩列表或者跳表。 如果使用压缩列表,那么里面的元素会按照分值自动从小到大排序,分值小的会自动放在靠近表头的位置。只有当有序集合同时满足1:保存的元素数量小于128;2、所有成员长度都小于64字节;时才会使用压缩列表结构,否则会使用跳表结构。 总结: 1、每种redisobject的底层数据类型都不止一种,起码都提供了2种底层,这使得redis的使用更加灵活,因为可以根据数据量的大小,选择适合的底层数据结构。 2、因为C语言不会实现自动的内存回收,因此在redis里面利用引用计数法实现了一个内存自动回收,具体来说在每个redisObject里面有一个引用计数的变量,用来记录这个对象被程序使用的次数,一旦这个引用计数器的值变成0,占用的内存就会被释放。 3、引用计数器除了会使用在自动的内存回收中,还带有对象共享的作用。比如键A创建了一个整数值为100的字符串对象作为值,键B也创建了一个整数100的字符串对象作为值,那么实际上这两个键共享一个字符串对象,那么此时,引用计数器就会+1,这种共享对象机制,对于节约内存很有帮助:
查看原帖
点赞 评论
相关推荐
点赞 评论 收藏
转发
牛客热帖
正在热议
# 牛客帮帮团来啦!有问必答 #
611131次浏览 10432人参与
# 秋招开了,你想投哪些公司呢 #
112225次浏览 3213人参与
# 五一之后,实习真的很难找吗? #
9110次浏览 58人参与
# 我想象的工作vs实际工作 #
86617次浏览 1485人参与
# 浅聊一下我实习的辛苦费 #
77252次浏览 719人参与
# 简历中的项目经历要怎么写 #
413462次浏览 6931人参与
# 租房前辈的忠告 #
27896次浏览 1951人参与
# 你已经投递多少份简历了 #
279014次浏览 4248人参与
# 华为开奖那些事 #
684521次浏览 5916人参与
# 春招你拿到offer了吗 #
350850次浏览 5211人参与
# 我的成功项目解析 #
78615次浏览 2307人参与
# 机械人怎么评价今年的华为 #
63762次浏览 512人参与
# 我的上岸简历长这样 #
153854次浏览 3083人参与
# 华为工作体验 #
19607次浏览 158人参与
# 我发现了面试通关密码 #
315751次浏览 6074人参与
# 第一次面试 #
45582次浏览 713人参与
# 你的简历改到第几版了 #
290356次浏览 4422人参与
# 晒一晒我的offer #
3154602次浏览 52636人参与
# 毕业租房也有小确幸 #
24017次浏览 1387人参与
# 海康威视求职进展汇总 #
87389次浏览 1060人参与