在十几二十年年前,那时候的服务器性能不高内存都比较小,在一台服务器只能部署一个程序,顶多在加个数据库。
现在随着服务器的CPU核心数越来越多,内存越来越大,如果只在一台服务器上只部署一个应用程序,显然对资源的利用率就很低。所以会在一台服务器上部署多个程序。下图中结构A就是多个程序部署在一台服务器上。
在十几二十年年前,那时候的服务器性能不高内存都比较小,在一台服务器只能部署一个程序,顶多在加个数据库。
现在随着服务器的CPU核心数越来越多,内存越来越大,如果只在一台服务器上只部署一个应用程序,显然对资源的利用率就很低。所以会在一台服务器上部署多个程序。下图中结构A就是多个程序部署在一台服务器上。
分而治之,一直是一个非常有效的处理大量数据的的方法。著名的MapReduce也是采取了分而治之的思想。简单来说,就是如果要处理10000个数据,用单线程一个一个遍历处理数据,效率肯定是很低的。但如果这1万个数据,分成10分,交给10个线程并行处理(线程数取决于CPU数量),这样就可以大大的提高处理效率。Fork/Join正式这样一个专为并行计算的框架。
缓存雪崩一般形容的是,高并发环境中,某一个数据,因为缓存过期,读不到数据而从数据库读取,一下子大量请求堆积到了数据库上。而数据库的并发能力有限,最终导致获取不到数据库连接,读不了数据库。
Codis 3.x相比2.x还是有所区别,Codis 3.x由以下组件组成:
无需安装直接解压
设置环境变量
检测是否安装成功
面向对象设计模式有个原则叫“开闭原则”,就是对于扩展是开放的,对于修改是关闭的,这意味着模块的行为是可以扩展的,对模块行为进行扩展时,不必改动模块的源代码或者二进制代码。
代理(Proxy)设计模式中的一种,就是为一个对象创建一个替身,提供了对目标对象另外的访问方式;即通过代理对象访问目标对象.这样做的好处是:可以在目标对象实现的基础上,增强额外的功能操作,而不用修改原始类的代码。
在早期的 C/C++时代,垃圾回收基本上是手工进行的。开发人员可以使用new关键字进行内存申请,并使用delete关键字进行内存释放,而Java虚拟机直接提供了一套全自动内存管理方案。
在Java内存运行时区域的各个部分,其中程序计数器、虚拟机栈、本地方法栈3个区域随线程而生随线程而灭。每一个栈帧中分配多少内存基本上是在类结构确定下来时就已知的, 因此这几个区域的内存分配和回收都具备确定性,就不需要过多考虑回收的问题。 而 Java堆和方法区则不一样,一个接口中的多个实现类需要的内存可能不一样,一个方法中的多个分支需要的内存也可能不一样,我们只有在程序处于运行期间时才能知道会创建哪些对象,这部分内存的分配和回收都是动态的。
Java虚拟机在执行 Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域。这些区域都有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的启动而存在,有些区域则依赖用户线程的启动和结束而建立和销毁。 Java虚拟机所管理的内存将会包括以下几个运行时数据区域:
Stream的使用一般包括三件事:
流的流水线背后的理念类似于构建器模式。 在构建器模式中有一个调用链用来设置一套配置(对流来说这就是一个中间操作链),接着是调用built方法(对流来说就是终端操作)
java.util.stream
是Java 8 新引入的API,它有别于Java中的I/O Stream,I/O流是Java程序与外部数据输入和输出,例如从文件、网络的读写数据流。而Java8中的Stream它主要是针对集合的操作。
集合是Java中使用最多的API,除了往集合里添加、删除数据,很多业务逻辑都涉及类似于数据库的操作,比如对数据按照类别进行分组、筛选和转换。一般可能是用迭代器直接遍历整个集合,一个一个的处理每一个数据元素。但如果这个集合非常大要是要处理大量元素又该怎么办呢?为了提高性能,需要并行处理,并利用多核架构。但写并行代码比用迭代器还要复杂,而且调试起来也够受的。
为了程序设计得更轻松一点,节约宝贵时间,Java 8就提供大量数据处理的Stream实现。