Redis 缓存数据库
为什么要用 Nosql
1、单机 MySQL 的年代!
90 年代,一个基本的网站访问量一般不会太大,单个数据库完全足够!
那个时候,更多的去使用静态网页 HTML ==> 服务器根本没有太大的压力!
思考一下,这种情况下:整个网站的瓶颈是什么?
数据量如果太大,一个机器放不下了!
数据的索引( B + Tree),一个机器内存也放不下
访问量(读写混合),一个服务器承受不了
只要你开始出现以上的三种情况之一,那么你就必须晋级!
2、Memcached(缓存)+ MySQL + 垂直拆分(读写分离)
网站 80%的情况都是在读,每次都要去查询数据库的话就十分的麻烦!所以说我们希望减轻数据库的压力,我们可以使用缓存来保证效率!
发展过程:优化数据结构和索引 –> 文件缓存(IO)–> Memcached(当时最热门的技术!)
3、分库分表 + 水平拆分 + MySQL 集群
技术和业务在发展的同时,对人的要求也越来越高!
==本质:数据库(读、写)==
早些年 MyISAM:表锁,十分影响效率!高并发下就会出现严重的锁问题
转战 Innodb:行锁
慢慢 ...
JUC 并发编程
什么是 JUC
JUC 是 java.util.concurrent 的简写。在 jdk 官方手册中可以看到 juc 相关的 jar 包有三个。
用中文概括一下,JUC 的意思就是 java 并发编程工具包
线程和进程
如果不能使用一句话说出来的技术,不扎实!
进程:一个程序,QQ.exe Music.exe 程序的集合
一个进程往往可以包含多个线程,至少包含一个!
Java 默认有几个线程? 2 个 main、GC
线程:线程是程序执行中一个单一的顺序控制流程
对于 Java 而言:Thread、Runnable、Callable
Java 真的可以开启线程吗? 开不了
123456789101112131415161718192021222324252627282930313233public synchronized void start() { /** * This method is not invoked for the main method thread or "system" * group ...
JVM 理论探究
请你谈谈你对 JVM 的理解,Java8 虚拟机和之前的变化更新?
什么是 OOM,什么是栈溢出 StackOverFlowError?怎么分析?
JVM 常用调优参数有哪些?
内存快照如何抓取,怎么分析 Dump 文件?
谈谈 JVM 中,类加载器你的认识?
JVM 的位置
JVM 的体系结构
百分之 99 的 JVM 调优都是在堆中调优,Java 栈、本地方法栈、程序计数器是不会有垃圾存在的。
类加载器作用:加载 Class 文件~
虚拟机自带的加载器
启动类(根)加载器
扩展类加载器
应用程序(系统类)加载器
双清委派机制
沙箱安全机制Java 安全模型的核心就是 Java 沙箱(sandbox)
什么是沙箱?沙箱是一个限制程序运行的环境。沙箱机制就是将 Java 代码限定在虚拟机(JVM)特定的运行范围中,并且严格限制代码对本地系统资源访问,通过这样的措施来保证对代码的有效隔离,防止对本地系统造成破坏。
沙箱主要限制系统资源访问,那系统资源包括什么? CPU、内存、文件系统、网络。不同级别的沙箱对这些资源访问的限制也可以不一样。
所有的 Java 程序运行都可以指定沙 ...
ElasticSearch 的概述和使用
ElasticSearch 概述Elaticsearch,简称为 es, es 是一个开源的高扩展的分布式全文检索引擎,它可以近乎实时的存储、检索数据;本身扩展性很好,可以扩展到上百台服务器,处理 PB 级别(大数据时代)的数据。es 也使用 Java 开发并使用 Lucene 作为其核心来实现所有索引和搜索的功能,但是它的目的是通过简单的RESTful API来隐藏 Lucene 的复杂性,从而让全文搜索变得简单。
据国际权威的数据库产品评测机构 DB Engines 的统计,在 2016 年 1 月,ElasticSearch 已超过 Solr 等,成为排名第一的搜索引擎类应用。
ES 和 solr 的差别Elasticsearch 简介Elasticsearch 是一个实时分布式搜索和分析引擎。它让你以前所未有的速度处理大数据成为可能。
它用于全文搜索、结构化搜索、分析以及将这三者混合使用:
维基百科使用 Elasticsearch 提供全文搜索并高亮关键字,以及输入实时搜索(search-asyou-type)和搜索纠错(did-you-mean)等搜索建议功能。
英国卫报使用 ...
RabbitMQ 消息队列
什么是 MQ消息队列(Message Queue,简称 MQ),从字面意思上看,本质是个队列,FIFO 先入先出,只不过队列中存放的内容是 message 而已。其主要用途:不同进程 Process/线程 Thread 之间通信。
为什么会产生消息队列?有几个原因:
不同进程(process)之间传递消息时,两个进程之间耦合程度过高,改动一个进程,引发必须修改另一个进程,为了隔离这两个进程,在两进程间抽离出一层(一个模块),所有两进程之间传递的消息,都必须通过消息队列来传递,单独修改某一个进程,不会影响另一个;
不同进程(process)之间传递消息时,为了实现标准化,将消息的格式规范化了,并且,某一个进程接受的消息太多,一下子无法处理完,并且也有先后顺序,必须对收到的消息进行排队,因此诞生了事实上的消息队列;
RabbitMQ
RabbitMQ 简介
开发语言:Erlang - 面向并发的编程语言
AMQP 协议
学习五种队列
RabbitMQ 的第一个程序第一种模型(直连)
P:生产者:也就是要发送消息的程序
C:消费者:消息的接受者,会一直等待消息的到来
qu ...
Java 多线程与线程同步
多线程Process 与 Thread(进程与线程)
说起进程,就不得不说下程序。程序是指令和数据的有序集合,其本身没有任何运行的含义,是一个静态的概念。
而进程则是执行程序的一次执行过程,它是一个动态的概念。是系统资源分配的单位。
通常在一个进程中可以包含若干个线程,当然一个进程中至少有一个线程,不然没有存在的意义。线程是CPU调度和执行的单位。
多线程核心概念
线程就是独立的执行路径;
在程序运行时,就是没有自己创建线程,后台也会有多个线程,如主线程、gc线程;
main()线程称之为主线程,为系统的入口,用于执行整个程序;
在一个进程中,如果开辟了多个线程,线程的运行由调度器安排调度,调度器是与操作系统紧密相关的,先后顺序是不能人为干预的;
对同一份资源操作时,会存在资 源抢占问题,需要加入并发控制;
线程会带来额外的开销,如CPU调度时间,并发控制开销;
每个线程在自己的工作内存交互,内存控制不当会造成数据不一致;
线程创建共有三种方式:Thread、Runnable、Callable
Thread.class -> 继承Thread类(重点)
Runnable接口 ...
分布式系统理论
什么是分布式系统?分布式是若干独立计算机的集合,这些计算机对于用户来说就像单个相关系统。
分布式系统是由一组通过网络进行通信、为了完成共同的任务而协调工作的计算机节点组成的系统。分布式系统的出现是为了用廉价的、普通的机器完成单个计算机无法完成的计算、存储任务。其目的是利用更多的机器,处理更多的数据。
首先需要明确的是,只有当单个节点的处理能力无法满足日益增长的计算、存储任务的时候,且硬件的提升(加内存、加磁盘、使用更好的 CPU)高昂到得不偿失的时候,应用程序也不能进一步优化的时候,我们才需要考虑分布式系统。因为,分布式系统要解决的问题本身就是和单机系统一样的,而由于分布式系统多节点、通过网络通信的拓扑结构,会引入很多单机系统没有的问题,为了解决这些问题又会引入更多的机制、协议,带来更多的问题。
Dubbo 文档随着互联网的发展,网站应用的规模不断扩大,常规的垂直应用架构已无法应对,分布式服务架构以及流动计算架构势在必行,急需一个治理系统确保架构有条不紊的演进。
在 Dubbo 的官网文档有这样一张图
单一应用架构当网站流量很小时,只需一个应用,将所有功能都部署在一起,以减少部署节点 ...
Java 中的位运算
前言日常开发中位运算不是很常用,但是巧妙的使用位运算可以大量减少运行开销,优化算法。
位运算符Java支持的位运算有7种,具体如下:
&:按位与。
|:按位或。
~:按位非。
^:按位异或。
<<:左位移运算符。
>>:右位移运算符。
<<<:无符号右移运算符。
按位与(&)按位与的运算规则
操作数1
0
0
1
1
操作数2
0
1
0
1
按位与
0
0
0
1
规则总结:只有两个操作数对应位同为1时,结果为1,其余全为0(或者是只要有一个操作数为0,结果就为0)
举例:
按位或(|)按位或的运算规则
操作数1
0
0
1
1
操作数2
0
1
0
1
按位或
0
1
1
1
规则总结:只有两个操作数对应位同为0时,结果为0,其余全为1(或者是只要有一个操作数为1,结果就为1)
按位非(~)按位非的运算规则
操作数
0
1
按位或
1
0
规则总结:取反操作,在求负数的源码中使用过
按位异或(^)按位异或的运算规则
操作数1
0
0
1
1
操作数 ...
Java 中的注解与反射
注解java.Annotation
什么是注解?
Annotation 是从 JDK5.0 引入的新技术
Annotation 的作用:
不是程序本身,可以对程序作出解释
可以被其他程序(比如编译器等)读取
Annotation 的格式:
注解是以“@注释名”在代码中存在的,还可以添加一些参数值
Annotation 在哪里使用?
可以附加在 package、class、method、field 等上面,相当于给他们添加了额外的辅助信息,我们可以通过反射机制编程实现对这些元数据的访问
内置注解
@Override:定义在 java.lang.Override 中,此注释只适用于修辞方法,表示一个方法声明打算重写超类中的另一个方法声明。
@Deprecated:此注释可以用于修辞方法,属性,类,表示不鼓励程序员使用这样的元素,通常是因为它很危险或者存在更好的选择。
@SuppressWarning:用来抑制编译时的警告信息。
元注解
元注解的作用就是负责注解其他注解。Java 定义了 4 个标准的 meta-annotation 类型,他们用来提供对其他 annotati ...
Java 中的 IO 流
一、前言Java的I/O主要的用途就是文件数据的读写、数据的网络发送与接收等场合。
流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象。即数据在两设备间的传输称之为流,流的本质是数据传输,根据数据传输特性将流抽象为各种类,方便更直观的进行数据操作。对于文件内容的操作主要分为两大类:字符流和字节流。
二、I/O 流的分类根据处理数据类型的不同分为:字符流和字节流。
根据数据流向不同分为:输入流和输出流。
1、字符流和字节流字符流的由来:因为数据编码的不同,而有了对字符进行高效操作的流对象。本质其实就是基于字节流流读取时,去查了指定的码表。字节流和字符流的区别:
读写单位不同:字节流以字节(8bit)为单位,字符流以字符为单位,根据码表映射字符,一次可能多个字节。
处理对象不同:字节流能处理所有类型的数据(如图片、avi等),而字符流只能处理字符类型的数据。
字节流在操作的时候本身是不会用到缓冲区的,是文件本事的直接操作的;而字符流在操作的时候下后是会用到缓冲区的,通过缓冲区来操作文件。
结论:优先选用字节流。首先因为硬盘上的所有文件都是以字节的形式进行传输或者保存的, ...