关注
五大对象分别是 【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,这种共享对象机制,对于节约内存很有帮助:
查看原帖
点赞 评论
相关推荐
点赞 评论 收藏
分享
点赞 评论 收藏
分享
程序员牛肉:不用,你低估你学历的含金量了。
不用学微服务,重心放到juc,redis和mysql的八股上。然后准备两个简历项目。直接准备明年暑期就好。南京大学都算是国内比较顶尖的985了。明年暑期零实习也能被约面。不用太焦虑 点赞 评论 收藏
分享
牛客热帖
更多
正在热议
更多
# 你最近因为什么迷茫? #
13764次浏览 204人参与
# AI coding的好用工具分享 #
4282次浏览 107人参与
# 上班以后,你还有哪些坚持的爱好? #
2031次浏览 55人参与
# 实习怎么做才有更好的产出 #
2886次浏览 83人参与
# 你都在哪些场所面过试? #
5156次浏览 85人参与
# 实习生工资多少才算正常? #
4418次浏览 91人参与
# 实习心态崩了 #
100714次浏览 516人参与
# 你给AI提过哪些离谱的需求? #
2019次浏览 74人参与
# 找工作以来,你最看不惯__ #
3378次浏览 77人参与
# 领导做过最不靠谱的事 #
5376次浏览 92人参与
# 哪些公司开春招了? #
2312次浏览 34人参与
# 你最希望上岸的公司是? #
181643次浏览 800人参与
# 华为保温 #
169910次浏览 643人参与
# 你觉得第一学历对求职有影响吗? #
222422次浏览 1230人参与
# 刚入职就____,这样正常吗? #
124660次浏览 665人参与
# 秋招有哪些公司要求提前实习 #
103086次浏览 547人参与
# 非技术岗投递进展 #
166729次浏览 1317人参与
# 新年的第一句祝福 #
53695次浏览 389人参与
# 华子oc时间线 #
1408650次浏览 6994人参与
# 当发现同事想辞职 #
13674次浏览 47人参与

