高性能
高性能
数据库读写分离根据读写分离的名字,我们就可以知道:读写分离主要是为了将对数据库的读写操作分散到不同的数据库节点上。 这样的话,就能够小幅提升写性能,大幅提升读性能。
读写分离对于提升数据库的并发非常有效,但是,同时也会引来一个问题:主库和从库的数据存在延迟,比如你写完主库之后,主库的数据同步到从库是需要时间的,这个时间差就导致了主库和从库的数据不一致性问题。这也就是我们经常说的 主从同步延迟 。
1.强制将读请求路由到主库处理。
2.延迟读取。
分库分表读写分离主要应对的是数据库读并发,没有解决数据库存储问题。试想一下:如果 MySQL 一张表的数据量过大怎么办?
答案之一就是 分库分表。
分库 就是将数据库中的数据分散到不同的数据库上。
下面这些操作都涉及到了分库:
你将数据库中的用户表和用户订单表分别放在两个不同的数据库。
由于用户表数据量太大,你对用户表进行了水平切分,然后将切分后的 2 张用户表分别放在两个不同的数据库。
分表 就是对单表的数据进行拆分,可以是垂直拆分,也可以是水平拆分。
何为垂直拆分?
简单来说,垂直拆分是对数据表列的拆分,把一张列比较多的表拆 ...
分布式系统概述
分布式系统概述
CAP理论
在理论计算机科学中,CAP定理(CAP theorem),又被称作布鲁尔定理(Brewer’s theorem),它指出对于一个分布式计算系统来说,不可能同时满足以下三点:
一致性(Consistency) (等同于所有节点访问同一份最新的数据副本)
可用性(Availability)(每次请求都能获取到非错的响应——但是不保证获取的数据为最新数据)
分区容错性(Partition tolerance)(以实际效果而言,分区相当于对通信的时限要求。系统如果不能在时限内达成数据一致性,就意味着发生了分区的情况,必须就当前操作在C和A之间做出选择)
根据定理,分布式系统只能满足三项中的两项而不可能满足全部三项[4]。理解CAP理论的最简单方式是想象两个节点分处分区两侧。允许至少一个节点更新状态会导致数据不一致,即丧失了C性质。如果为了保证数据一致性,将分区一侧的节点设置为不可用,那么又丧失了A性质。除非两个节点可以互相通信,才能既保证C又保证A,这又会导致丧失P性质。
不是所谓的“3 选 2”
大部分人解释这一定律时,常常简单的表述为:“一致性、可用性、分区 ...
SSM框架
SpingBootstarterStarter是Spring Boot中的一个非常重要的概念,Starter相当于模块,它能将模块所需的依赖整合起来并对模块内的Bean根据环境( 条件)进行自动配置。使用者只需要依赖相应功能的Starter,无需做过多的配置和依赖,Spring Boot就能自动扫描并加载相应的模块。
Spring Boot通过提供众多起步依赖(Starter)降低项目依赖的复杂度。起步依赖本质上是一个Maven项目对象模型(Project Object Model, POM),定义了对其他库的传递依赖,这些东西加在一起即支持某项功能。很多起步依赖的命名都暗示了它们提供的某种或某类功能。
实现一个Starter编写Starter非常简单,与编写一个普通的Spring Boot应用没有太大区别,总结如下:
12341.新建Maven项目,在项目的POM文件中定义使用的依赖;2.新建配置类,写好配置项和默认的配置值,指明配置项前缀;3.新建自动装配类,使用 @Configuration 和 @Bean 来进行自动装配;4.新建spring.factories文件,指定Sta ...
SpringCloud
微服务相关概念
微服务需要根据业务模块进行拆分,做到单一职责,不要重复开发
微服务可以将自己的服务暴露为接口,供其他服务使用
不同的微服务应该有不同的数据库
Spring Cloud简介Spring Cloud是一系列框架的有序集合。它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等,都可以用Spring Boot的开发风格做到一键启动和部署。Spring并没有重复制造轮子,它只是将目前各家公司开发的比较成熟、经得起实际考验的服务框架组合起来,通过Spring Boot风格进行再封装屏蔽掉了复杂的配置和实现原理,最终给开发者留出了一套简单易懂、易部署和易维护的分布式系统开发工具包。
核心成员Spring Cloud Netflix套件参考:Spring Cloud Netflix 中文文档 参考手册 中文版
Netflix Eureka
Eureka是Netflix开发的服务发现框架,本身是一个基于REST的服务,主要用于定位运行在AWS域中的中间层服务,以达到负载均衡和中间层服务故障转移的目 ...
RabbitMQ
RabbitMQAMQPAMQP是一种使用广泛的独立于语言的消息协议,它的全称是Advanced Message Queuing Protocol,即高级消息队列协议,它定义了一种二进制格式的消息流,任何编程语言都可以实现该协议。实际应用最广泛的AMQP服务器是使用Erlang编写的RabbitMQ。
在JMS中,有两种类型的消息通道:
点对点的Queue,即Producer发送消息到指定的Queue,接收方从Queue收取消息;
一对多的Topic,即Producer发送消息到指定的Topic,任意多个在线的接收方均可从Topic获得一份完整的消息副
但是AMQP协议比JMS要复杂一点,它只有Queue,没有Topic,并且引入了Exchange的概念。当Producer想要发送消息的时候,它将消息发送给Exchange,由Exchange将消息根据各种规则投递到一个或多个Queue:
1234567891011 ┌───────┐ ┌── ...
RPC-框架
什么是 RPC ?
RPC (Remote Procedure Call)即远程过程调用,是分布式系统常见的一种通信方法。它允许程序调用另一个地址空间(通常是共享网络的另一台机器上)的过程或函数,而不用程序员显式编码这个远程调用的细节。
RPC就是从一台机器(客户端)上通过参数传递的方式调用另一台机器(服务器)上的一个函数或方法(可以统称为服务)并得到返回的结果。
RPC会隐藏底层的通讯细节(不需要直接处理Socket通讯或Http通讯)。
客户端发起请求,服务器返回响应(类似于Http的工作方式)RPC在使用形式上像调用本地函数(或方法)一样去调用远程的函数(或方法)。
最终解决的问题:让分布式或者微服务系统中不同服务之间的调用(远程调用)像本地调用一样简单!调用者感知不到远程调用的逻辑。为此rpc需要解决三个问题(实现的关键):
Call ID映射。我们怎么告诉远程机器(注册中心)我们要调用哪个函数呢?
序列化和反序列化。客户端怎么把参数值传给远程的函数呢?
数据网络传输。远程调用往往是基于网络的,客户端和服务端是通过网络连接的。所有的数据都需要通过网络传输,因此就需要有一个 ...
Java基础
java基础参考:JournalDev - Java, Java EE, Android, Python, Web Development Tutorials
new 的过程Object o=new Object();
首先JVM会启动,你的代码会编译成一个.class文件,然后被类加载器加载进jvm的内存中,你的类Object加载到方法区中,创建了Object类的class对象到堆中,注意这个不是new出来的对象,而是类的类型对象,每个类只有一个class对象,作为方法区类的数据结构的接口。jvm创建对象前,会先检查类是否加载,寻找类对应的class对象,若加载好,则为你的对象分配内存,初始化也就是代码:new Object()。
类加载的过程
1、Loading(加载)”加载“是”类加机制”的第一个过程,在加载阶段,虚拟机主要完成三件事:(1)通过一个类的全限定名来获取其定义的二进制字节流。(2)将这个字节流所代表的的静态存储结构转化为方法区的运行时数据结构。(3)在堆中生成一个代表这个类的Class对象,作为方法区中这些数据的访问入口。
相对于类加载的其他阶段而言,加 ...
redis
Redis简介Redis 与其他 key - value 缓存产品有以下三个特点:
Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。
Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。
Redis支持数据的备份,即master-slave模式的数据备份。
Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)。
五种数据类型
String类型string 是 redis 最基本的类型,你可以理解成与 Memcached 一模一样的类型,一个 key 对应一个 value。string 类型是二进制安全的。意思是 redis 的 string 可以包含任何数据。比如jpg图片或者序列化的对象。string 类型是 Redis 最基本的数据类型,string 类型的值最大能存储 512MB。String的数据结构为简单动态字符串(Simple Dynamic String,缩写SDS ...
LeetCode
单调栈Next Greater Number I
给你⼀个数组,返回⼀个等 ⻓的数组,对应索引存储着下⼀个更⼤元素,如果没有更⼤的元素,就存 -1。
123456789101112131415class Solution {public: vector<int> nextGreaterElements(vector<int>& nums) { vector<int> res(nums.size()); stack<int> stk; for(int i=nums.size()-1;i>=0;i--){ while(!stk.empty()&&stk.top()<=nums[i]){ //将栈中大小比此元素更小的元素pop掉 s.pop(); } res[i]=stk.empty() ? -1 : stk. ...
计算机基础
计算机网络七层模型解释及其相关的协议?
物理层:主要任务就是确定与传输媒体接口有关的一些特性,如机械特性,电气特性,功能特性,过程特性。实现相邻计算机节点之间比特流的透明传送,尽可能屏蔽掉具体传输介质和物理设备的差异。相关协议:USB,Etherloop
数据链路层:物理寻址,将网络层交下来的 IP 数据报组装成帧,在两个相邻节点间的链路上传送帧。每一帧包括数据和必要的控制信息(如同步信息,地址信息,差错控制等)。相关协议: CSMA/CD协议,点对点协议
网络层:为分组交换网上的不同主机提供通信服务。在发送数据时,网络层把运输层产生的报文段或用户数据报封装成分组和包进行传送。另一个任务是路由选择,使源主机运输层所传下来的分组,能通过网络层中的路由器找到目的主机。OSPF,EGP,BGP,ICMP,IP
传输层:负责向两台终端设备进程之间的通信提供通用的数据传输服务。应用进程利用该服务传送应用层报文。“通用的”是指并不针对某一个特定的网络应用,而是多种应用可以使用同一个运输层服务。TCP,UDP
会话层:在不同机器上的用户之间管理会话。SSL,TLS 协议。
表示层:信息 ...