随笔分类 - 源码
源码阅读心得,提升的路径。
摘要:上篇我们讲了Dubbo中有一个非常本质和重要的功能,那就是服务的自动注册与发现,而这个功能是通过注册中心来实现的。上篇中使用zookeeper实现了注册中心的功能,同时了提了dubbo中有其他许多的注册中心的实现。 今天我们就来看看另一个注册中心的实现吧: redis 。 1. dubbo在 Red
阅读全文
摘要:Dubbo中有一个非常本质和重要的功能,那就是服务的自动注册与发现,而这个功能是通过注册中心来实现的。而dubbo中考虑了外部许多的注册组件的实现,zk,redis,etcd,consul,eureka... 各自实现方式各有不同,但是对外表现都是一致的:都实现了 Registry 接口! 今天我们
阅读全文
摘要:前两篇中,我们看到了dubbo在负载均衡和服务路由方面的实现,它为集群功能提供了必要的功能。 今天我们再来看另一个集群组件的实现:集群容错。 1. dubbo 集群容错简介 为了避免单点故障,现在的应用通常至少会部署在两台服务器上。对于一些负载比较高的服务,会部署更多的服务器。对于服务消费者来说,同
阅读全文
摘要:上一篇中,我们介绍了dubbo的负载均衡实现,见识了几种常用的负载均衡算法。就单个功能而言,似乎dubbo并没有太多的突出之处。事实上,一个成功的产品不必每个地方都要打破常规。更重要的是其全局优化的架构设计,以及如何使用现有的优秀解决方案为己服务。 本篇将介绍另一种集群环境中的高可用实现:路由服务的
阅读全文
摘要:dubbo作为分布式远程调用框架,要保证的点很多,比如:服务注册与发现、故障转移、高性能通信、负载均衡等等! 负载均衡的目的是为了特定场景下,能够将请求合理地平分到各服务实例上,以便发挥所有机器的叠加作用。主要考虑的点如:不要分配请求到挂掉的机器,性能越好的机器可以分配更多的请求。。。 一般负载均衡
阅读全文
摘要:nginx作为高效的http服务器和反向代理服务器,值得我们深入了解。 我们带着几个问题,深入了解下nginx的工作原理。首先是开篇:nginx是如何启动的? nginx是用c写的软件,github地址: https://github.com/nginx/nginx 其目录结构如下,我们主要关注 s
阅读全文
摘要:请求转发一般的原因为: 1. 该请求自身无法处理,需要转发给对应的服务器处理; 2. 为实现负载均衡,使用路由服务,选择目标实例进行转发; 在集群模式下,请求可以打到任何一台redis服务器上。然而并不是所有的服务器都会处理真正的请求,而是只有符合redis slot规则的实例才会处理真正的请求;
阅读全文
摘要:JDBC 是java中的一个数据连接技术,它提供了统一的 API 允许用户访问任何形式的表格数据,尤其是存储在关系数据库中的数据。 虽然目前JDBC已经基本被隐藏在了许多数据库框架之后,但是其底层原理从未变过。所以,多一点了解JDBC还是有意义的。 JDBC 之所以能提供统一的API,是基于对所有数
阅读全文
摘要:业务最初的应用场景中,我们也许使用单机redis就可以应付业务要求,但并非一直可行。 比如单机的读写能力问题,单机的可用性问题,单机的数据安全性问题。这些都是许多互联网应用经常会遇到的问题,也基本上都有一套理论去解决它,只是百花齐放。 哨兵是Redis中解决高可用问题的解决方案之一,我们就一起来看看
阅读全文
摘要:谈到发布订阅模式,相信不会陌生,典型的观察者模式的实现。然而从表面来看,本地实现一个wait/notify通知、register/update调用, 实现一个远程mq服务, 还有本文说的 pub/sub, 其实道理都差不多。只是,同样的需求,针对不同的环境,实现上往往是有天壤之别的。 所以,我们就来
阅读全文
摘要:前面几篇我们已经完全理解了redis的基本功能的实现了。 但单靠基本功能实现,往往还是称不上优秀的项目的。毕竟,我们现在面对的都是复杂的环境,高并发的场景,大数据量的可能。 简而言之,现在的系统一般都需要支持分布式部署,不存在单点问题,才算是一个合格的系统。 而redis作为一个存储系统,单点问题肯
阅读全文
摘要:java中的所说的线程池,一般都是围绕着 ThreadPoolExecutor 来展开的。其他的实现基本都是基于它,或者模仿它的。所以只要理解 ThreadPoolExecutor, 就相当于完全理解了线程池的精髓。 其实要理解一个东西,一般地,我们最好是要抱着自己的疑问或者理解去的。否则,往往收获
阅读全文
摘要:前面几篇文章,我们完全领略了redis的string,hash,list,set数据类型的实现方法,相信对redis已经不再神秘。 本篇我们将介绍redis的最后一种数据类型: zset 的相关实现。 本篇过后,我们对redis的各种基础功能,应该不会再有疑惑。有可能的话,我们后续将会对redis的
阅读全文
摘要:上两篇我们讲了hash和list数据类型相关的主要实现方法,同时加上前面对框架服务和string相关的功能介绍,已揭开了大部分redis的实用面纱。 现在还剩下两种数据类型: set, zset. 本篇咱们继续来看redis中的数据类型的实现: set 相关操作实现。 研究过jdk的hashmap和
阅读全文
摘要:上一篇讲了hash数据类型的相关实现方法,没有茅塞顿开也至少知道redis如何搞事情的了吧。 本篇咱们继续来看redis中的数据类型的实现: list 相关操作实现。 同样,我们以使用者的角度,开始理解list提供的功能,相应的数据结构承载,再到具体实现,以这样一个思路来理解redis之list。
阅读全文
摘要:Redis作为nosql数据库,kv string型数据的支持是最基础的,但是如果仅有kv的操作,也不至于有redis的成功。(memcache就是个例子) Redis除了string, 还有hash,list,set,zset。 所以,我们就来看看hash的相关操作实现吧。 首先,我们从作用上理解
阅读全文
摘要:上一篇文章从根本上理解了set/get的处理过程,相当于理解了 增、改、查的过程,现在就差一个删了。本篇我们来看一下删除过程。 对于客户端来说,删除操作无需区分何种数据类型,只管进行 del 操作即可。 零、删除命令 del 的定义 主要有两个: del/unlink, 差别是 unlink 速度会
阅读全文
摘要:经过前两篇的介绍,我们对整个redis的动作流程已经有比较清晰的认识。 接下来就是到具体的命令处理方式的理解了,想来我们用这些工具的意义也是在此。虽然没有人觉得,一个set/get方法会有难度,但是我们毕竟不是很清楚,否则也不至于在谈到深处就懵逼了。 我觉得本文的一个重要意义就是: 让set/get
阅读全文
摘要:上一篇文章,我们从框架层面,主要介绍了redis的启动过程,以及主要的命令处理流程逻辑。这些更多的都是些差不多的道理,而要细了解redis,则需要更细节的东西。 今天我们稍微内围的角度,来看看几个命令执行的重要方法,深入理解下redis的魅力所在。 首先,我们通过上一章知道,processComma
阅读全文
摘要:redis是用c语言的写的缓存服务器,有高性能和多种数据类型支持的特性,广受互联网公司喜爱。 我们要分析其启动过程,首先就要先找到其入口。 当然我们应该是要先分析 Makefile 文件,然后找到最终编译成的文件,然后再顺势找到C语言入口 main(); 这里咱们就不费那事了,一是这事很枯燥,二是我
阅读全文