redis内存模型
2019-03-19 17:07:36 0 举报
AI智能生成
redis内存模型
作者其他创作
大纲/内容
前言
五种对象类型
字符串
哈希
列表
集合
有序集合
了解内存模型作用
1.估算Redis内存使用量
2.优化内存占用
选择合适的数据类型和编码
3.分析解决问题
阻塞、内存占用等
内存统计
used_memory
Redis分配器分配的内存总量(byte)
包括使用的虚拟内存(swap)
从Redis角度得到的量
used_memory_rss
Redis分配器分配的内存(byte)
Redis进程占据操作系统的内存(byte)
与top及ps看到的值一致
进程运行本身需要的内存
内存碎片
从操作系统角度得到的量
mem_fragmentation_ratio
内存碎片比率
used_memory_rss/used_memory
一般大于1
值越大,碎片比例越大
若小于1
Redis使用了虚拟内存
虚拟内存的媒介是磁盘,速度慢
及时排查,若内存不足,及时处理,增加节点、增加内存、优化应用等
1.03左右为健康
未存入数据前,因进程本身运行内存所以ratio会很大
mem_allocator
Redis使用的内存分配器
编译时指定
可以是libc、jemalloc、tcmalloc
默认jemalloc
内存划分
数据
占用的内存会统计在used_memory中
键值对存数数据
值(对像)5种类型:字符串、哈希、列表、集合、有序集合
Redis内部每种数据类型可能有2中或更多的内部编码实现
存储对象时,会对对象进行各种包装:redisObject、SDS等
进程本身运行需要的内存
如代码、常量池等
大约几兆
生产中与数据占用的内存相比可以忽略
不是由jemalloc分配,所以不会统计在used_memory中
缓冲内存
包括:
客户端缓冲区
存储客户端连接的输入输出缓冲
复制积压缓冲区
用于部分复制功能
AOF缓冲区 等
用于进行AOF重写时,保存最近的写入命令
由jemalloc分配,会统计在used_memory中
内存碎片
Redis在分配、回收物理内存过程中产生
如果对数据的更改频繁,数据之间大小相差很大
导致redis释放的空间在物理内存中并没有释放
redis又无法有效利用,就行成了内存碎片
不会统计在used_memory中
产生与对数据进行的操作、数据的特点等有关
与使用的内存分配器有关
内存分配器设计合理,可尽可能减少内存碎片的产生
jemalloc在控制内存碎片方面做的很好
内存碎片很大时,可通过安全重启减少内存碎片
重启之后,Redis重新从备份文件中读取数据
在内存中进行重排
为每个数据重新选择合适的内存单元,减少内存碎片
数据存储的细节
概述
涉及:内存分配器(如jemalloc)、简单动态字符串(SDS)、5种对象类型及内部编码、redisObject
关系:
dictEntry
每个键值对都会有一个
存储指向Key和Value的指针
next指向下一个dictEntry,与本K-V无关
Key
“hello”并不是直接以字符串存储
而是存储在SDS结构中
redisObject
“world”既不是直接以字符串存储
也不是直接存储在SDS中
而是存储在redisObject中
不论Value是5中类型的哪一种
type字段指明Value对象的类型
ptr字段指向对象所在地址
虽然经过了redisObject包装,仍然需要通过SDS存储
jemalloc
无论是DictEntry对象,还是redisObject、SDS对象,都需要内存分配器分配内存存储
如DictEntry,有3个指针组成,64位机器下占24个字节,jemalloc会给分配32字节内存单元
jemalloc
redisObject
type
encoding
lru
refcount
refcount与共享对象
共享对象的具体实现
ptr
总结
SDS
SDS结构
SDS与C字符串的比较
SDS与C字符串的应用
Redis的对象类型与内部编码
字符串
概述
内部编码
编码转换
列表
概况
内部编码
编码转换
哈希
概况
内部编码
编码转换
集合
概况
内部编码
编码转换
有序集合
概况
内部编码
编码转换
应用举例
估算Redis内存使用量
优化内存占用
利用jemalloc特性进行优化
使用整型/长整型
共享对象
避免过度设计
关注内存碎片率
0 条评论
下一页