- 博客(53)
- 资源 (4)
- 问答 (1)
- 收藏
- 关注
原创 paxos,zk(zab),etcd(raft),es(bully),es(raft)源码和问题分析
本篇不太适合初学者,也只说选举和存在的问题,各个中间件的处理,建议有一定的了解之后再进行阅读。有三个人:a,b,c,他们确定有聚餐,旅游,唱歌,待在家,钓鱼,跑步第一阶段:确定谁能提出方案:比如a,(a可能提出聚餐或者旅游或者待在家)比如b,(b可能提出旅游或者唱歌或者钓鱼),比如c,(c可能提出唱歌或者聚餐或者跑步)第二阶段:确定方案:a提聚餐或者旅游都能被通过,提待在家不能被通过,其他类似下面主要针对上面的情况进行分析:1:源码1:paxospaxos的选举我不再多说,pax
2021-04-17 17:21:22
942
原创 百万级qps系统的实现
常规的缓存系统的设计缓存系统大概分为2种:1:数据量不大,拉取全量的数据,缓存在本地。2:数据量很大,根据二八定理,只拉取活跃的数据缓存在本地。下面我主要说下第一种方案,我们的系统主要是第一种方案,如果有时间会说下第二种。缓存中心的设计:1:缓存中心采用一主多从的架构2:主节点检测到数据的更新,会扫描库里全部的数据,更新到缓存里3:数据库做了读写分离,扫描的也只是从库4:为了避免太大的数据库压力,只有主节点拉取数据库的数据5:从节点只拉取主节点的缓存数据,不再
2021-03-14 20:56:57
4125
10
原创 分布式id生成器
分布式id生成器在稍微规模大一点的公司,基本上都会有的,网上的样例也比较多,本编主要讲的是公司内的一些使用吧,大家影响可能更深刻一点。分布式id有哪些要求呢?全局唯一性:不能出现重复的ID号,既然是唯一标识,这是最基本的要求。 趋势递增:在MySQL InnoDB引擎中使用的是聚集索引,由于多数RDBMS使用B-tree的数据结构来存储索引数据,在主键的选择上面我们应该尽量使用有序的主键保证写入性能。 单调递增:保证下一个ID一定大于上一个ID,例如事务版本号、IM增量消息、排序等特殊需求。
2020-08-09 19:25:48
506
原创 mysql的mvcc和加锁分析
1:数据库的隔离级别数据库的隔离级分类分为四类READ_UNCOMMITTED,READ_COMMITTED,REPEATABLE_READ,SERIALIZABLE。1.1:READ_UNCOMMITTED读未提交时,读事务直接读取主记录,无论更新事务是否完成1.2:READ_COMMITTED读提交时,读事务每次都读取undo log中最近的版本,因此两次对同一字段的读可能读到不同的数据(幻读),但能保证每次都读到最新的数据。1.3:REPEATABLE_READ每次都读
2020-08-08 21:01:38
2242
原创 注册中心以及演进
注册中心现在是服务框架实现服务治理的核心,随着服务的增多,注册中心也是大势所趋,但是对于大多数的公司来说,小型注册中心是够用的,但是对于大厂来说,显起来不那么够用。1:dubbo注册中心服务提供方(Provider)所在的应用在容器中启动并运行(这个容器可以说是该应用部署的tomcat) 服务提供方(Provider)将自己要发布的服务注册到注册中心(Registry) 服务调用方(Consumer)启动后向注册中心订阅它想要调用的服务 注册中心(registry)存储着Provid.
2020-08-01 21:42:46
1061
原创 mq消息队列
mq消息队列本质上是一个文件系统,我主要介绍一下kafka,顺便和我司的jmq对比一下,因为我司是自研的消息系统,在网上也有开源的(https://github.com/chubaostream/joyqueue),但是对于kafka这种大家所熟知的消息队列,阿里的rocketmq,我司的jmq都能看到kafka设计的影子,聊kafka更容易理解,感兴趣的可以京东技术的关注公众号。1:kafka的文件设计kafka的每个topic都可以创建多个partition,每个partition可以.
2020-07-26 20:17:14
500
原创 Redis存储结构和数据复制
redis被很多的公司使用,这一篇主要针对redis的数据结构和数据复制,因为这二块是redis比较核心的地方,当然redis的slot和哨兵这些也很优秀,不在本篇的讨论范围。1:redis的组织形式众所周知,实现索引的形式一般:b+树或者hash索引,redis大家所熟知的key,value的结构,也就是后者,这种结构一般我们称之为字典,在java当中我们也不陌生,HashMap和HashTable也是实现字典的具体形式,redis如何实现字典的呢?下面我们进入正题,redis的内存组织形式。
2020-07-20 00:02:57
810
原创 zookeeper-一个简单又复杂的东西
zookeeper为什么说是一个简单又复杂的东西,复杂是指从理论上上来看,真的很复杂,很多人根本看不懂,为什么又说简单呢?简单是指从代码层面上来说,实现理论并不复杂,反而异常的清晰。下面说下复杂的东西:paxos。1:paxospaxos统治了现在基本上所有一致性算法的理论基础,chubby和zookeeper都是以paxos为理论的一致性算法,但是由于paxos不容易实现和即使实现在使用当中也会出现一些问题,基本上没有中间件完全的用paxos,基本上都是在理论基础上的变种。下面简单的说一下paxo
2020-07-12 20:41:37
596
原创 网络I/O模型和netty的模型
五种网络I/O模型分别是阻塞I/O,非阻塞I/O,多路复用I/O,信号驱动I/O,异步I/O,netty使用的是第三种:多路复用I/O,下面我们分别介绍下下面各种I/O。1:阻塞I/O这幅图看起来不太友好,特别是对新接触网络编程的新手来说,可能一头雾水,其实这个网络模型的特征就在于发起系统调用的同时,内核空间在等待数据到来,这个时候数据还没准备好,程序会一直阻塞,当数据到来,数据从内核到用户态转变,拷贝数据完成,才把数据返回。这么说可能还不太好理解,那么直接贴代码:try { in
2020-07-05 19:46:55
565
原创 Lucene查询分析-结果合并
elasticsearch是近年来比较火的分布式查询中间件了,elasticsearch的搜索引擎是LUCENE,前几年比较火的solr的搜索引擎也是lucene,能被那么多的中间件作为搜索引擎,我们看下他到底有什么神奇之处,先简单的说下lucene的数据结构:1:倒排索引常规的关系型数据库都是正排索引:id name age sex 1 小明 10 女 2 小黑 12 男 从结构上来看,关系型数据库存储的结构化数据,对于扩展数据
2020-07-04 20:41:18
1088
原创 缓存穿透,缓存击穿,缓存雪崩处理
为了应对越来越大的流量,缓存便成为系统服务必不可少的一部分,但使用缓存就会出现缓存击穿和缓存穿透的威胁。一、背景介绍 互联网应用逐步深入到生活的各个角落,为了满足越来越多用户使用互联网应用的需求,几乎所有互联网公司都采用缓存的方案来解决瞬时流量超高,或者长期流量过高的问题。但使用缓存存在风险——缓存穿透和缓存击穿:简单的讲就是如果该数据原本就不存在,那么就会发生缓存穿透;如果缓存内容因为各种原因失效,那么就会发生缓存击穿。 具体一点来说,如果缓存中不存在需要查询的内...
2020-07-01 16:49:50
300
原创 Garbage First(g1)垃圾回收器
cms优秀么?优秀,但是对于日渐庞大的内存,特别是堆内存超过8g之后,stop the world的时间会被无限拉长,cms并不能给与太大帮助,跨代对象的扫描也是问题,更何况final remark是要扫描整个年轻代,这点看是很难接受的,g1是如何解决这些问题,针对这些问题,设计上怎么去下手,下面就介绍下g1垃圾回收器,先介绍几个概念:Regioncms是有严格意义上的分区,这种划分的特点是各代的存储地址(逻辑地址)是连续的。而g1的内存没有严格意义上内存分区,所有的内存被分为一个个大小的Reg
2020-06-27 19:13:18
542
原创 jvm,apache-commons-pool的PhantomReference引起的一次线上内存崩掉的分析
前一段时间,临部门的兄弟泰国站的项目,系统上线二天,或者重启之后系统总是莫名的shutdown,我对这方面比较感兴趣,也处理过一些这种问题,就写下处理的过程:左边是没有修改之前的,右边是修改之后的,分析这个问题之前,我先介绍一下工具,用的是Mat(Memory Analyzer Tool),我比较喜欢用这个,导入内存dump快照:一般选择leak suspects report这个view就可以了,看下面的视图:从上面的视图,可以看出com.mysql.jdbc.NonRegiste
2020-06-26 16:17:13
519
原创 Concurrent Mark Sweep(cms)垃圾回收器
好长时间没写过博客了,突发奇想,开始写下最近几年的积累吧,先从Concurrent Mark Sweep(cms)开始,希望自己没有太懒吧,坚持写完吧,先介绍以下概念:GC ROOT这里我引用下RednaxelaFX的原话,所谓“GC roots”,或者说tracing GC的“根集合”,就是一组必须活跃的引用(重点)。例如说,这些引用可能包括:所有Java线程当前活跃的栈帧里指向GC堆里的对象的引用;换句话说,当前所有正在被调用的方法的引用类型的参数/局部变量/临时值。 V...
2020-06-26 00:14:55
1562
7
原创 连接池的基本实现
对于池的概念,大家都不陌生,储存昂贵的资源,比如线程,jdbc连接,线程池有现成的,这里就不献丑了,主要写下连接池吧连接池类public class ConnectionPool { private static volatile ConnectionPool connPool; private static final String url = "jdbc:mysql://local
2017-01-12 15:46:52
413
原创 java常规八种基本类型
最近确实有点忙,但也反思了很多东西,学的东西很多,ssh,设计模式,hadoop等等,什么样的基本都学了,追求学的东西多,但是却也明白了一个道理,盲目的学习并不一定好,当然我也不是说学习这些东西不好,只是我们需要对于基础知识的把我握更加更牢固一点,学了一个东西,必须知道,为什么要选择他,他有什么好处,有什么坏处,我们从中又能够学习到什么,糊里糊涂的还没明白一个东西能够干什么,就开始用,那样就有点多
2015-09-11 14:16:10
1260
原创 设计模式之适配器模式
对于设计模式,是长期代码的一种优化,我结合一些实例,,以自己的见解讲解一下我的浅识。说到适配器模式,第一点比较重要的是uml图的理解,也许你现在不理解代码,但是理解了uml图,对于你以后的认识会有很大帮助。适配器模式主要分为类适配器,对象适配器和缺省适配器。现在我们看一下类适配器的uml结构图上面可以看出,适配器模式包括三部分Target(目标),Adaptee(源),Adap
2015-05-13 16:10:01
625
原创 设计模式之单例模式
网上有那么多的资料,我们为什么还要费时费力的去写博客呢?我想应该是要写出自己本身对一个问题的看法,否则真的没必要写,直接转载别人的就可以了。以前总是有点应付的感觉,对自己的这样的行为真的很惭愧。话不多说,直入正题。单例模式也是被用的次数最多的模式之一,接下来我们说下单例模式最简单的一种写法:class Singleton1{ private static Singleton1 s
2015-04-18 08:10:10
714
原创 工厂方法和抽象工厂
csdn没有在移动上布网,最近移动校园网登不上csdn,今天终于能登上了,小草鸟就写下最近在学的设计模式。工厂估计也差不多是用的最多的了,对于工厂方法和抽象工厂比较容易混,笔者在这里说下自己的学习的一些理解。工厂模式:产品对于工厂,当然是生产产品的了,当然我们得有产品类,为了扩展性良好,先定义一个产品接口public interface Animal { pub
2015-04-13 22:18:01
568
原创 sql个人总结4
说到sql,无疑存储过程很重要,这篇就和大家讨论储存过程。1:储存过程a:不带参数的储存过程USE testGOCREATE PROCEDURE WLY --储存过程,不带参数ASSELECT * FROM roleGOb:带参数的储存过程USE testGOCREATE PROCEDURE WLY1 @A INTAS DECLARE @B INTS
2015-03-06 18:06:31
696
原创 sql个人总结3
说到sql,不免会想到t-sql,这篇主要就是要和大家讨论的t-sql语句。1:赋值a:为变量单个赋值BEGIN DECLARE @SID INT, @SNAME VARCHAR(1)SET @SID=0 --只能为一个变量赋值SET @SNAME='A'PRINT @SIDPRINT @SNAMEENDGOb:select为变量赋值
2015-03-06 17:37:00
549
原创 sql个人总结2
前一篇说了sql语句的数据库操作,这一篇就说下表的操作。1:先说下表的插入,更新,删除这些操作。a:插入 insert规正式的插入:/* insert into tablename(column) values(?) */ /* column也可以没有,可以是一张表,没有值的列用null补齐 */insert into student(sid,sname) values(1,'1'
2015-03-03 16:47:48
807
原创 sql语句个人总结1
以前的数据库课程很多学的不太精,现在回顾一下以前的学习。创建数据库的语句/* 创建数据库 */create database wly on primary( name='wly_data', --主数据文件的逻辑名称 filename='F:\sql语句\mdf数据库\wly_data.mdf',
2015-02-17 11:08:28
1041
原创 spring bean源码简单解析
最近在看spring的源码,发现看这个还是有点早,看的很吃力,有多东西还不是很明白,像代理等,我感觉spring用abstract模板来写主要功能,用接口来拓展功能,用的出神入化,但也让很多简单的东西变得不那么好懂了,就是写的啰嗦了,个人感觉。下面就是下spring bean源码的学习:private static final Resource RETURNS_NULL_CONTEXT
2015-02-15 11:16:41
768
原创 spring mybatis简析
好多天没有发博客了,下面就直接说下我正在学习的mybatis。下面就说下mybatis在spring中最简单的配置:
2015-02-09 15:55:26
837
原创 for in结构的简单理解
js对于for in结构的运算的效率比for结构低,这个是很明显的。下面我介绍下for in结构:对于对象:for(var prop in student){ document.write(prop+""+student[prop]);}输出为:id 1name 小明这里prop为属性,后面为属性值对于一个数组:for(var i in a
2015-01-05 20:15:21
1112
原创 maven之简单解析
好久没写东西了,主要是学业最近比较重,下面我写下myeclipse web的一个项目管理的maven。我以myeclipse10为demo,我们得先下载一个maven,这个可以去官网下载。1:把你的maven加到myeclipse里面去下面new ->other ->maven project接下来增加目录层次结构src/main/java,src/test
2015-01-02 22:00:32
824
原创 ejb简析
对于分布式的网站来说,ejb是一个不错的选择,很好的诠释了面向接口的编程。下面我简要的说下我对于ejb的基本认识。首先,建一个ejb project,接下来是一个远程接口:Hello.javapublic interface Hello { public String hello(String name);}接下来是一个本地接口:HelloLocal.java
2014-11-25 17:04:29
950
原创 spring完整demo实例
我前几篇分散的说了spring mvc,这一篇我完整的说一下,仅供参考,如果大家要用,只需要改下路径就行,可能比较长,大家耐心看哦。我会在最后把工程连接贴上。先贴hibernate的连接配置:hibernate.propertiesdataSource.url=jdbc\:mysql\://127.0.0.1\:3306/dormdataSource.password=123456
2014-11-01 20:09:58
3608
原创 权限表设计之代码解析
在权限表设计中已经说了权限表的结构,在这里我说下代码user表@Entity@Table(name="user")public class User implements Serializable{ private static final long serialVersionUID = 6177417450707400228L; @Id @GeneratedValu
2014-10-27 18:42:41
1041
原创 hibernate之实体@onetomany和@manytoone双向注解
hibernate大家想必已经很熟悉,现在的注解太流行了,我就说下注解的作用。下面是User类:@onetomany@Entity@Table(name="user")public class User implements Serializable{ private static final long serialVersionUID = 6177417450707
2014-10-25 22:42:39
4059
原创 struts之验证框架
对于格式的验证,我们可以自己写js来验证,当然struts已经封装了验证框架,下面说下我的学习哦。验证框架分为了服务器端的验证和前台的xml配置验证(这里相当于js),下面先说下服务器端的验证。1:由于action类继承了ActionSupport这个类,其中这个类又实现了Validateable, ValidationAware接口,所以我们可以直接的重写validate()这个方法
2014-10-18 23:27:12
662
原创 struts之拦截器
拦截器是为了让一些自己不希望发生的事情进行预防,下面我说一下struts自定义拦截器。下面我贴下struts.xml里的自己定义的拦截器:
2014-10-17 22:43:46
752
原创 绝对路径和相对路径的区别
对于路径的理解,有的时候很模糊,总感觉明白,但有时却想不通,下面就说下我对于路径的理解。绝对路径,顾名思义,就是绝对的,完整的路径,打个比方,就像是:C:\Program Files (x86)\Microsoft Office绝对路径就是这样的完整的路径,不是路径的一部分。下面就是相对路径,相对路径又分了二种情况:第一种:是相对于当前页面的。my.html;../my.h
2014-10-16 18:04:21
750
原创 hibernate入门级
hibernate是数据层的架构,想必大家很熟了吧,话不多说,直接贴代码。首先是hibernate.cfg.xml的配置,实际上这里就是数据库的配置:<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://www.hibernate.org/d
2014-10-14 21:56:43
609
原创 java io流之int数组数据的插入与取出
java io流大家都很熟悉吧,有时候如果用的不熟,对于数据的处理真的很头疼,下面是对与int数组的处理。下面是代码:public class Stream { private int a[]; private BufferedWriter bufferedWriter; private BufferedReader bufferedReader; priv
2014-10-08 17:05:31
2102
原创 经典排序之归并排序
归并排序 与插入排序不同的是二个有序数组彼此的插入,而插入排序是一个数向有序里插入。思想是吧一个数组分成若干个最小的有序数组,然后把这些小的有序数组,进行合并。下面是代码:public class MergeSort { public int[] sort(int[] nums, int low, int high){ int mid = (low + high) /
2014-10-07 22:29:59
675
原创 经典排序之插入排序
插入排序的思想很简单,就是每向有序序列中插入一个数,就把这个数依次与其他数比较,逐次替换。下面是代码public class InsertSort { public void insertSort(int a[]){ int length=a.length; int i; int keyword; for(int j=1;j<length;j
2014-10-07 22:23:28
633
原创 struts学习之入门级
学了spring mvc的一些东西,下面是我学习的struts结构,都用反射来做,其实感觉有的地方相通。下面是web.xml的配置 struts2 org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter struts2 /* in
2014-10-06 22:13:55
671
原创 经典排序之快速排序
快速排序堪称最经典的排序,思想是选一个基准值,一般选第一个。然后所有的值与基准值比较,大的位置不变,小的位置与第一个大的位置互换,就这样进行第一轮排序,然后对于基准值二边的再进行排序,依次类推,直到为剩一个。下面是快排的代码:public class QuickSort { public void quickSort(int a[],int start,int end){
2014-10-05 15:53:21
762
关于tcp异常不能关闭的问题,求大神指点
2017-06-14
TA创建的收藏夹 TA关注的收藏夹
TA关注的人