自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(111)
  • 收藏
  • 关注

原创 http基础篇(二)协议分层

http基础篇(二)TCP/IP 协议分层(四层)链路层网际层/网络互联层传输层应用层OSI 网络分层模型(七层)物理层数据链路层网络层传输层会话层表示层应用层对比四层的优势四层负载均衡 OR 七层负载均衡TCP/IP 协议栈的工作方式TCP/IP 协议分层(四层)注:括号内为传输单位层层相扣,每一层都需要下层的支撑,也为上层提供着支撑。链路层负责给以太网、WIFI等底层网络发送原始的数据包,工作在网卡,使用MAC地址标记网络上的设备,所以有时候也会成为MAC层。网际层/网络互联层IP协议处

2021-07-02 18:07:39 754 2

原创 http基础篇(一)名词解释

httphttp的发展httphttp的发展http 0.9 简单的文本协议http 1.0 确定了目前使用的大部分技术,但非标准http 1.1 目前使用最广泛的协议,功能比较完善http 2.0 优化了性能等,尚未普及http 3.0 后续的发展方向http超文本 + 传输 + 协议HyperText Transfer Protocol协议:大家共同约定遵守的。http是计算机世界里的一个协议,它使用计算机能够理解的语言确立了一种计算机之间交流通信的规范,以及相关的各种控制和错误处理

2021-07-02 14:49:01 1576

原创 MySQL索引

前言1. 表的索引越全越好,对吗?不是的2.为什么不要在性别字段上建立索引?就只有男和女,效果相当于全量扫描了、3. 为什么不建议使用身份证做为主键?太长了4. 模糊匹配 like abc%,都用不到索引是吗?5. 不要使用select *, 写明具体查询字段,为什么?索引数据库索引,是数据库管理系统中的一个排序的数据结构,以协助快速查询、更新数据库表中数据。可以理解为“目录”单列索引、联合索引索引类型normal 普通索引unique 唯一索引primary 主键索引 不唯

2021-05-26 20:41:26 180

原创 MySQL架构

MySQL架构1. mysql语句的执行流程(1)、客户端与服务端连接3306客户端与服务端连接通信类型:同步/异步连接方式:长连接/短连接协议:TCP/Unix Socket单进程/多线程。服务端查看连接了多少客户端show global status like ‘Thread%’;Threads_cached:缓存的线程数Threads_connected:正在使用的连接数Threads_created:为了连接创建的线程数Threads_running:当前并发的连接数

2021-03-31 22:23:17 152 2

原创 并发编程-线程池详解(ThreadPoolExecutor源码分析)

线程池详解一、为什么要有线程池?当只有线程的时候,会有几个很明显的缺点:1、来一个任务创建一个线程,线程创建的数量不可控;2、频繁的创建和销毁线程,会消耗很多资源;所以,就有了”线程池“。它的优势:1、限流 -> 控制线程数量2、降低频繁创建和销毁线程3、对于任务的响应速度更快(不再需要创建线程,而是复用已有的线程,所以就更快啦)二、JAVA中提供的线程池Executo...

2020-07-14 09:36:24 385

原创 并发编程 - Java线程的一大堆

一、通用的线程生命周期1、初始状态:线程被创建,但是还允许被分配cpu执行。2、可运行状态:线程可以分配cpu执行。3、运行状态:线程正在被cpu执行。4、休眠状态:运行的时候,如果被阻塞或者等待某个事件,就会从运行状态转为休眠状态,同时释放cpu资源,如果等到了事件,则会转为可运行状态;5、结束状态:线程运行完成或者出现异常。二、通用的线程生命周期...

2020-07-12 19:14:25 140

原创 并发编程 - 等待/通知机制

一、为啥需要等待 - 通知机制假设线程没拿到锁,一直循环尝试去获取锁,这样效率是很低的,如果有通知机制,那么得到通知了,再执行即可。二、何为等待 - 通知医院就医顺序:1、患者挂号,等待叫号。 (等锁)2、患者被叫号,医生诊治。 (拿到锁)3、医生问诊,开检查单。(线程缺少执行条件,释放锁)4、患者检查完,重新等待叫号。(重新尝试拿锁)5、患者被叫好,医生诊治。(拿锁-执行)三、如何实现等待 - 通知?synchronized 配合wait(),notify(),notifyAll()

