Redis MongoDB

Redis/MongoDB都是很棒的NoSql数据库,与Mysql之类的关系型数据库有很大的区别,在某些情况下使用它们是更好的选择。

Redis设计与实现

在读这本书之前,我不了解Redis中字典、列表数据结构,不了解Redis如何进行持久化,不了解Redis如何内存回收,不了解Redis事务特点,不知道Redis都有哪些特性;读了这本书,这些就都知道了。_

其实还有一个挺有意思的点是,程序之前底层设计都是想通的,Redis中字典和Java中HashMap很相似,字典扩容机制和ConcurrentHashMap又有异曲同工之妙;Redis内存回收也是通过引用计数来实现的。

Redis数据结构

Redis 字符串 SDS

Java中String每次修改String对象,都会创建一个新的对象,String对象具有不变性,好处是线程安全,缺点是效率较低。

Redis中字符串SDS实现方法类似StringBuffer,每次会分配多一些空间,在操作字符串时不需要新建对象,同时由于Redis单线程特性不需要考虑并发问题。

SDS结构是:free(int),len(int),buf(Byte[])

free代表空闲字节位数;len代表存储字节位数。

Redis 链表

typedef struct listNode {
    struct listNode *prev;
    struct listNode *next;
    void *value;
}

Redis中列表键、发布和订阅、慢查询、监视器等都是由链表实现的。

Redis 字典

在实现上和Java中HashMap类似,数据结构是数组+链表,当set一个key - value时,先计算key hashcode值然后找到数组对应位置插入;如果该位置已经有值 - 键冲突,那么把数组原有位置的节点赋值给新插入节点的next指针,然后插入新节点到数组。

哈希表的扩展:和Java类似,哈希表有一个负载因子,当 哈希表保存节点数量 / 哈希表大小 > 负载因子 时进行扩容。

渐进式rehash:如果hash表非常大,那么如果一次性的rehash那么服务器计算量很大,一种折中的方法就是渐进式的操作,在每次对字典执行添加、删除、查找或者更新操作时,程序除了执行指定操作以外,还会顺带把老哈希表对应的键值移动到新哈希表中,最终在某个时间,全部移动完毕;这种设计思路和Java中ConcurrentHashMap是一致的。

Redis 跳跃表

一种有序数据结构,平均时间复杂度O(longN),实现Redis中有序集合。

至于跳跃表是如何跳跃的,请看下图。


图1

图2

Redis对象

字符串对象、列表对象、哈希对象、集合对象和有序集合对象。

有序集合同时使用跳跃表和字典来实现,使用跳跃表来降低范围型操作的耗时;使用字典表来降低查找设值的耗时。

Redis内存回收

通过引用计数来实现内存回收机制,和Java的垃圾回收机制思想是类似的。

Redis实现

Redis服务器默认会创建16个数据库;客户端默认连接的是0号数据库。

Redis键过期时间实现

当给某个键设置过期时间时,Redis会在一个字典中添加key - value,key是键;value是过期时间。当下次访问这个键时先判断键是否过期。

Redis过期键删除策略

  1. 定时删除:在设置过期时间的同时,创建一个定时器,让定时器在键的过期时间来临时,立即执行对键的删除操作。
  2. 惰性删除:放任键过期不管,但是每次从键空间获取键时,都检查取得的键是否过期,如果过期,就删除。
  3. 定期删除:每隔一段时间,程序对数据库进行一次检查,删除里面过期键。

定时删除任务缺点是对CPU不友好,在过期键较多时,会占用CPU相当多一部分时间,优点是对内存友好;惰性删除任务是对CPU友好,内存不友好;定期删除是对两种方式做了个折中。

Redis使用惰性删除和定期删除,在合理使用CPU时间和避免浪费内存空间之间取得平衡。

Redis RDB持久化

save 900 1 900秒内执行最少1次修改
save 300 10 300秒内执行最少10次修改
save 60 10000 60秒内执行最少10000次修改

满足条件后,执行BGSAVE操作,RDB文件是一个经过压缩的二进制文件,由多个部分组成。

AOF持久化

AOF持久化通过保存Redis服务器所执行的写命令来记录数据库状态的。

这样做优点是不会丢失数据,缺点是随着时间流逝,AOF文件会越来越大;所以就有了AOF重写功能,对AOF文件进行缩减。

Redis ServerCron函数

ServerCron函数让我想到了Linux下crontab,这个函数默认每隔100毫秒执行一次,其任务是更新服务器状态信息,处理服务器接收到的SIGTERM信号,管理客户端资源和数据库状态,检查并执行持久化操作等等。

发布与订阅

Redis把对某个主题订阅的客户端以链表形式保存。

struct redisServer {
    list *pubsub_patterns;  // 保存所有模式订阅关系
}
typedef struct pubsubPattern {
    redisClient *client; // 订阅模式的客户端
    robj *pattern; // 被订阅的模式
} pubsubPattern;

事务

当一个Redis客户端执行命令MULTI后,当执行SET等命令时,Redis服务器并不会立刻执行而是把命令放入一个队列中,等EXEC时统一执行命令。

事务ACID性质:原子性(Atomicity),一致性(Consistency),隔离性(Isolation),持久性(Durability)。

无论Redis服务器运行在哪种持久化模式下,事务执行中途发生停机都不会影响数据库一致性。

Lua脚本

Redis客户端可以使用Lua脚本,直接在服务端原子地执行多个Redis命令。

注意:Redis主从也会把Lua脚本复制到从库中。

Redis还能进行监控慢查询等其他功能,功能很强大。

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

推荐阅读更多精彩内容