基础

Zookeeper从设计模式角度来理解:是一个基于观察者模式设计的分布式服务管理框架,它负责存储和管理大家都关心的数据,然后接受观察者的注册,一旦这些数据的状态发生变化,Zookeeper就将负责通知已经在Zookeeper上注册的那些观察者做出相应的反应。

特点

  1. 一个领导者,多个跟随着组成的集群
  2. 集群中 只要有半数以上节点存活,集群就可以正常提供服务.
  3. 全局数据一致:每个Server保存一份相同的数据副本,Client无论连接到哪个Server,数据都是一致的
  4. 更新请求顺序执行,来自同一个Client的更新请求按照发送顺序依次执行
  5. 数据更新原子性,一次数据更新要么成功,要么失败
  6. 实时性,在一定时间范围内,Client能读到最新数据

提供的服务包括:统一命名服务、统一配置管理、统一集群管理、服务器节点动态上下线、软负载均衡等。

Read more »

单例模式

一个类只允许创建一个对 象(或者实例),那这个类就是一个单例类,这种设计模式就叫作单例设计模式,简称单例模式。

如何实现一个单例

  1. 构造函数需要是 private 访问权限的,这样才能避免外部通过 new 创建实例;
  2. 考虑对象创建时的线程安全问题;
  3. 考虑是否支持延迟加载;
  4. 考虑 getInstance() 性能是否高(是否加锁)
  • 饿汉式
    在类加载的时候,instance 静态实例就已经创建并初始化好了,所以,instance 实例的创建过程是线程安全的。不过,这样的实现方式不支持延迟加载(在真正用到 IdGenerator 的时候,再创建实例)。
  • 懒汉式
    懒汉式相对于饿汉式的优势是支持延迟加载。这种实现方式会导致频繁加锁、释放锁,以及并发度低等问题,频繁的调用会产生性能瓶颈。
  • 双重检测
    双重检测实现方式既支持延迟加载、又支持高并发的单例实现方式。只要 instance 被创建 之后,再调用 getInstance() 函数都不会进入到加锁逻辑中。所以,这种实现方式解决了懒汉式并发度低的问题。
  • 静态内部类
    利用 Java 的静态内部类来实现单例。这种实现方式,既支持延迟加载,也支持高并发,实 现起来也比双重检测简单。
  • 枚举
    最简单的实现方式,基于枚举类型的单例实现。这种实现方式通过 Java 枚举类型本身的特 性,保证了实例创建的线程安全性和实例的唯一性。
Read more »

IOC

IoC(Inverse of Control:控制反转) 是一种设计思想,而不是一个具体的技术实现。IoC 的思想就是将原本在程序中手动创建对象的控制权,交由 Spring 框架来管理。IoC 容器实际上就是个 Map(key,value),Map 中存放的是各种对象。

  • 控制 :指的是对象创建(实例化、管理)的权力
  • 反转 :控制权交给外部环境(Spring 框架、IoC 容器)

IOC 解决了以下问题:

  1. 创建了许多重复对象,造成大量资源浪费;
  2. 更换实现类需要改动多个地方;
  3. 创建和配置组件工作繁杂,给组件调用方带来极大不便。
Read more »

RocketMQ概述

MQ,Message Queue,是一种提供消息队列服务的中间件,也称为消息中间件。消息即数据,一般消息的体量不会很大。简单来说,消息队列就是一种实现“先进先出”的一种数据结构。

用途

  1. 应用解藕:上游系统对下游系统的调用若为同步调用,则会大大降低系统的吞吐量与并发度,且系统耦合度太高。 而异步调用则会解决这些问题。所以两层之间若要实现由同步到异步的转化,一般性做法就是,在这两 层间添加一个MQ层。
  2. 流量消峰:MQ可以将系统的 超量 请求暂存其中,以便系统后期可以慢慢进行处理,从而避免了请求的丢失或系统被压垮。
  3. 消息分发:数据的生产方只需要把各自的数据写入一个消息队列即可,数据使用方根据各自需求订阅感兴趣的数据,不同团队所订阅的数据互不干扰,也不必和数据产生方关联。