2020-07-08 09:23:21 150

原创 并发编程 - 死锁如何处理

一、死锁是个啥?关于银行转账问题,a转给b,c转给d,涉及到两个用户,那么是否可以拿两把锁来操作呢?如下:这种骚操作就可能引起死锁哦。 如下:

2020-07-07 21:01:19 195

原创 并发编程 - 互斥锁synchronized

一、如何解决原子性问题?原子性问题的产生原因是“线程切换”,那么只要禁止线程切换就可以避免原子性问题,不管是单核还是多核cpu,都必须禁止同一时刻只有一个线程在执行。二、锁锁的含义:保护需要保护的资源三、synchronized(同步锁/互斥锁)java编译器会在synchronized修饰的代码前后加上加锁和解锁的功能。3.1 修饰普通方法 = 锁住当前实例示例:多个线程同时访问同一同步方法,则串行执行,即一个线程执行完,才会轮到下一个线程。public class Synchroniz

2020-07-05 22:37:58 273

原创 并发编程 - Happens-before

一、Happens-beforeHappens-before: 前面的操作结果对后续操作是可见的。要求编译器的优化必须遵许Happens-before原则二、Happens-before 六大原则2.1 程序的顺序性原则单线程中,某一个变量的修改对后续的操作一定是可见的。如下所示的程序中,第1句和第2句的顺序编译器可以调换(不影响程序结果),但是1和2必须要在3之前执行完成才可以哦(3有volatile关键字)。public class Test { volatile static i

2020-07-03 22:13:56 133

原创 并发编程 - 可见性,原子性和有序性问题

并发一、并发的根源cpu、内存、I/O设备 三者的速度差异二、并发带来的问题2.1 缓存导致的可见性可见性:一个线程对共享变量的修改,另一个线程可以立马看到,称为“可见性”(你的修改我能看见)。2.2 线程切换带来的原子性问题把一个或者多个操作在cpu执行过程中不被中断的特性称为“原子性”(原子哦,不可切割)。非原子性操作:2.3 编译优化带来的有序性问题编译器为了优化性能,可能会调整指令顺序哦。public class Singleton { static Singleton

2020-07-02 21:37:40 124

原创 mysql读写分离,主从复制,主从延迟

一、mysql读写分离为了提升数据库的性能,一般会采用读写分离,即写请求去主库,读请求去从库。二、mysql主从复制从库读binlog日志,写relay日志,操作数据都是串行执行的。所以从库的数据比主库晚一些执行,主从复制是有延迟的。主库的写并发达到1000/s时,从延迟几ms;主库的写并发达到2000/s时,从延迟几十ms;主库的写并发达到4000/s以上,从延迟几s;三、mysql主从延迟...

2020-06-11 21:10:35 209

原创 如何生成分库分表的全局id?

如何动态扩容缩容分库分表第一种,停机扩容参考单库到多库的迁移方案。缺点:分库分表 迁移到 分库分表,旧的数据量已经很大了,这个方案很不靠谱哟。第二种

2020-06-09 21:00:09 187

原创 分库分表的中间件和迁移方案

分库分表一、为什么要分库分表单机mysql带来的问题:1、mysql单机,扛不住并发2、mysql单机磁盘容量快满3、mysql单表数据量太大,sql执行越跑越慢利用分库分表将单机拆分成多机,带来的好处。1、可承受的并发增加数倍;2、磁盘容量增加数倍,使用率降低;3、单表数据量缩小,sql语句执行速度加快。二、分库分表的中间件数据库中间件:用来做数据的分发。有两种:proxy类和client类cobar、TDDL、sharding-jdbc、atlas、mycat。cobar

2020-05-30 19:18:28 953

原创 认识分布式系统

分布式系统1、分布式系统是什么?多个系统一起组成分布式系统,各个系统之间互相调用。2、为什么要做系统拆分?系统不做拆分,代码量会很大,很多人一起维护代码,难以维护,上线复杂。拆分之后,每个人只维护自己的系统和服务,大大减少了代码冲突,上线也只需要测试自己的部分即可,想用新技术也不怕影响其他代码。3、如何进行系统拆分?根据系统功能进行拆分,比如风控系统,拆成了交易系统,授信系统,审核系统,催收系统等等,然后每个工程再自行拆分。如催收系统再分成 核心系统,催收活动系统,催收后台管理系统等等。4、

2020-05-20 22:04:19 128

原创 redis的并发竞争

redis的并发竞争redis的并发竞争问题是什么?某个时刻,多个系统实例都去更新key。如何解决redis的并发竞争问题?增加zookeeper分布式锁和时间戳,来保证后者不会被覆盖。

2020-05-20 21:15:16 137

原创 redis-保证和数据库的一致性

如何保证redis和数据库的一致性?cache Aside pattern读取的时候,先从缓存读,读不到就读数据库,然后取出数据之后写入到缓存;更新的时候,先删除缓存,再更新数据库。为啥不是更新缓存?如果缓存的计算逻辑比较复杂(比如要关联表计算什么的),而且写的频率大于读的频率,那么更新缓存就不是很划算啦。为什么要先删除缓存,在更新数据库?如果先更新数据库,再删除缓存,那么如果删除失败了,就会导致缓存里是旧数据,数据库里是新数据。如果删了缓存,更新数据库失败了,那么也无非是多更新一次缓存。

2020-05-16 18:48:38 666

原创 redis的雪崩和穿透,情况描述及解决方案

redis的雪崩和穿透1、redis的雪崩发生的现象?原本,缓存可以消化很多请求,使得这些请求不用到达数据库,降低db负载。但是,如果缓存宕机了,所有请求将全部到达数据,数据库扛不住的话,会直接崩溃。2、如何处理缓存雪崩?首先,redis必须是高可用的,主从模式,哨兵,redis cluster等,避免全盘崩溃。其次,不单单只有redis这一级缓存,可以多做一些,比如在系统内部增加ehcache。(1、业务发送请求;2、先查本地的ehcache缓存;3、如果没有,查redis;4、如果还没有

2020-05-16 17:20:17 255

原创 redis cluster 的集群模式

redis的集群模式一、单机redis的存储瓶颈问题。master和slave存储的数据量是一模一样的,如果master只能存储32g,那么这个模式下,一共也只能存储32g数据。二、如何突破单机瓶颈问题,让redis支持海量数据。建立多个master,每个master上存放部分数据,那么总容量就等于master容量之和。三、redis的集群架构 - redis clustercluster - 支撑n个master node,每个master node都可以挂载多个slave node。读

2020-05-16 14:51:37 266

原创 分布式缓存redis(持久化) - 大总结3

redis的持久化一、为什么redis需要持久化?redis持久化的意义,主要在于故障恢复。如果redis宕机了,被重启,如果不进行持久化,那么所有的数据将会丢失,造成大型故障。持久化,把数据存到磁盘上,然后从磁盘里备份一份到阿里云等云存储服务上,如遇机器宕机,可以保证不会丢掉所有数据。二、redis的持久化有哪几种方式?RDB:对redis里面的数据进行周期性的持久化。每隔一段时间,...

2020-05-07 21:29:04 174

原创 分布式缓存redis(主从复制+哨兵) - 大总结2

redis灵魂拷问1:如何保证redis高并发/支撑10万+的并发,应该怎么做?单机redis,能够承载的QPS大概在上万到几万不等。如果是十几万,就不行啦。方案:用主从模式实现读写分离。一般来说,对于缓存,都是读的高并发,写是比较少的。架构是主从架构,一主多从,主负责写,并把数据同步复制到其他的slave节点,slave节点只负责读。如果读的请求量增加,继续增加redis slave...

2020-05-05 02:05:13 463

原创 分布式缓存redis(基础+线程模型+过期策略) - 大总结1

分布式缓存 - 大总结灵魂拷问一:在项目中如何使用缓存的?第一种场景,需要缓存要查询用户的历史订单,请求接口剧多,如果实时去请求的话,接口超时。第二种场景,分布式缓存锁,用户参加了a活动就不能参加b活动,防止并发,所以要用到分布式缓存锁。灵魂拷问二:为啥要使用缓存呢?(1) 高性能多个用户请求同一份数据,每一份查询都耗时很久。可以把这份数据放在缓存里,这样第一次查询从数据库查,其余...

2020-05-04 23:17:37 374

原创 分布式搜索引擎 - 大总结

分布式搜索引擎 elasticSearch了解lucenelucene:全文检索和搜索的开放源码程序倒排索引:根据单词快速获取包含这个单词的文档列表全文检索:以文本作为检索对象,指出含有指定词汇的文本...

2020-05-01 21:34:44 1287

原创 消息队列 - 大总结

消息队列 - 大总结灵魂拷问1 为什么要用消息队列呀?答:如下图所示,外呼系统需要将外呼结果发送给业务系统,如果采用rpc的调用方式;则带来的后果,首先,1、外呼系统与业务系统严重耦合,多个业务系统需要外呼系统传输数据,如果有接口调用的方式,那无论是接入新的业务还是撤掉业务,都需要改动代码;2、如果业务系统挂掉/访问超时,要保证不能影响其他业务系统;所以:需要利用消息队列解耦,这...

2020-04-25 21:04:08 2234

原创 并发编程 - Lock的通信方式Condition的使用和源码解析

Condition的使用和原理Lock的通信方式:conditionCondition的使用ConditionWaitpublic class ConditionWait implements Runnable{ private Lock lock; private Condition condition; public ConditionWait(Lock l...

2019-08-31 22:03:12 370 1

原创 并发编程 - 重入锁以及AQS源码

一、J.U.C简介Java.util.concurrent 并发工具包,包括线程池、阻塞队列、计时器、同步器、并发集合等;二、Lock的基本应用J.U.C的核心组件。三、ReentrantLock重入锁四、AQS原理分析五、AQS源码分析...

2019-08-31 18:46:05 373

原创 并发编程 - volatile关键字底层详解

一、volatile能干什么?如下所示的代码里,有t1线程和主线程,主线程改变了stop的值,但是t1线程并不知道,一直在执行。public class Test { public static boolean stop = false; public static void main(String[] args) throws InterruptedException { ...

2019-08-25 20:28:50 466

原创 并发编程 - 对象的wait / notify方法实现线程的通信机制

例如常见的生产者 - 消费者 模式:一边生产,一边消费。需要线程之间的通信,就可以利用wait / notify方法来实现。object.wait() 和 object.notify()wait的作用:1、实现线程的阻塞;2、会释放当前的同步锁notify的作用:唤醒一个被阻塞的线程;notifyAll的作用:唤醒所有被阻塞的线程,再去重新竞争。代码demo:/** * @descr...

2019-07-28 21:02:20 391

原创 并发编程 - 偏向锁、轻量级锁、重量级锁的升级

线程安全 & 线程不安全线程不安全: 多个线程同时去访问一块共享资源,会出现数据不一致的问题。demo:public class AtomicDemo { private static int count = 0; public static void incr(){ try { Thread.sleep(1); ...

2019-07-28 20:03:49 461 1

原创 20190722 - Java垃圾回收详解

一、什么是垃圾回收垃圾回收(Garbage Collection,GC):释放垃圾占用的空间,防止内存泄漏。对内存堆中已经死亡的或者长时间没有使用的对象进行清除和回收。GC并不是Java的专利,它的历史比Java更久远哦~二、什么样的就算垃圾呢2.1 引用计数算法参考链接:https://mp.weixin.qq.com/s?__biz=MjM5ODI5Njc2MA==&mid=2...

2019-07-23 21:34:37 123

原创 20190719 - 服务调用大全

一、服务的三要素一个网络服务主要包括以下三个要素:地址: 调用方需要根据地质访问网络。IP地址、服务端口、服务协议;协议格式: 协议都有哪些字段协议名称: 或者叫协议类型,用协议类型(名称)区分不同的网络接口。服务调用的寻址过程如下:名词解释:服务实例: 服务对应的IP地址加端口的简称。服务注册: 某个服务实例宣称自己提供了哪些服务,即某个IP地址+端口都提供了哪些服务接口。服...

2019-07-22 22:02:48 409

原创 20190718 - 微服务划分

微服务是一个很抽象的概念,它的划分更是抽象。划分的粒度太粗,服务太重;划分的粒度太细,在分布式系统中会让开发、测试、部署和运维都变得极其困难。所以,应该如何划分呢?一、要遵守两个原则1、单一职责把因相同原因变化的东西聚合在一起,需要调整的类也都放在一起;2、自治原则满足资源隔离,每个服务的数据私有。二、大佬们的拆分思想1、第一种拆分1.1 纵向拆分从业务维度拆分,关联紧密的...

2019-07-19 10:17:09 223

原创 并发编程 - 线程基础篇

一、并发的发展历史1、真空管 / 穿孔打卡工作流:把程序写在纸上,打成卡片,把卡片的程序输入到计算机上,电脑运行出结果打印到打印机上。最大的问题,计算机在等程序输入的时候,会处于空闲状态。2、晶体管 / 批处理操作系统工作流:把程序写在卡片上,读入到磁盘机上,电脑通过读取磁盘机上的内容进行运行,将结果输入到打印机上。解决了计算机空闲问题,计算机会一直处于运行状态。带来的问题:IO问题...

2019-07-17 21:50:24 144

原创 网关2 - 网关如何调用API

什么是APIAPI --> 官方解释:应用编程接口。首先,它是一个接口,其次它基于应用,并且它是可编程的。API 的生命周期1、设计(方法名 + 入参 + 出参)名字:可以解释接口功能,见文知意;入参:不要公开不合理的参数;出参:错误码明确;2、构建(编写内部逻辑):注意,进入方法先判参;3、文档:接口的注释和接口文档写清楚;4、测试:测试接口是否满足功能;5、分享:即...

2019-07-17 19:52:45 3054

原创 网关1 - 认识网关

网关是个啥?将所有API调用统一接入网关,由网关负责接入和输出。为啥需要网关(API gateway)?首先,单体应用时代,也就是把所有服务写在一个应用里,部署在同一个tomcat上,辣么,是不需要网关的。接着,业务越做越大,单体应用已经不满足需求了,这时候,微服务就出现了,也就是把原来集中于一体的应用分离开来,进行功能拆分,实现单独发布,运维等。这时候,如果多个客户端都需要调用这些服务,...

2019-07-17 14:14:41 344

原创 20190716 - 微服务

一、基本概念Docker --》go语言Java + 微服务 + Docker 可发挥最大效能Python、JS、PHP、Ruby、C++RPC:远程过程调用虽然每个系统实现的语言不一样,但是只要遵循某种协议对外提供接口,比如都对外提供HTTP的接口,它们便可以相互调用。徐庶:“基于远程调用的分布式系统,我很早就在研究,这里面的复杂度可是单机程序所不能比拟的。”庞统:“哦?愿闻其详...

2019-07-16 14:47:39 118

原创 Spring - 基础篇

一、认识SpringSpring不仅仅只是一个框架,已然已经成为一种生态了。例如,我们熟知的 “Spring全家桶”(包括SpringMVC、SpringBoot、Spring Cloud等)。Spring最主要的目的就是简化开发。它可以帮助我们管理对象,管理它们之间的依赖关系,并提供一些通用的日志记录,包括性能统计,安全控制,异常处理等,还有提供面向切面,数据库事务等功能。并且它有很厉害的插...

2019-07-14 17:43:56 129

原创 开工一年之成长感悟

步入职场已一年,有成长有感悟,简单总结如下:小成长刚开始:对未知的恐惧以及不自信,会不会很难,会不会拖团队后腿,一定要踏踏实实干活,认认真真的学习。过了一段时间后:逐步接了一些小需求,好像有了一点点自信,感觉也没有想象中的那么难,感觉也就是对数据的增删改查和调一些接口。再过一段时间后:开始接一些稍微大一点的需求,自己去捋流程,又感觉好像还是蛮难的,要考虑如何在开发前考虑周全,如何保证库表的...

2019-07-14 16:49:21 300

原创 设计模式之大总结

设计模式在于理解,而不只在于形式。不要为了套用设计模式而使用设计模式,而是在业务上遇到问题的时候,很自然的想到设计模式可以做为一种解决方案。设计模式是一门艺术,来源于生活,属经验之谈。...

2019-07-14 16:47:00 96

原创 设计模式之观察者模式

一、基本概念观察者模式定义了对象之间的一对多依赖,让多个观察者对象同时监听一个主体对象,当主体对象发生变化的时候,它的所有的依赖者(观察者)都会收到通知并更新,属于行为型模式。观察者模式有时也叫发布订阅模式。二、生活实例消息通知三、代码示例3.1 JDK方式/** * @description:JDK提供的观察者的实现方式 * @author: annecheng,2019-0...

2019-07-14 16:45:17 97

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除