关注
五大对象分别是 【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,这种共享对象机制,对于节约内存很有帮助:
查看原帖
点赞 评论
相关推荐
查看16道真题和解析
点赞 评论 收藏
分享
11-12 17:05
广东工业大学 风电运维工程师 点赞 评论 收藏
分享
牛客热帖
- 1... 大四,双非二本,求指教,目前有一个offer但是一个月工资只有600要不要去啊3877
- 2... 【发帖有奖】新活动来啦,发帖评公司,最高可得100元京东卡~3837
- 3... 西安荣耀嵌入式oc3833
- 4... 大厂们也算是卷起来了。。3627
- 5... 3个月前的我未免对秋招过于乐观了3479
- 6... 挑战全网最孝手孝子3386
- 7... 求职银行的宝子们,最新的银行笔试题已公开,免费刷!3222
- 8... 开奖了,A到了398,000!3015
- 9... 好消息是早就oc了,坏消息是一直没开奖2990
- 10... 不要美化自己没选择的道路2937
正在热议
# 晒一晒我的offer #
9500467次浏览 103771人参与
# 你的秋招第一场笔试是哪家 #
37908次浏览 533人参与
# 签约/解约注意事项 #
299310次浏览 1877人参与
# OPPO求职进展汇总 #
541359次浏览 4437人参与
# 非技术er求职现状 #
20160次浏览 186人参与
# 我的实习求职记录 #
5936015次浏览 82675人参与
# 你想留在一线还是回老家? #
7423次浏览 155人参与
# AI了,我在打一种很新的工 #
18841次浏览 424人参与
# 大疆求职进展汇总 #
393503次浏览 2830人参与
# 许愿池 #
201939次浏览 2483人参与
# 通信硬件公司评价 #
80564次浏览 354人参与
# 设计人如何选offer #
37722次浏览 464人参与
# 工作给你带来了哪些职业病 #
8165次浏览 96人参与
# 人生第一个10万你是多久存到的? #
17414次浏览 207人参与
# 运营来爆料 #
9916次浏览 168人参与
# 安利/避雷我的岗位 #
369806次浏览 4504人参与
# 面试体验感最好的是哪家? #
74439次浏览 733人参与
# 设计人的面试记录 #
70892次浏览 926人参与
# 选了这个offer,你有没有后悔? #
372830次浏览 2945人参与
# 如何判断面试是否凉了 #
2464803次浏览 30654人参与