关注
五大对象分别是 【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,这种共享对象机制,对于节约内存很有帮助:
查看原帖
点赞 评论
相关推荐
01-22 00:31
南京信息工程大学 Java 点赞 评论 收藏
分享
01-14 17:06
哈尔滨工程大学 Java 点赞 评论 收藏
分享
牛客热帖
更多
正在热议
更多
# 在大厂上班是一种什么样的体验 #
8193次浏览 110人参与
# 为了减少AI幻觉,你注入过哪些设定? #
3222次浏览 119人参与
# 程序员找工作至少要刷多少题? #
14338次浏览 212人参与
# AI Coding的使用心得 #
3840次浏览 92人参与
# 我现在比当时_,你想录用我吗 #
6947次浏览 96人参与
# 刚入职的你踩过哪些坑 #
5816次浏览 117人参与
# 论秋招对个人心气的改变 #
8054次浏览 137人参与
# 机械人避雷的岗位/公司 #
42540次浏览 284人参与
# 牛客AI体验站 #
5406次浏览 157人参与
# 一张图晒一下你的AI员工 #
3965次浏览 97人参与
# 关于春招/暑期实习,你想知道哪些信息? #
6118次浏览 107人参与
# 程序员能干到多少岁? #
7416次浏览 106人参与
# 晒晒你司的新年福利 #
6107次浏览 90人参与
# 12306一秒售罄,你抢到回家的票了吗? #
1471次浏览 42人参与
# 学历对求职的影响 #
598655次浏览 4019人参与
# 找工作的破防时刻 #
253484次浏览 1962人参与
# 应届生进小公司有什么影响吗 #
117901次浏览 1158人参与
# 你投了多少份简历了? #
424503次浏览 4003人参与
# 实习,不懂就问 #
167380次浏览 1483人参与
# 黄金这个事上,你学到了什么 #
1502次浏览 42人参与

OPPO公司福利 1103人发布