前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Redis底层支撑数据结构简介(二)

Redis底层支撑数据结构简介(二)

作者头像
一个架构师
发布2022-06-20 19:49:01
2890
发布2022-06-20 19:49:01
举报
文章被收录于专栏:从码农的全世界路过

我们在前一章节中介绍了Redis底层支撑的8种数据结构,这节我们看下这些数据结构是如何对应字符串(string),哈希(hash),列表(list),集合(set),有序集合(sorted set)这些数据结构的.

注:以下数据结构是基于redis V4.0版本.

稍稍回忆下Redis底层提供的8种数据结构:

源码参考:object.c

代码语言:javascript
复制
char *strencoding(int encoding) {
switch(encoding) {
// 小于等于44字节时sds数据结构
case OBJ_ENCODING_RAW: return "raw";
//64 位有符号整数类型
case OBJ_ENCODING_INT: return "int";
// 哈希表
case OBJ_ENCODING_HT: return "hashtable";
// 快表
case OBJ_ENCODING_QUICKLIST: return "quicklist";
// 压缩列表
case OBJ_ENCODING_ZIPLIST: return "ziplist";
// 存储无重复整数类型的数据结构
case OBJ_ENCODING_INTSET: return "intset";
// 跳跃表
case OBJ_ENCODING_SKIPLIST: return "skiplist";
// 大于44字节时sds数据结构
case OBJ_ENCODING_EMBSTR: return "embstr";
default: return "unknown";
    }
}

一. 数据结构的对应关系

可以使用如下命令查看指定Key的底层实现数据结构

object encoding key

1. 整数--int

代码语言:javascript
复制
127.0.0.1:6379> set key_int 1
ok
127.0.0.1:6379> object encoding key_int
"int"

2. 字符串--embstr,raw

代码语言:javascript
复制
127.0.0.1:6379> set key_string abc
ok
127.0.0.1:6379> object encoding key_string
"embstr"

value值多于44字节时

代码语言:javascript
复制
127.0.0.1:6379> set key_string abc123456789012345678901234567890123456789012345678901234567890
ok
127.0.0.1:6379> object encoding key_string
"raw"

3. 集合--intset,hashtable

代码语言:javascript
复制
127.0.0.1:6379> sadd key_set 1 2 3 4
(integer) 4
127.0.0.1:6379> object encoding key_set
"intset"

当集合无法满足intset的条件时,redis会使用hashtable作为存储结构

代码语言:javascript
复制
127.0.0.1:6379> sadd key_set a
(integer) 1
127.0.0.1:6379> object encoding key_set
"hashtable"

4. 列表--quicklist

代码语言:javascript
复制
127.0.0.1:6379> lpush key_list 1 2 3
(integer) 3
127.0.0.1:6379> object encoding key_list
"quicklist"

5.哈希--ziplist,hashtable

代码语言:javascript
复制
127.0.0.1:6379> hset key_hash a va
(integer) 1
127.0.0.1:6379> hset key_hash b vb
(integer) 1
127.0.0.1:6379> object encoding key_hash
"ziplist"
127.0.0.1:6379> hset key_hash c abcd1234567890123456789012345678901234567890123456789012345678901
(integer) 1
127.0.0.1:6379> object encoding key_hash
"hashtable"

6. 有序集合--ziplist,skiplist

代码语言:javascript
复制
127.0.0.1:6379> zadd key_zset 1 a 2 b 3 c 4 d
(integer) 4
127.0.0.1:6379> object encoding key_zset
"ziplist"
 
127.0.0.1:6379> zadd key_zset 5 abcd1234567890123456789012345678901234567890123456789012345678901
(integer) 1
127.0.0.1:6379> object encoding key_zset
"skiplist"

二. 权衡取舍

redis内部提供了诸多数据结构,使数据更加节省空间,但节省是有代价的,因为更改大小和检索条目需要更多时间.因此,redis服务器上的延迟增加了,cpu使用率也可能增加了.

为达到两者的平衡,redis.conf中也提供了相关配置项.

1. hash-max-ziplist-entries 512

表示当hash项(field,value)数>512即ziplist项>1024的时候转为dict

2. hash-max-ziplist-value 64

表示当hash中的value长度超过64的时候转为dict.

3. set-max-intset-entries 512

表示当value数量超过512的时候转为hashtable

4. zset-max-ziplist-entries 128

表示当value数量超过128的时候转为skiplist.

5. zset-max-ziplist-value 64

表示当value长度超过64的时候转为skiplist.

以上是对内部数据结构的简介,后面还会针对各种数据结构做深入分析.

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-04-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 从码农的全世界路过 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 Redis®
腾讯云数据库 Redis®(TencentDB for Redis®)是腾讯云打造的兼容 Redis 协议的缓存和存储服务。丰富的数据结构能帮助您完成不同类型的业务场景开发。支持主从热备,提供自动容灾切换、数据备份、故障迁移、实例监控、在线扩容、数据回档等全套的数据库服务。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档