关注
五大对象分别是
【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,这种共享对象机制,对于节约内存很有帮助:
查看原帖
点赞 评论
相关推荐
点赞 评论 收藏
分享
迷茫的大四🐶:base不满足是为什么
,实习薪资开高一点也行吧
点赞 评论 收藏
分享
牛客热帖
更多
正在热议
更多
# 在大厂上班是一种什么样的体验 #
6340次浏览 84人参与
# 机械人避雷的岗位/公司 #
41680次浏览 275人参与
# 程序员找工作至少要刷多少题? #
11751次浏览 184人参与
# 过年最难忘的一件事 #
23022次浏览 174人参与
# 我现在比当时_,你想录用我吗 #
5075次浏览 79人参与
# 12306一秒售罄,你抢到回家的票了吗? #
997次浏览 34人参与
# 为了减少AI幻觉,你注入过哪些设定? #
2414次浏览 90人参与
# 牛客AI体验站 #
4376次浏览 131人参与
# AI Coding的使用心得 #
3251次浏览 88人参与
# 找工作的破防时刻 #
252875次浏览 1960人参与
# 刚入职的你踩过哪些坑 #
5116次浏览 107人参与
# 一张图晒一下你的AI员工 #
3526次浏览 81人参与
# 你最满意的offer薪资是哪家公司? #
69428次浏览 348人参与
# 论秋招对个人心气的改变 #
6839次浏览 116人参与
# 关于春招/暑期实习,你想知道哪些信息? #
5086次浏览 90人参与
# 机械人你知道哪些单休企业 #
85292次浏览 428人参与
# 程序员能干到多少岁? #
6552次浏览 99人参与
# 黄金这个事上,你学到了什么 #
1184次浏览 35人参与
# 晒晒你司的新年福利 #
5122次浏览 80人参与
# 大家实习每天都在干啥 #
119219次浏览 627人参与