RocketMQ的架构

Read more »

1. 概述

容器主要包括 Collection 和 Map 两种,Collection 存储着对象的集合,而 Map 存储着键值对(两个对象)的映射表。

Collection

1. Set(无序的、不可重复的)

Read more »

http与https

http的缺点:

  • 通信使用明文(不加密),内容可能会被窃听
  • 不验证通信方的身份,因此有可能遭遇伪装
  • 无法证明报文的完整性,所以有可能已遭篡改

用 SSL建立安全通信线路之后,就可以在这条线路上进行HTTP通信了。
HTTP+ 加密 + 认证 + 完整性保护=HTTPS,简言之,所谓 HTTPS,其实就是身披SSL协议这层外壳的 HTTP。

加密方式:

Read more »

JUC概述

创建线程的四种方式

  1. 实现 Runnable 接口;
  2. 实现 Callable 接口;
  3. 继承 Thread 类(很少使用,单继承原因)。
  4. 线程池
    实现 Runnable 和 Callable 接口的类只能当做一个可以在线程中运行的任务,不是真正意义上的线程,因此最后还需要通过 Thread 来调用

Runnable

使用 Runnable 实例再创建一个 Thread 实例,然后调用 Thread 实例的 start() 方法来启动线程。

Read more »

JVM概述

JVM:全称 Java Virtual Machine,即 Java 虚拟机,一种规范,本身是一个虚拟计算机,直接和操作系统进行交互,与硬件不直接交互,而操作系统可以帮我们完成和硬件进行交互的工作

Java 代码执行流程:java程序 –(编译)–> 字节码文件 –(解释执行)–> 操作系统(Win,Linux)

架构模型

Read more »

01数据结构

简单来说,底层数据结构一共有 6 种,分别是简单动态字符串、双向链表、压缩列表、哈希表、跳表和整数数组。它们和数据类型的对应关系如下图所示:

可以看到,string类型的底层实现只有一种数据结构。而List、Hash、Set 和 Sorted Set 这四种数据类型,都有两种底层实现结构。通常情况下把这四种类型称为集合类型,它们的特点是一个键对应了一个集合的数据。

不同value的底层实现

Read more »

参考mysql实战45讲

数据库

MySQL中的数据类型

类型 类型举例
整数类型 TINYINT(1Byte)、SMALLINT(2Byte)、MEDIUMINT(3Byte)、INT(4Byte)、BIGINT(8Byte)
浮点数类型 FLOAT(4Byte)、DOUBLE(8Byte)
定点数类型 DECIMAL(9Byte)
位类型 BIT
日期时间类型 YEAR、TIME、DATE、DATETIMETIMESTAMP
文本字符串类型 CHAR、VARCHAR、TINYTEXT、TEXT、MEDIUMTEXT、LONGTEXT
枚举类型 ENUM
集合类型 SET
二进制字符串类型 BINARY、VARBINARY、TINYBLOB、BLOB、MEDIUMBLOB、LONGBLOB
json类型 JSON对象、JSON数组
空间数据类型 单值类型:GEOMETRY、POINT、LINESTRING、POLYGON; 集合类型:MULTIPOINT、MULTILINESTRING、MULTIPOLYGON、 GEOMETRYCOLLECTION
  1. float、double都是近似值,存储的时候都存在精度丢失的问题,一般使用decimal类型。如果数据范围超过decimal,建议把数据拆分为整数部分和小数部分,分别存储。
  2. Int(1)和int(11)不同于varchar,在计算和存储空间上无区别,其中1和11代表的是展示的长度,当打开zerofill配置时,不足的位置会补0,如010。
  3. varchar是不定长,需要额外空间记录长度,容易产生碎片,不预先分配存储空间,存储长度不要超过5000,否则建议用text类型并新建表,避免影响其他索引 。对于短得列,char效率更高
Read more »
0%