database

如何保证数据的高可用性

一,高可用性定义 我理解的高可用性应该包括两方面 数据稳定性,数据应该总是可以被访问的 数据访问的速度,数据被存取的速度应该在用户可以承受的范围内 二,保证数据的可用性 可以使用数据库的主从备份来保证数据的高可用性。 数据稳定性的保证:由于采用了主从备份,当一台数据库服务宕掉后,其余数据库能保证数据库的可访问和恢复。 数据访问速度的保证:对主数据库进行写操作,对从数据库进行读操作,从而降低读写操作对某单个数据库server的IO压力,这就是所谓的数据读写分离技术 三,主从数据备份的难点 基于对上述可用性结构的理解,我认为该方案有如下两个难点: 主从数据库需要保证数据的一致性 对于多个从数据库,如何将读请求负载均衡至特定的从数据库 一般有成熟的技术框架来解决这两个技术难点,可在网上搜索。

java

Java Thread Pool

一,线程池的好处 降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗 提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行 提高线程的可管理性。线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一的分配,调优和监控 二,线程池使用方式 java中使用ThreadPoolExecutor来创建一个线程池。其基本用法如下: //创建一个线程池 ThreadPoolExecutor threadPool = new ThreadPoolExecutor(3, 5, 60, TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>

String

String 同StringBuffer性能比较

