引言
Redis(Remote Dictionary Server)是一个开源的,基于内存的,可持久化的Key-Value数据库,并支持多种数据类型.由C语言编写,速度极快,读写速度分别达到10万/20万.它最常出现的场合就是作为缓存,因为其数据都是存在内存中的,这也使得用它来存放热点数据非常高效,当然也可被用作轻量级消息队列,分布式锁,计数器,全页缓存等.Redis原生提供高可用集群(AP),使得我们可以进行高效的进行水平扩展,.除了基础的数据结构以外,其还提供发布订阅、慢查询分析、性能测试、Pipeline、事务、Lua脚本、Bitmaps、HyperLogLog、Geo等单独的功能模块.
这样看起来好像Redis是个万金油,什么都可以干,但是我们还是要选择使用场合,在真正适合Redis的地方使用,并针对数据类型进行合适的配置才可以发挥它最大的价值.否则的话就可能事倍功半,举个简单的例子.Redis在持久化上上其实就不是真正的保证了不会丢失数据,而且Redis集群设计的初衷也只是满足了分区容错性和高可用,而放弃了强一致性,这使得我们在做一些与钱相关的业务的时候,Redis就要被扔到小黑屋去,否则就是我们要进小黑屋了.
说回正题,为什么要去学习源码呢?我觉得原因就是对于这样一个热门的事物"Redis",在开始学习阶段对于它的疑问有很多,初期当然只能在博客或者Google去寻找答案,但是这种方法在很多情况下给我们的看法总是模糊的,甚至于两篇文章说了对一个问题有两个答案,对于懵懂的我来说一时间是懵逼的.侯捷前辈说过一句话"源码面前,了无秘密",这句话对于未来大概率从事计算机行业的我们来说我想应该是一个金句,计算机是一个工科,显然需要我们贯彻"实践+理论"这个方针,理论不必多说,就是一本本难啃的技术书.而实践在我看来就是"编码+阅读源码",学习别人好的地方,才能改变自己差的地方,闷头写代码也未必是一件好事呢.
其实很多时候对于看源码这个事情我是拒绝的,因为太懒了(hhhhhhh).看源码其实有两种看法,一种是照着已有的源码解析,这种当然会简单许多,但是当然对应的收获也会少一些.一种就是裸看源码,自己根据已有的文献先搞清楚原理,一步一步去搞清楚每个地方的意思,这样是最累的,可能一下午搞不清楚一处的实现原理,当然也是收获颇丰的,毕竟相当于我们自己走了一遍设计的流程,因为源码的很多地方不是一次就完成的,是经过很多次修改才成这样的,一次直接吃个大老虎,看似完美,其实失去了一些提升的机会.但最重要的还是要去看,这样才能由菜鸡变成一个不那么菜的菜鸡呀(手动狗头).
下面是源码解析的正文部分,基本上把Redis的常用的功能都囊括在其中,希望对内容有不同见解的朋友能够不吝赐教.
正文:
Redis源码解析(1) 动态字符串与链表
Redis源码解析(2) 字典与迭代器
Redis源码解析(3) 跳跃表
Redis源码解析(4) 整数集合
Redis源码解析(5) 压缩列表
Redis源码解析(6) 键的过期处理策略
Redis源码解析(7) 发布订阅机制
Redis源码解析(8) AOF持久化
Redis源码解析(9) RDB持久化
Redis源码解析(10) 网络框架
Redis源码解析(11) 内存淘汰策略
Redis源码解析(12) 命令执行过程
Redis源码解析(13) 主从复制
Redis源码解析(14) 哨兵机制[1] 结构与初始化
Redis源码解析(15) 哨兵机制[2] 信息同步与TILT模式
Redis源码解析(16) 哨兵机制[3] 判断下线
Redis源码解析(17) 哨兵机制[4] 故障转移
Redis源码解析(18) 集群[1]初始化,握手与心跳检测
Redis源码解析(19) 集群[2] 主从复制,故障检测与故障转移
Redis源码解析(20) 集群[3] 键的存储,重新分片与重定向
Redis源码解析(21) 集群[4] 故障转移failover与slave迁移
Redis源码解析(22) 事务
Redis源码解析(23) SCAN命令实现
参考:
[译] 解密Redis持久化