Redis持久化演进史与奇思妙想
目前 Redis 主要支持两种持久化的方式:RDB 和 AOF 。这两者在 Redis 的演进过程中也发生了很多有意思的变化。RDB 的数据格式也已经进行了十次版本迭代,AOF 从最初的 Rewrite 到 Redis 7.0.0 的 Multi-Part-AOF 也发生了很多的变化,这里将对每个版本进行详细的剖析,学习 Redis 的持久化演进历史。这篇文章主要借鉴于 Redis 持久化机制演进与百度智能云的实践 ,同时按照自己的理解绘制了一些示意图。 一、简介Redis 支持两种持久化的方式:RDB 和 AOF 。 二、Redis RDB 持久化演进史2.1、持久化的数据版本演进2.1.1、版本一 版本范围:2.0.0 ~ 2.2.15 (以下分析基于 2.2.15 版本) RDB版本号:0001 版本特点: 首次支持对五种数据类型数据的持久化; 持久化数据内容: 标记头尾信息; 多 DB 信息( REDIS_SELECTDB ); 过期时间属性(单位秒, REDIS_EXPIRETIME...
译 - Bitcoin: A Peer-to-Peer Electronic Cash System
《Bitcoin: A Peer-to-Peer Electronic Cash System》 翻译过来是《 比特币:一种点对点的电子现金系统》 ,这篇文章是比特币的发明人中本聪于 2008 年发表的比特币白皮书。这篇文章介绍了比特币的设计背景,讲述了比特币的工作原理,是加密货币,区块链领域必读的一篇文章,其中讲述了很多巧妙的构思。作者翻译水平有限,翻译的语句可能会有一些出入,建议有能力的读者还是去阅读一下原文。 0、摘要A purely peer-to-peer version of electronic cash would allow online payments to be sent directly from one party to another without going through a financial institution. Digital signatures provide part of the solution, but the main benefits are lost if a trusted third party is...
Redis相关库学习 - LibMR
LibMR 是一款适用于 Redis 集群的 Map Reduce (分发Redis命令并获取结果)的依赖库。它基于 libevent 的事件机制,通过使用多个线程池来分发异步任务,目前已经被 RedisTimeSeries 等模块使用。 一、简介 GitHub 地址:https://github.com/RedisGears/LibMR 二、架构设计2.1、相关命令由于该依赖库在编译时可以设置自定义的 modulename ,因此可以避免在不同模块中使用的冲突。 modulename.INNERCOMMUNICATION : 从其他分片中获取消息; modulename.HELLO : 获取当前实例的集群id,仅集群模式下才可以调用; modulename.REFRESHCLUSTER : 更新当前集群的拓扑信息 modulename.CLUSTERSET : 强制设置集群的拓扑信息,该信息只会更改该依赖库中记录的拓扑信息,并不会影响实际的 Redis 集群; modulename.CLUSTERSETFROMSHARD : 与 *.CLUSTERSET...
RedisModule剖析 - RedisProtobuf
RedisProtobuf 是一款支持 Protobuf (目前仅支持Version 3) 的 Redis 模块,从而支持了较高级的嵌套数据结构,其设计灵感来自于 RedisJSON。 一、简介 GitHub 地址:https://github.com/sewenew/redis-protobuf 二、架构设计2.1、依赖库 Protobuf : 仅支持 version 3 ; 2.2、相关命令 pb.type : 获取指定 key 的消息类型; pb.set : 设置指定 key 的消息类型的内容信息,支持新增与变更; pb.get : 获取指定 key 的消息内容,支持 binary 和 json 的返回格式; pb.clear : 清除指定 key 的消息内容,支持指定路径; pb.len : 获取指定 key 的消息长度,支持指定路径; pb.append : 给指定 key 的特定路径中追加数据,目标路径的类型可以为 string/array ; pb.del : 删除指定 key ,或者删除指定 key 中 array/map 中的...
RedisModule剖析 - RedisRope
RedisRope 是一款可用于操作大型字符串数据(插入/拼接等变动)的 Redis 模块。它通过将一个独立的字符串拆分成多个Chunk中进行存储,从而实现了针对于大型字符串的多样写操作(插入/拼接等)的高效率,并通过引入 伸展树(Splay Tree) 的数据结构来保证数据读取的高效性。 一、简介 GitHub 地址:https://github.com/ekzhang/redis-rope 二、架构设计2.1、相关命令 rope.len : 获取特定 key 的长度; rope.get : 获取特定 key 指定索引处的字符; rope.getrange : 获取特定 key 指定范围内的字符串; rope.append : 给特定 key 追加字符串; rope.insert : 在特定 key 的指定索引处插入字符串; rope.delrange : 删除特定 key 指定范围内的字符串; rope.splice : 从源字符串中选出部分字符串并将其拼接到目标字符串中(高级操作); 2.2、数据结构// 自定义的 Module 数据类型pub...
RedisModule剖析 - RedisIntervalSet
RedisIntervalSet 是一款用于记录不同间隔集合(IntervalSet)的 Redis 模块,按照官方文档给出的示例,我们可以记录从学前班、中学到大学的不同阶段的信息,每个阶段都有一个最小和最大值的分数(这里含义为年龄),最后可以通过查询不同的分数(年龄)来查询对应的学习阶段,通过这种方式能够快速的得到对应数据值所在的区间信息,这种设计思路有些类似于 ZSet。 一、简介 GitHub 地址:https://github.com/danitseitlin/redis-interval-sets 二、架构设计 该模块使用 Rust 进行编写,依赖于 redismodule-rs 版本 0.26.0; 2.1、相关命令 iset.add : 在特定的 key 中增加一个间隔集合(IntervalSet),必须带有最小及最大分数,可同时指定多个; iset.del : 删除特定 key 或者删除其中的特定的间隔集合; iset.get : 获取特定 key 中的所有间隔集合或者指定的间隔集合; iset.score : 获取指定 key...
Redis主从复制演进史与奇思妙想
Redis 的主从复制模型从 Redis2.8 版本到 Redis7.0 经历了很多大的优化与改造,从最初版本的全量数据同步,到后续的 PSYNC 的增量数据同步,无盘数据传输方案,PSYNC2 的同源数据同步方案,无盘数据加载方案到当前的最新版本中的共享复制缓冲区的方案。同时社区中也诞生了一些奇妙的解决方案,例如基于AOF文件的增量同步等。这篇文章主要借鉴于 Redis 主从复制演进历程与百度实践 ,同时按照自己的理解绘制了一些示意图。 一、简介目前 Redis 支持两种主从数据同步方式:全量同步和增量同步。 二、Redis主从复制演进史2.1、SYNC方案 版本范围:1.3.6 ~ 2.6.17 (以下分析基于 2.6.17 版本) 方案特点: 支持全量数据同步; 持久化及传输流程: 调用 fork 生成子进程,并在子进程中将内存中的数据持久化到 rdb 文件中; 获取所有状态为 WAIT_BGSAVE_END 的从库,为其注册发送 rdb 数据的事件; 发送 rdb...
RedisModule剖析 - RedisTimer
RedisTimer 是一款基于 Redis 的时间事件来实现的计时器的模块,通过时间事件机制来实现延迟/循环执行对应的脚本(函数),由于该模块执行脚本(函数)的命令为 FCALL,因此要求Redis版本最低为7.0.0,该模块也支持数据的持久化,用于保证计时器的信息不丢失。 一、简介 GitHub 地址:https://github.com/tzongw/redis-timer 二、架构设计2.1、相关命令 timer.new : 创建一个新的计时器,会在指定的时间之后执行对应的脚本(函数),会直接覆盖同名的已经存在的计时器; timer.kill : 删除之前创建的计时器,并且删除对应的计时器key; timer.info : 查看特定的计时器的信息; 2.2、数据结构// 计时器的数据结构typedef struct TimerData { RedisModuleString *key; // 对应计时器key对象 RedisModuleString *function; // 需要执行的脚本 mstime_t...
译 - Gorilla: A Fast, Scalable, In-Memory Time Series Database
《Gorilla: A Fast, Scalable, In-Memory Time Series Database》 这篇论文讲述了 Facebook 在存储时序数据模型时的一些实践,重点讲述了他们内部的一款内存型的时序数据库 Gorilla。论文中通过使用 Delta-Of-Delta 和 XOR 方式分别对时序数据的时间戳以及浮点数据进行压缩编码,极大的节省了时序数据的存储开销,这也成为了业界时序数据库主流的数据编码压缩方式。这篇论文是时序数据库领域必读的一篇文章。 摘要Large-scale internet services aim to remain highly available and responsive in the presence of unexpected failures. Providing this service often requires monitoring and analyzing tens of millions of measurements per second across a large number...
RedisModule剖析 - RedisTimeSeries
RedisTimeSeries 是一款基于 RedisModule 实现的时序数据库模块,提供了基础的时序操作功能,包括不限于聚合查询,范围查询,保留周期,降采样(数据压缩),插值变更,二级索引等。由于数据存储于内存中,因此提供了高性能读写访问能力,但同时也受限于内存存储,可能并不适合用在极大数据量的时序场景中。考虑到身靠着Redis生态这棵大树,也许能够和Redis生态的众多组件碰撞出有趣的火花。 一、简介 官网:https://redis.io/docs/stack/timeseries/ GitHub 地址:https://github.com/RedisTimeSeries/RedisTimeSeries 命令文档地址:https://redis.io/commands/ts.add/ 支持功能: 大容量插入,低延迟读取; 按开始时间和结束时间查询; 任何时间桶的聚合查询( Min 、 Max 、 Avg 、 Sum 、 Range 、 Count 、 First 、 Last 、 STD.P 、 STD.S 、 Var.P 、 Var.S 、 twa...