Zookeeper
Zookeeper介绍以下概念大部分来自官网
他是啥官方介绍:ZooKeeper 是一个集中式服务,用于维护配置信息、命名、提供分布式同步和提供组服务。分布式应用程序以某种形式使用所有这些类型的服务。每次实现它们时,都需要进行大量工作来修复不可避免的错误和竞争条件。由于实现这些服务的难度,应用程序最初通常会吝啬它们,这使得它们在发生变化时变得脆弱且难以管理。即使正确完成,在部署应用程序时,这些服务的不同实现也会导致管理复杂性。
翻译的有点不准,一句话就是:分布式协调程序。好,分布式协调怎么协调?配置!维护一份配置文件,所有的分布式程序去读取这个配置文件,去做处理。
他提供了什么官网:ZooKeeper 是分布式应用程序的分布式开源协调服务。它公开了一组简单的原语,分布式应用程序可以基于这些原语来实现更高级别的同步、配置维护以及组和命名服务。它被设计为易于编程,并使用以熟悉的文件系统目录树结构为样式的数据模型。它在 Java 中运行,并具有 Java 和 C 的绑定。
众所周知,协调服务很难做好。它们特别容易出现诸如竞争条件和死锁之类的错误。ZooKeeper 背后的动机是减轻分布式应用 ...
redis
前言为什么需要redisredis非关系型的K-V数据库,数据存放内存了,当然肯定会序列化在磁盘,毕竟服务器关闭内存会清掉,内存大家都懂,快啊!所以Redis快啊。那我们可以单用Redis数据库存放我们的业务数据吗?可以,但是不推荐,为啥呢?我们在设计业务的时候,会设计各种关系表,A数据存A表,B数据存B表,C数据存C表,ABC表关联出我们需要的数据,方便管理,而Redis并不能做到这种,他只能K-V类型存储数据,并不能K和K关联去查询出数据,我说的不是代码去处理!!!所以,Redis主要是做缓存作用,放一些经常访问,不轻易变动,并访问次数多的数据,或者ABC表关联的查询慢的数据。
理论来说,不是因为Redis解决了某些业务,Redis能解决的业务,关系型数据库肯定能解决,换而言之,我们首先考虑使用关系型数据库解决问题,Redis干什么?Redis做的是加速做缓存,解决关系型数据库IO量大或访问慢的问题,从而加速业务的处理!
Redis介绍Redis类型redis是五种类型,类型说的是Value的类型,String、hashs、lists、sets、sorted set,redis为何 ...
从网络到分布式(集群内高并发)
高并发负载均衡:网络协议原理想要分流实现高并发处理,需要转发到A、B、C服务器上,如何转发,需要了解网络协议原理!转发分七层协议、四层协议、二层协议,这里我们猜到了二层协议最快的事情,所消耗的资源是最小的。那么怎么去实现呢?所以,需要去了解网络协议。网络协议七层。
流程图
模拟网络请求进入本机文件
1cd /proc/$$/fd
会有一些文件,0–>输入,1–>输出,2–>报错
我们和百度建立socket连接,要知道,必须由链接才能访问
1exec 8<> /dev/tcp/www.baidu.com/80
关闭socket连接
1exec 8<& -
开始通过协议请求,任何的请求必须要有协议,什么是协议,是规范
1echo -e 'GET / HTTP/1.0\n' >& 8
有request就有response,我们查看response
1cat 0<& 8
下面的东西就不展示了,就是html,上面是就是应用层http协议。
解释网络层应用层:主要指浏览器或者tomcat容 ...
algorithm
前言跟着左神冲冲冲
排序选择排序何为选择排序,我们把第一个数拿到,和他后面的所有数相比,取最小的值,然后交换。在拿第二个数,和他后面的所有的数相比,在交换。这个就是选择排序。
所以,比较的角标为
0~n-1
1~n-1
2~n-1
…
n-2~n-1
核心代码:
12345678910111213141516171819public static void selectSort(int[] arr) { //数组为null和长度小于2的直接返回 if (arr == null || arr.length < 2) { return; } int n = arr.length; int minIndex; for (int i = 0; i < n; i++) { minIndex = i; for (int j = i + 1; j < n; j++) { //如果最小角标大于当前角标那么替换 if ...
实现延迟任务
前言最近在写个人自动api处理项目,有一个需求,请求完A接口后,需要把A的结果拿到,在X秒后用结果去请求B接口。一开始想到用Mq去做,RabiitMq有个消息过期转发,主要想学下mq,发现效果并不是多好,于是用定时器实现了一波。
实现原理我们需要搞清已知条件和需求
已知条件
执行一次
X秒自定义
知道什么时候结束
实际操作使用quartz定时器,我已经抽象出一套定时器功能模块,只需要提交定时器对象就行,那我们需要设置的是定时器任务代码,和定时器cron表达式
定时器任务这里有个细节,我定时器任务直接代码写的实现。
亮点是他居然可以直接把类注入进来!!!有点厉害。这里需要注意的是传参需要设置JobDataMap对象里面,然后在参数context里去拿,不然报错!!!
cron表达式cron表达式也是个细节,cron表达式的语法是 秒 分 时 天 月 ? 年,细心的朋友已经明白了,这对应java的时间转化不就是
1ss mm HH dd ? MM yyyy
我们把当前时间推迟X秒,直接转化不就是一个cron表达式了吗!!!
spring源码下载测试
前言学习前人的思想,去写代码。故,想要去学习spring源码,但是这个不是说学就能学的,需要有学习思路、方法,所以把spring源码下下来,写上注释,细细研究。其实,最主要是可以写上注释,方便而已
准备工作拉取代码github原项目https://github.com/spring-projects/spring-framework,但是下载太慢了,所以gitee上也有,可以直接拉取https://gitee.com/mirrors/Spring-Framework。怎么拉的就不说了。还需要一个依赖管理工具Gradle,我用的也不多,就不说了。然后等待idea依赖自己加载完毕。
Gradle小配置哇!没用过Gradle很难受,每次启动,idea都自动下载Gradle,我明明设置了啊,网上教程也不行。最后根据经验解决了!!!
我一直以上设置上面的Gradle user home就行了,但是每次Gradle编译jar包都是还要下载Gradle,我猜测配置错了。于是,各种百度解决不了,慢慢找配置,发现下面那个配置 Specified location像是设置本地Gradle,于是试了下就解 ...
java编发编程实战
前言我们都知道,Spring创建出来的对象,默认单例的,所以,我一直在思考一个问题,为何多个线程访问单例对象并未发生并发问题?好像这个问题有点nt,于是我结合我所学到的知识分析了一下。
并发问题的原因
多线程访问共享变量,或操作一个可变状态的变量。共享变量很好理解啊,可变状态变量是什么意思呢?举个栗子:多线程访问一个对象的addOneByA()方法,给对象的变量A数值+1,单线程肯定没问题,多线程是有问题的。我们再来分析下,变量A如何+1
线程拿到A的变量
线程做+1操作
线程吧+1后的变量赋给A
就这三步,我们假如两个线程,同时拿到A变量的数值,然后做+1操作,最终,赋给A的时候A的数值最终只是+1,而不是+2。
线程隔离
这个是书里看到的,【每个线程都有各自的程序计数器、栈、局部变量】等。这个就很重要啊,这个说明,非共享、可变状态的变量,多线程操作是没有任何问题的,因为和隔离的。
解决并发问题
不在线程之间共享该状态变量。就是多线程不访问可变状态变量了呗。
将状态变量修改为不可变变量。就是可变状态变量,变成不可变状态了呗,理解为不可变得常量。
在共享、可变变量的操作【同 ...
java编程思想
前言学习永无止境
对象导论论抽象抽象是什么?所有的编程语言都是提供抽象机制的。辟如:汇编就是对底层机器的轻微抽象,而Basic、C是对汇编的抽象,我们发现这些抽象要求【解决问题是要基于计算机结构】,而不是【所要解决问题的问题结构】。我们需要把【基于计算机结构的抽象】和【所要解决问题的问题结构】进行关联,比较复杂。
故,面向对象编程思想是一个很重要的东西。把复杂问题抽象成多个对象,见对象犹如见到了问题,这个对象可以有处理问题的各种方法。良好的抽象+编程逻辑,可以使外人更好的理解解决的问题。
论继承当很多物品存在相同的特征的时候,我们可以把这些东西抽象出来,或者可以说这些东西属于什么哪一类,辟如,鸡、鸭、鱼、猪统称为东西,那么这么多的动物具有什么特征呢?进一步的抽象,吃饭、走路、喝水。。。这个动作就是方法我们抽象出来,就组成一个抽象对象。我们可以说鸡、鸭、鱼、猪是动物,但不能说动物就是鸡、鸭、鱼、猪。所以,鸡、鸭、鱼、猪可以继承动物这个东西,具有动物所有的特征,但,也可以有自己独特的特征。
可能说的比较浅显,但是大致这个意思
论多态明确一个概念,被继承的类叫【基类、超类、父类】,继承类叫 ...
基础知识复习
前言最近,学习spring源码,对于spring源码中运用的基础知识,竟有些陌生,故,需要复习基础知识,以更好的设计代码,充(gao)充(gong)电(zi)。
继承继承简直就是设计代码的核心,设计六不六就要看你,怎么抽象了!!!以前学习的时候并未感受到,但是当用到的时候,才感受到其中的精妙之处。java真乃世界上第一语言!!!
子类实例调用父类我们有A类,有构造方法,和自己的方法
B类继承A类,并实现say方法
实例化B,最终打印结果
说明是先调用父类的构造方法,父类调用方法子调用【say】方法,打印的是子类的实现,因为java遵循【就近原则】,调用的是子类的方法。然后在调用子类自己的方法,完成实例化。
那么假如,子类假如不去实现父类的方法,自然调用的是父类的【say】方法。这种设计模式可以去进行一些初始化逻辑工作,假如父类的方法无法满足子类初始化的需求,那么可以子类另外实现一些。当然这只是一种业务场景,具体业务具体分析具体设计。
攀登
但山就在那里没有消失闭上眼的是你加油