设为首页 收藏本站
查看: 565|回复: 0

[经验分享] Redis数据结构分析

[复制链接]

尚未签到

发表于 2016-12-18 09:49:34 | 显示全部楼层 |阅读模式
Redis有
内存数据库的赞誉,其支持一下几种数据结构:

1.      



String

2.      



Hashes

3.      



List

4.      



Set

本文从源代码角度来分析各种数据结构在
Redis
内部是如何存储和读取的。

在介绍各种数据结构之前,首先来介绍下
redisObject
这个
Struct

String

Hash

List

Set

Redis
内部都是以
redisObject
来存储的

 

/* A redis object, that is a type able to hold a string / list / set */
/* The actual Redis Object */
#define REDIS_LRU_CLOCK_MAX ((1<<21)-1) /* Max value of obj->lru */
#define REDIS_LRU_CLOCK_RESOLUTION 10 /* LRU clock resolution in seconds */
typedef struct redisObject {
unsigned type:4;
unsigned storage:2;     /* REDIS_VM_MEMORY or REDIS_VM_SWAPPING */
unsigned encoding:4;
unsigned lru:22;        /* lru time (relative to server.lruclock) */
int refcount;
void *ptr;
/* VM fields are only allocated if VM is active, otherwise the
* object allocation function will just allocate
* sizeof(redisObjct) minus sizeof(redisObjectVM), so using
* Redis without VM active will not have any overhead. */
} robj;
 
type:String, Hash,List,Set,Sorted set;

storage:
这个参数只是在VM
开启后才能用到,当VM
有很大的性能问题,基本不建议开启;


encoding:

编码方式: raw/int/ht/zmap/linkedlist/ziplist/intset




 
lru
:LRU
期限,Redis
默认的LRU
时间是1.5
年,所有基本不需要考虑key
被LRU
掉的问题

refcount:
被引用的次数,因为Redis
有shareObject
的概念,目前只支持共享StringObject
。Redis
的共享对象有两大类比:第一类:Redis server
的各种操作需要经常用到的各类对象,如:Redis Command
的分隔符 "\r\n",
用于Redis command
的reply
的"+OK\r\n"
或者"-ERR\r\n"
等对象,因为在Redis
的各种操作这类对象要被频繁使用,所以就在启动 Redis
的时候创建好,然后共用这些对象,减少时间成本和空间成本;第二,类的共享对象就是对应于数字的StringObject
,如:Set "olylakers1" 1234;
Set "olylakes2" 1234;
在Redis
内部,"olylakers1"
和"olylakers2"
这两个key
都指向由数字1234
转化的StringObject
。这
样在海量数据和特定存储内容下,可以节省大量的内存空间。可用通过REDIS_SHARED_INTEGERS
这个参数来指定Redis
启动的时候创建多 少个第二类共享对象,默认的参数是10000
,即创建的StrongObject
个取值范围是0-9999
之间。

Ptr
:对象数据;

 

redisObjects
都是存放在redisDb
里面的,Redis
默认的是创建16
个db


 

typedef struct redisDb {
dict *dict;                 /* The keyspace for this DB */
dict *expires;              /* Timeout of keys with a timeout set */
dict *blocking_keys;        /* Keys with clients waiting for data (BLPOP) */
dict *io_keys;              /* Keys with clients waiting for VM I/O */
dict *watched_keys;         /* WATCHED keys for MULTI/EXEC CAS */
int id;
} redisDb;
 
        redisDb
维护了各种dict
,所以说redis
内部基本的数据存储结构就是一个dict
,dict
就是一个字典的数据结构,比较特殊的就是每个dict
含有两个table
,即两个dictht
,这是为了实现增量rehashe
准备的,当redis
的dict
在进行rehashe
的时候,新的数据插将被添加到dictht ht[1]
当中,反之则添加到ht[0]


 

typedef struct dict {
dictType *type;
void *privdata;
dictht ht[2];
int rehashidx; /* rehashing not in progress if rehashidx == -1 */
int iterators; /* number of iterators currently running */
} dict;
typedef struct dictht {
dictEntry **table;
unsigned long size;
unsigned long sizemask;
unsigned long used;
} dictht;
 
Redis
在响应各种命令的时候,把接收到的命令参数(key
和value
等)都转化成type=
REDIS_STRING
的redisObject
,最终执行命令将key
和value
存储到redisDb
的dict
的时候,存储的形式和内容是不相同的:在dict
里面,key
存储的是redisObject
里面的prt
所指向的数据,而value
存储的则是和命令对应的redisObject
,如执行list
的命令lpush listname content
,redisDb
里面,存放的一条记录key
为内容listname
的字符串,而value
(此value
不是命令对应的value
)存储的则是一个redisObject
(type= REDIS_ENCODING_ZIPLIST
, prt=ziplist
),然后把content
对应的内容add
到ziplist
上。

最后通过一张图来展示Redis内部DB的实现和其支持的各种data types在redis DB内的存储方式
Redis DB & data types

 
 

 

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-315860-1-1.html 上篇帖子: redis 学习笔记2--List 下篇帖子: redis(二)主从复制
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表