首页 > 常见问题 > 正文

redis五种数据结构如何底层实现

醉折花枝作酒筹
发布: 2021-07-07 10:38:50
原创
5847人浏览过
实现方法:1、每种数据结构都有自己底层的内部编码实现,而且是多种实现,这样Redis会在合适的场景选择合适的内部编码;2、每种数据结构都有两种以上的内部编码实现;3、内部编码可以作为多种外部数据结构的内部实现。

redis五种数据结构如何底层实现

本教程操作环境: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长度

  • 若修改之后SDS长度 >= 1MB ,则扩充除了满足修改之后的长度外,额外多1MB空间。

惰性空间释放

为避免缩短字符串时候的内存重分配操作,SDS在数据减少时,并不立刻释放空间。

int

就是redis中存放的各种数字,包括故意加“”的

set game “111”

双向链表

双向链表如lpush, rpush, lpop, rpop

长这样:

在这里插入图片描述

分两部分:

  • “统筹部分”:橘黄色
    • head:指向具体双向链表的头

    • tail:指向具体双向链表的尾

    • len:双向链表的长度

  • “具体实施方”:蓝色
    • 有前驱pre和后继next

双向链表由 list 和 listNode 两个数据结构构成。

相关教程推荐:Redis教程

以上就是redis五种数据结构如何底层实现的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号