【你问我答】详细说下redis五大对象

问题描述:

详细说下redis五大对象。

回答有奖:

选取一位认真回答问题的牛友,赠送200牛币!
▶回答尽量有自己的思考,不要单纯的只是复制粘贴定理定义,或者他人blog哦~

你问我答问题汇总:点击进入
关注你问我答栏目:点击关注

你问我答 - 答问题,成大佬,拿牛币!
你问我答是牛客新栏目,每周1期几个面试中真实遇到的问题,
牛友在问题贴下留下自己的知识,经验与见解,
帮助更多牛友了解更多技术相关知识!
#悬赏##Java工程师##面试题目#
全部评论
写不下啦,看图吧!
点赞 回复 分享
发布于 2020-11-24 12:32
五大对象分别是 【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,这种共享对象机制,对于节约内存很有帮助:
点赞 回复 分享
发布于 2020-11-24 14:37
五大对象分别是 【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,这种共享对象机制,对于节约内存很有帮助:
点赞 回复 分享
发布于 2020-11-24 15:18
之前整理的笔记,水一水
点赞 回复 分享
发布于 2020-11-24 16:26

相关推荐

我见java多妩媚:大外包
点赞 评论 收藏
分享
头像
11-10 15:58
东北大学 Java
ros275229:我还没收到,但是距离上一次面试快一个月了
点赞 评论 收藏
分享
点赞 5 评论
分享
牛客网
牛客企业服务