redis数据库解析

数据库

本篇文章是redis系列中的第二大部分的开始,这一部分为数据库的实现,主要讲单节点的数据库知识。下边附上第一部分基础知识总结篇的链接,有需要的童鞋,欢迎查看。

redis--对象

文章主要内容如下:
目录结构
1、数据库结构

redis服务器将所有数据库都保存在服务器状态redis.h/redisServer结构的db数组中,db数组中每一个项都是一个redis.h/redisDb结构。

redisServer结构如下:

struct redisServer{
    //一个数组,保存着服务器中的所有数据库
    redisDb *db;
    //服务器的数据库数量
    int dbnum;
};

每个redis客户端都有自己的目标数据库,每当客户端执行命令时,目标数据库就会成为这些命令的操作对象。默认情况下为0号数据库,可以通过SELECT命令切换目标数据库。

    typedef struct redisClient{
        //记录客户端当前正在使用的数据库
        redisDb *db;
    }redisClient;

结构图如下:


数据库结构
2、键空间

Redis是一个键值对数据库服务器,服务器中的每个数据库都由一个redis.h/redisDb结构表示,其中redisDb结构的dict字典保存了数据库中的所有键值对,我们称这个字典为键空间

typedef struct redisDb{
    //数据库键空间,保存着数据库中的所有键值对
    dict *dict;
}redisDb;

键空间和用户所见的数据库是直接对应的:

这里我们新建一个字符串对象message,列表对象alphabet和哈希集合book,结构如下:

键空间

所有针对数据库的操作,都是通过对键空间字典进行操作实现的。清空整个数据库的FLUSHDB命令,就是通过删除键空间中的所有键值对来实现的。

2.1、读写键空间的附加操作

当redis进行读写操作是,会对键空间执行以下维护操作。

  1. 在读取一个键之后,服务器会根据键是否存在更新服务器的键空间命中次数。
  2. 在读取一个键后,服务器会更新键的LRU时间。
  3. 如果服务器在读取一个键时,发现该键已过期,那么服务器会先删除这个过期键,再执行其他操作。
  4. 如果客户端使用了WATCH命令监视了某个键,那么服务器对被监视的键进行修改之后,会将这个键标记为dity,让事务程序注意。
  5. 服务器每次修改一个键之后,都会对dity键计数器的值增加1,这个计数器会触发服务器的持久化以及复制操作。
  6. 如果开启了数据库通知功能,那么再对键进行修改之后,服务器将按照配置发送响应的数据库通知。
3、生存时间

通过EXPIRE命令或者PEXPIRE命令,客户端可以以秒或者毫秒精度为数据库中的键设置生存时间,经过指定的秒数或者毫秒数之后,服务器会自动删除生存时间为0的键。类似的EXPIREAT命令或者PEXPIREAT命令,设置过期时间;过期时间是UNIX时间戳,当键的过期时间来临时,服务器会自动删除这个键。

TTL命令和PTTL命令接受一个带有生存时间或者过期时间的键,返回这个键剩余生存时间。

EXPIRE命令,PEXPIRE命令和EXPIREAT命令,都是通过转换为PEXPIREAT命令来执行的。

graph TD
A[EXPIRE] -->|转换| B(PEXPIRE)
B -->|转换| D[PEXPIREAT]
E[EXPIREAT]
E -->|转换| D[PEXPIREAT]
3.1、过期字典

redisDb结构的expires字典保存了数据库中所有键的过期时间。

  • [ ] 过期字典的键是一个指针,这个指针指向键空间中的某个键对象。
  • [ ] 过期字典的值是一个long long类型的整数,这个整数保存了键所指向的数据库的过期时间。
过期字典
4、过期策略
4.1、现有策略
策略 实现 优点 缺点
定时 设置键的同时,设置定时器,到期立即删除 内存友好 cpu不友好
惰性 每次获取时,删除已过期的键值对 内存不友好 cpu友好
定期 每隔一段时间,对数据库检查一次,删除里边的过期键 折中 折中

定期策略的难点是确定删除操作执行的时长和频率,设置不好会退化成定时或者惰性策略。

4.2、redis的策略

redis使用惰性和定期两种策略。通过配合使用,在合理的利用cpu和避免内存浪费之间取得平衡。

5、AOF、RDB和复制
5.1、生成RDB

在执行SAVE命令或者BGSAVE命令创建一个新的RDB文件时,程序会对数据库中的键进行检查,已经过期的键不会被保存到新创建的RDB文件中。

5.2、载入RDB

在启动redis服务器时,如果服务器开启了RDB功能,那么服务器将对RDB文件进行载入:

  • [ ] 如果服务器以主服务器模式运行,那么再载入RDB文件时,程序会对文件中保存的键进行检查,未过期的键会被载入到数据库中,而过期的键会被忽略。
  • [ ] 如果服务器以从服务器模式运行,那么再载入RDB文件时,文件中保存的所有键,不论是否过期,都会被载入到数据库中。因为主从服务器在数据同步时,从服务器数据库会被清空,所以不会造成影响。
5.3、AOF文件写入

当服务器以AOF模式持久化运行时,如果数据库中的某个键已经过期,但它还没有被删除,那么AOF问价不会因为这个过期键而产生任何影响。当过期键被删除后,程序向AOF文件追加一条DEL命令,来显式的记录该键已被删除。
主要步骤如下:

  1. 从数据库中删除键
  2. 追加一条DEL
  3. 向执行GET命令客户端返回空
5.4、AOF重写

和生成RDB类似,已过期的键不会被保存到重写后的AOF文件。

5.5、复制

当服务器运行在复制模式下时,从服务器的过期键删除动作由主服务器控制。

  • [ ] 主服务器在删除一个过期之后,会显式地向所有从服务器发送一个DEL命令,告知从服务器删除这个过期键。
  • [ ] 从服务器在执行客户端发送的读命令时,即使碰到过期键也不会将过期键删除,而是继续像处理未过期键一样来处理过期键。
  • [ ] 从服务器只有在接到主服务器发来的DEL命令之后,才会删除过期键。
6、数据库通知

在2.8版本之后,客户端可以通过订阅给定的频道或者模式,来获知数据库中键的变化。当redis命令对数据库进行修改后,服务器会根据配置向客户端发送数据库通知。服务器配置的notify-keyspace-events选项决定了服务器所发送通知的类型。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,099评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,828评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,540评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,848评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,971评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,132评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,193评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,934评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,376评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,687评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,846评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,537评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,175评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,887评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,134评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,674评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,741评论 2 351

推荐阅读更多精彩内容