本篇内容主要讲解“redis五种数据结构的底层实现方法”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“redis五种数据结构的底层实现方法”吧!
实现方法:1、每种数据结构都有自己底层的内部编码实现,而且是多种实现,这样Redis会在合适的场景选择合适的内部编码;2、每种数据结构都有两种以上的内部编码实现;3、内部编码可以作为多种外部数据结构的内部实现。
本教程操作环境:windows7系统、Redis5.0.10版、DELL G3电脑。
Redis有五种基本数据结构:字符串、hash、set、zset、list。下面解释下载Redis 3.0.6版本中底层是怎样实现他们的。
总结一下
(1)每种数据结构都有自己底层的内部编码实现,而且是多种实现,这样Redis会在合适的场景选择合适的内部编码。
(2)可以看到每种数据结构都有两种以上的内部编码实现,例如string数据结构就包含了raw、int和embstr三种内部编码。
(3)同时,有些内部编码可以作为多种外部数据结构的内部实现,例如ziplist就是hash、list和zset共有的内部编码。
动态字符串SDS
SDS是“simple dynamic string”的缩写。Redis中所有场景出现的字符串,基本都是有SDS来实现的:
所有非数字的key, 如:set msg “hello” 中的key msg
字符串数据类型的值,如:set msg “hello” 中的value “hello”
非字符串数据类型中的“字符串值”,如:rpush fruits “apple” “banana"中的"apple” “banana”
SDS长这样:
free:还剩多少空间
len:字符串长度
buf:存放的字符数组
空间预分配
为减少修改字符串代理的内存重分配次数,SDS采用了“一次管够“的策略:
若修改之后SDS长度 < 1MB,则多分配现有len长度的空间
若修改之后SDS长度 >= 1MB ,则扩充除了满足修改之后的长度外,额外多1MB空间。
惰性空间释放
为避免缩短字符串时候的内存重分配操作,SDS在数据减少时,并不立刻释放空间。
int
就是redis中存放的各种数字,包括故意加“”的
set game “111”
双向链表
双向链表如lpush, rpush, lpop, rpop
长这样:
分两部分:
“统筹部分”:橘黄色
head:指向具体双向链表的头
tail:指向具体双向链表的尾
len:双向链表的长度
“具体实施方”:蓝色
有前驱pre和后继next
双向链表由 list 和 listNode 两个数据结构构成。
到此,相信大家对“redis五种数据结构的底层实现方法”有了更深的了解,不妨来实际操作一番吧!这里是亿速云网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。