String和StringBuffer都可以用来拼接字符串,但大多数java程序员都知道。String拼接的性能远不及StringBuffer或者StringBuilder,为什么? 一,StringBuffer性能更好的原因 首先,String和StringBuffer对字符串的内部存放都是放在char数组中,但有细微差别。 String的拼接实现 String的数组声明为: private final char value[]; 由于String的char数组是final声明,这意味一旦存放具体内容后,char[]将无法改变,于是String在做拼接时,就有了如下代码: public String concat(String str) { int otherLen = str.length(); if (otherLen == 0)

servlet

Servlet Filter工作原理

前言 本文主要探讨Filter的链式处理结构,不会过多赘述Filter的基本功能。 Filter的链式结构 一直一来,我对多个filter如何能够实现链式处理的结构很好奇。大体说来,假若Filter A处理完后,可以将request和response交由后续的Filter B处理,这很像责任链模式(Chain of Responsibility Pattern)。但实际上它不是,而是采用类似注册查找的方式。 一个filter的核心方法为dofilter,其核心结构为: public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) { //此处编写该filter的核心处理代码 //... chain.doFilter(request,

java

Java Clone

一,关于Java中的Clone 只要实现了Cloneable接口的类,其对象都可以调用clone()方法进行对象复制,如果没有实现Cloneable接口便掉clone方法会报CloneNotSupportedException。 值得注意的是,Cloneable接口并没有提供任何需要实现的方法,所以实现了Cloneable接口的类其意义只是声明了自己具有clone的功能。具体的clone实现是jdk底层实现了,对某对象调用clone方法后,向上遍历最终使用的是Object类的clone方法。示例: public class Test implements Cloneable { private String name; public String getName() { return name; } public void setName(String name) { this.name

big

大数据的优化方式

一,前言 当数据量太大时,单张表的访问会造成严重的性能问题,这个时候需要将数据分开存储,以降低对单张表的访问压力。分开逻辑无外乎如下两种: 1,在同一个数据库实例上分开存储,这种方式英文叫做partition,意味分区 2,分开存储在不同实例上,甚至多太服务器上 ,这种英文叫做shared,意为分片 二,分区(Partition) 对一张表的分区有两种方式,如下: 横向分区(Horizontal partitioning) 纵向分区(Vertical partitioning) 2.1横向分区 定义:按行划分,将不同的行记录存储在不同的表或物理分区上 举例:

javascript

javascript closure 闭包

一,前言 听过很多大道理,却依然过不好这一生。看过很多闭包解释,却依然不知道到底什么意思。在查阅相关资料后,本文通过记笔记的方式,来从新理一下,我所理解的javascript闭包。为了简化起见,全文“闭包”代指“javascript 闭包”,因为尚不确定其它语言的闭包是否同javascript类似。 二,何为闭包 一切都要从访问范围说起,global variale访问范围太大,整个页面都可以访问。如: var a=0; function add() { var b = a + 1;

javascript

Javascript function definite & variable scope 方法定义及变量范围

一,方法定义的两种方式 javascript有两种方法定义方式,分别为 声明定义 表达式定义(也称匿名方法) 声明定义 通过声明的方式定义及使用方法的例子如下: function myFunction() { var a = 4; return a * a; } myfunction(); 值得注意的是:函数声明不属于表达式,所以其声明的花括号后不加分号。 表达式定义 表达式定义的方式为,定义一个匿名方法,然后将其付给一个变量,通过变量名来访问方法。例子如下: var x = function (a, b) {return

javascript

Javascript Prototype

何为javascript prototype javascript可以以OO的方式进行编程。Prototype在js中是一个模版对象,用这个模版对象来创建真实的对象,这些对象都将继承prototype中的属性和方法。 如何构建prototype 在js中,创建一个构造函数既创建了一个prototype。像这样: function person(first, last, age, eyecolor) { this.firstName = first; this.lastName = last; this.age = age; this.eyeColor = eyecolor; } 可以看到,所有添加到this的属性和方法既是添加到了prototype上。这里我们创建了一个名为person的prototype。基于该prototype创建对象的方式就是用new,像这样:

java

ConcurrentModificationException

一,ConcurrentModificationException Iterator在迭代时,检测(对List内部的modCount进行检测)到并发修改则会快速失败(fail-fast),抛出该异常。值得注意的是,这里指的并发修改并不一定是多线程。单线程情况下也可能抛出该异常。 二,单线程下抛出ConcurrentModificationException 单线程下,以下代码会导致collection快速失败抛出异常: Iterator iterator = collection.iterator(); while (iterator.hasNext()) { Item item = (Item) iterator.next(); if (item.satisfiesCondition()) { collection.remove(item)

java

Java并发

一,初衷 一直以来,对java并发的认识,仅仅停留在多线程的使用,以及synchronized等宏观层面上,但对于底层实现却毫无认识,这使得在使用并发解决问题时,不能游刃有余知根知底。于是花了点时间研究这个专题,并梳理成文,以求更为深刻的认识。 二,并发和并行 并发(Concurrency) 并发是指,多个任务的启动,执行,停止在时间周期上是重叠交叉而不是线性的,比如A任务执行期间,B任务可能已经进入结束周期。并发并不意味着这两个任务就一定是在同一瞬间执行着,比如在单核cpu机器上的两个任务在某个时间片内,只能有一个任务执行。 并行(Parallelism) 并行一定是指两个任务在多个cpu上,同一瞬间都执行着 参考地址 三,并发的目的和困难 所有的并发其目的,

项目管理修炼之道

《项目管理修炼之道》 读后感

刚读完《项目管理修炼之道》不久,我也不记得从哪看到这本书的介绍,反正一直搁在书单上。虽少有项目管理的机会和经验,但有幸经历过几个管理糟糕的项目,已然知道如何可以做到最差,殊不知如何做到最好,遂找来一读。 作者基于大量风格迥异的案例来说明问题,并针对每种可能出现的项目管理问题给出了相应的应对之道,细致到给出相应统计表格样式。 项目管理的主要是管什么? 简单说,项目管理即是对风险的管理。在整个项目周期中,需要项目管理解决和规避可能导致项目失败的风险。 而风险可能是不期而遇的,这要求项目管理能够及早认识和响应风险。 如何管理风险 1,限定开发时间盒 应该认识到这个充满变化的世界,没有人能准确规划过于长的周期。过长的周期意味着更多的风险,以及更慢的风险响应速度。所以开发时间应该限定在更小的时间周期内,这样较能准确预估和发现并响应风险。 2,迭代开发 迭代开发同限定时间盒一样,是为了更为快速灵活的交互,

伪元素

css中伪类和伪元素的区别

用处 普通基于元素或基于类的样式定义像这样 p { color: red; text-align: center; } 这样 #para1 { text-align: center; color: red; } 或这样 .center { text-align: center; color: red; } 可以看到他们都基于html dom树中具体的类,或者元素进行样式定义 ,但如果想对诸如元素状态变化或位置进行样式定义则需要用到伪类(Pseudo Classes)和伪元素(Pseudo Elements)。比如对一个连接访问后其字体显示方式,一个段落第一句话的颜色字体显示方式等时候我们就需要用到伪类和伪元素了。 定义 顾名思义,伪类和伪元素不是真正意义上的html存在的类和元素,

blog

建个人站的一些经历

个人博客总算搭起来,这个过程磕磕绊绊,遇到了很多问题,前后折腾了几周时间。 博客平台 我使用ghost做为博客平台,最开始是从一些技术资讯里了解到ghost,不同于wordpress的成熟老牌,ghost则刚刚创立不久,我没用过wordpress,但ghost简洁优雅的设计,支持markdown,以及对终端不同尺寸设备能够自适应的特性,让我毫不犹豫的选择了它。 域名 在网上了解了一下,国内的域名注册商大都不靠谱,且价格比外国同行普遍要贵,于是毅然选择了国外的godaddy(坑爹的中文谐音是狗爹),没有提供中文界面,但居然支持支付宝付款,了解到狗爹有进入过中国市场,因为政策原因最后退出这些陈年往事,就知道这么做的用意了。自己能想到的域名都被抢注了,剩下这个还过得去,于是65元到手。 VPS 之前有朋友做小项目时,使用过阿里云,感觉还不错,于是55元购买了一个月。

google

Google的生意经

传言 传言谷歌将要终结Nexus系列,作为一个Nexus设备的拥趸和使用者,我感到震惊。 Nexus品牌 我喜欢Android系统开放的特质,开放让Android在获得众多OEM支持得以疯狂成长之时,也伴随着体验上的参差不齐,系统碎片等成长的烦恼。Nexus设备便是Google用来引导和树立Android体验典范的系列产品。Nexus系列由Google指导设计,OEM代工生产,搭载最新的原生Android系统,以及最全面的Google服务。Android系统一代一代更新后渐入佳境,而Nexus也成长为一个举足轻重的品牌。每一代的Nexus设备都会引来粉丝的疯抢,许多旗舰手机的评测都会以当年的Nexus设备作为比对对象。 内在逻辑 而就是这么一个重要的品牌,可能终将被他的缔造者终结。我丝毫不怀疑传言的可能性,毕竟Google总是能做出出乎意料的事情,不管是Google Glass还是无人驾驶汽车,甚或是对摩托罗拉移动的收购,及至今天对摩托罗拉移动的出售等等。似乎每一件都惊世骇俗,但却都有着他内在的逻辑理念。 Google是一家籍由搜索和网络广告服务起家的公司,并且一直都专注在这两点之上。 Google所有的产品和服务都是以这两点为核心出发。更出色的搜索在给予用户精确结果的同时,

google

开源的力量

-----------移动互联网掀起一波又一波浪潮的今天,是开源这一伟大思想铸就了其坚实的基石。 什么是开源 开源这一概念最早是由个别黑客和极客提出和推崇的。这一概念旨在倡导开放软件源代码,并让软件可以免费自由使用和再创作。 随着这一思想的发展,衍生出诸多的开源协议如GPL、BSD、MIT等。值得注意的是,某些协议会有更严格的规定,比如对商用不友好等。但总的来说开源概念其开放传播的思想已经在颠覆传统软件开发模式,并深刻影响了我们这个时代。 开源如何成长并影响这个世界 最初我对开源有很多疑问,从某种粗略的层面上理解,开源意味着免费,那么: 开源软件的开发者如何谋生? 像Apache、Mozilla等闻名世界的开源组织和社区又是如何生存并强大的? 后来我了解到,作为开源软件开发者,他们有些有固定工作,只是在业余时间,凭着自己的兴趣和爱好去开发开源软件,并将其分享贡献出去,获得更多的认同。有些则受雇于开源社区和组织,有偿开发开源软件。还有甚者全职在自己的开源软件或产品上,