redis存储结构
来源:互联网 发布:java代码书写规范 编辑:程序博客网 时间:2024/06/07 01:42
Base 2.8.7
Redis是一个包含了很多Key-Value对的大字典,这个字典支持的Value非常丰富,可以为字符串、哈希表、列表、集合和有序集,基于这些类型丰富的value,扩展出了功能强大的操作,例如hmset、lpush、sadd等
redisObject是真正存储redis各种类型的结构,其内容如下:
其中type即redis支持的逻辑类型,包括:
enconding为物理存储方式,一种逻辑类型可以使用不同的存储方式,包括:
字符串类型即前文中看到的REDIS_STRING,其物理实现(enconding)可以为 REDIS_ENCODING_INT或REDIS_ENCODING_RAW
REDIS_ENCODING_INT保存为long型,即redis会尝试将一个字符串转化为Long,可以转换的话,即保存为REDIS_ENCODING_INT
否则,Redis会将REDIS_STRING保存为字符串类型,即REDIS_ENCODING_RAW
字符串类型在redis中用sds封装,主要为了解决长度计算和追加效率的问题,其定义如下:
有时间的同学可以详细看下Sds.h和Sds.c两个文件,还是很有意思的。
REDIS_ENCODING_HT即前文提到的字典的实现
REDIS_ENCODING_ZIPLIST即ZIPLIST,是一种双端列表,且通过特殊的格式定义,压缩内存适用,以时间换空间。ZIPLIST适合小数据量的读场景,不适合大数据量的多写/删除场景
Hash表默认的编码格式为REDIS_ENCODING_ZIPLIST,在收到来自用户的插入数据的命令时:
1,调用hashTypeTryConversion函数检查键/值的长度大于 配置的hash_max_ziplist_value(默认64)
2,调用hashTypeSet判断节点数量大于 配置的hash_max_ziplist_entries (默认512)
REDIS_ENCODING_ZIPLIST同上
REDIS_ENCODING_LINKEDLIST是比较正统双端链接表的实现:
列表的默认编码格式为REDIS_ENCODING_ZIPLIST,当满足以下条件时,编码格式转换为REDIS_ENCODING_LINKEDLIST
1,元素大小大于list-max-ziplist-value(默认64)
2,元素个数大于 配置的list-max-ziplist-entries(默认512)
集合的元素类型和数量决定了encoding方式,默认采用REDIS_ENCODING_INTSET ,当满足以下条件时,转换为REDIS_ENCODING_HT:
1. 元素类型不是整数
2. 元素个数超过配置的“set-max-intset-entries”(默认512)
REDIS_ENCODING_INTSET是一个有序数组,使用的数据结构如下:
Redis会根据整数大小选择最适合的类型,当发生变更时,进行调整
字典中使用member作为key,score作为value,从而保证在O(1)时间对member的查找
跳跃表基于score做排序,从而保证在 O(logN) 时间内完成通过score对memer的查询
有续集默认也是采用REDIS_ENCODING_ZIPLIST的实现,当满足以下条件时,转换为REDIS_ENCODING_SKIPLIST
1. 数据元素个数超过配置的zset_max_ziplist_entries 的值(默认值为 128 )
2. 新添加元素的 member 的长度大于配置的 zset_max_ziplist_value 的值(默认值为 64 )
Redis是一个包含了很多Key-Value对的大字典,这个字典支持的Value非常丰富,可以为字符串、哈希表、列表、集合和有序集,基于这些类型丰富的value,扩展出了功能强大的操作,例如hmset、lpush、sadd等
字典
字典是Redis最基础的数据结构,一个字典即一个DB,Redis支持多DBRedis字典采用Hash表实现,针对碰撞问题,其采用的方法为“链地址法”,即将多个哈希值相同的节点串连在一起, 从而解决冲突问题。
“链地址法”的问题在于当碰撞剧烈时,性能退化严重,例如:当有n个数据,m个槽位,如果m=1,则整个Hash表退化为链表,查询复杂度O(n)
为了避免Hash碰撞攻击,redis随机化了Hash表种子
Redis的方案是“双buffer”,正常流程使用一个buffer,当发现碰撞剧烈(判断依据为当前槽位数和Key数的对比),分配一个更大的buffer,然后逐步将数据从老的buffer迁移到新的buffer。
redisObject是真正存储redis各种类型的结构,其内容如下:
其中type即redis支持的逻辑类型,包括:
enconding为物理存储方式,一种逻辑类型可以使用不同的存储方式,包括:
字符串
Redis的所有的key都采用字符串保存,另外,Redis也支持字符串类型的value。字符串类型即前文中看到的REDIS_STRING,其物理实现(enconding)可以为 REDIS_ENCODING_INT或REDIS_ENCODING_RAW
REDIS_ENCODING_INT保存为long型,即redis会尝试将一个字符串转化为Long,可以转换的话,即保存为REDIS_ENCODING_INT
否则,Redis会将REDIS_STRING保存为字符串类型,即REDIS_ENCODING_RAW
字符串类型在redis中用sds封装,主要为了解决长度计算和追加效率的问题,其定义如下:
有时间的同学可以详细看下Sds.h和Sds.c两个文件,还是很有意思的。
Hash表
Redis支持Value为Hash表,其逻辑类型为REDIS_HASH,REDIS_HASH可以有两种encoding方式: REDIS_ENCODING_ZIPLIST 和 REDIS_ENCODING_HTREDIS_ENCODING_HT即前文提到的字典的实现
REDIS_ENCODING_ZIPLIST即ZIPLIST,是一种双端列表,且通过特殊的格式定义,压缩内存适用,以时间换空间。ZIPLIST适合小数据量的读场景,不适合大数据量的多写/删除场景
Hash表默认的编码格式为REDIS_ENCODING_ZIPLIST,在收到来自用户的插入数据的命令时:
1,调用hashTypeTryConversion函数检查键/值的长度大于 配置的hash_max_ziplist_value(默认64)
2,调用hashTypeSet判断节点数量大于 配置的hash_max_ziplist_entries (默认512)
以上任意条件满足则将Hash表的数据结构从REDIS_ENCODING_ZIPLIST转为REDIS_ENCODING_HT
列表
Redis支持Value为一个列表,其逻辑类型为REDIS_SET,REDIS_SET有两种encoding方式,REDIS_ENCODING_ZIPLIST和REDIS_ENCODING_LINKEDLISTREDIS_ENCODING_ZIPLIST同上
REDIS_ENCODING_LINKEDLIST是比较正统双端链接表的实现:
列表的默认编码格式为REDIS_ENCODING_ZIPLIST,当满足以下条件时,编码格式转换为REDIS_ENCODING_LINKEDLIST
1,元素大小大于list-max-ziplist-value(默认64)
2,元素个数大于 配置的list-max-ziplist-entries(默认512)
集合
Redis支持Value为集合,其逻辑类型为REDIS_SET,REDIS_SET有两种encoding方式: REDIS_ENCODING_INTSET 和 REDIS_ENCODING_HT(同上)集合的元素类型和数量决定了encoding方式,默认采用REDIS_ENCODING_INTSET ,当满足以下条件时,转换为REDIS_ENCODING_HT:
1. 元素类型不是整数
2. 元素个数超过配置的“set-max-intset-entries”(默认512)
REDIS_ENCODING_INTSET是一个有序数组,使用的数据结构如下:
Redis会根据整数大小选择最适合的类型,当发生变更时,进行调整
有序集
Redis支持Value为有序集合,其逻辑类型为REDIS_ZSET,REDIS_ZSET有两种encoding方式: REDIS_ENCODING_ZIPLIST(同上)和 REDIS_ENCODING_SKIPLIST
REDIS_ENCODING_SKIPLIST使用的数据结构如下,其同事:
字典中使用member作为key,score作为value,从而保证在O(1)时间对member的查找
跳跃表基于score做排序,从而保证在 O(logN) 时间内完成通过score对memer的查询
有续集默认也是采用REDIS_ENCODING_ZIPLIST的实现,当满足以下条件时,转换为REDIS_ENCODING_SKIPLIST
1. 数据元素个数超过配置的zset_max_ziplist_entries 的值(默认值为 128 )
2. 新添加元素的 member 的长度大于配置的 zset_max_ziplist_value 的值(默认值为 64 )
总结
针对同一种数据类型,Redis会根据元素类型/大小/个数采用不同的编码方式,不同的编码方式在内存使用效率/查询效率上差距巨大,在遇到内存问题时,可以尝试下修改相关参数:阅读全文
1 0
- Redis 内存存储结构
- Redis之存储结构
- Redis 内存存储结构
- redis的存储结构
- Redis存储结构
- redis存储结构
- Redis内存存储结构分析
- Redis内存存储结构分析
- Redis内存存储结构分析
- Redis内存存储结构分析
- Redis内存存储结构分析 .
- Redis内存存储结构分析
- 1 Redis 内存存储结构
- Redis内存存储结构分析
- Redis内存存储结构分析
- Redis内存存储结构分析
- Redis内存存储结构分析
- Redis内存存储结构分析
- 13、react之 用yeoman搭建开发环境
- mysql5.6 varchar存中文笔记
- ECharts3基础教程(二)Option简单配置篇
- Saltstack-01基本命令
- JDBC连接MSSQL2014
- redis存储结构
- 前端知识点
- C++ SDL学习之路 2nd —— 教程···竟然···全是英文!
- 搭建 Jupyter Notebook 服务器
- 看书吧
- Java EE应用分层模型
- 日常总结
- Android-Intent(意图)
- Android Context简单用法