萌

冲鸭\(0^v^0)/


  • 首页

  • 标签

  • 分类

  • 归档

  • 关于

  • 记录生活

  • 照片

  • 搜索

分布式锁

发表于 2018-11-10 | 更新于: 2019-10-15 | 分类于 NoteBook | 阅读次数: | | 字数统计: 1,777

image

什么是分布式

将系统差分成不同的服务然后将这些服务放在不同服务器减轻单台服务的压力,提高性能和并发量。

阅读全文 »

线程池

发表于 2019-05-01 | 更新于: 2019-10-22 | 分类于 NoteBook | 阅读次数: | | 字数统计: 1,140

为什么使用多线程

  1. 降低资源消耗 -事先创建若干个线程放在容器中,当使用的时候不需要自行创建,使用完不是去销毁而是归还到容器,减少了线程创建和销毁的时间
  2. 提高线程的可管理性 -无限制的创建线程,不仅消耗资源还降低系统稳定性,线程池可以进行统一分配,监控
  3. 提高相应速度 -不需要等待线程创建

    参数说明

    ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit,BlockingQueue<Runnable workQueue)
阅读全文 »

CAP原则-Base理论

发表于 2019-02-10 | 更新于: 2019-10-23 | 分类于 NoteBook | 阅读次数: | | 字数统计: 923

CAP原则:分布式的三个指标, 这三个指标不可能同时做到。这个结论就叫做 CAP 定理。

  • Consistency(一致性): 写操作之后的读操作,必须返回该值

  • Availability(可用性): 意思是只要收到用户的请求,服务器就必须给出回应

  • Partition tolerance(分区容错): 大多数分布式系统都分布在多个子网络。每个子网络就叫做一个区(partition)。分区容错的意思是,区间通信可能失败

    一般来说,分区容错无法避免,因此可以认为 CAP 的 P 总是成立。CAP 定理告诉我们,剩下的 C 和 A 无法同时做到。

    CA为什么不能同时成立?因为可能通信失败(分区容错)

Base理论:BASE是Basically Available(基本可用)、Soft state(软状态)和Eventually consistent(最终一致性)的简写

  • 基本可用: 指分布式系统在出现故障的时候,允许损失部分可用性(例如响应时间、功能上的可用性),允许损失部分可用性。需要注意的是,基本可用绝不等价于系统不可用。
  • 最终一致性:最终一致性强调的是系统中所有的数据副本,在经过一段时间的同步后,最终能够达到一个一致的状态。因此,最终一致性的本质是需要系统保证最终数据能够达到一致,而不需要实时保证系统数据的强一致性
  • 软状态:指允许系统存在中间状态,而该中间状态不会影响系统整体可用性。分布式存储中一般一份数据会有多个副本,允许不同副本同步的延时就是软状态的体现。mysql replication的异步复制也是一种体现。

    总的来说,BASE理论面向的是大型高可用可扩展的分布式系统,和传统事务的ACID特性使相反的,它完全不同于ACID的强一致性模型,而是提出通过牺牲强一致性来获得可用性,并允许数据在一段时间内是不一致的,但最终达到一致状态。但同时,在实际的分布式场景中,不同业务单元和组件对数据一致性的要求是不同的,因此在具体的分布式系统架构设计过程中,ACID特性与BASE理论往往又会结合在一起使用。

聊聊分布式存储——轻松理解Raft

一:Eureka

二:Zookeeper

三:Consul

Eureka 典型的 AP,作为分布式场景下的服务发现的产品较为合适,服务发现场景的可用性优先级较高,一致性并不是特别致命。其次 CA 类型的场景 Consul,也能提供较高的可用性,并能 k-v store 服务保证一致性。 而Zookeeper,Etcd则是CP类型 牺牲可用性,在服务发现场景并没太大优势;

Eureka Zookeeper Consul
GitHub https://github.com/Netflix/eureka https://github.com/apache/zookeeper https://github.com/hashicorp/consul
服务健康度检查 服务状态,内存,硬盘等 (弱)长连接,keepalive 连接心跳
多数据中心 — 支持 支持
k-v存储服务 — 支持 支持
一致性 — paxos(Paxos算法是保证在分布式系统中写操作能够顺利进行,保证系统中大多数状态是一致的,没有机会看到不一致,因此,Paxos算法的特点是一致性>可用性。) rafthttp://raft.taillog.cn/
cap ap cp ca
多语言能力 http(sidecar) 客户端 支持http和dns
watch支持 支持 long polling/大部分增量 — metrics
自身监控 metrics — metrics
安全 — acl acl /https
SpringCloud集成 已支持 已支持 已支持

synchronized关键字

发表于 2017-10-01 | 更新于: 2019-10-19 | 分类于 NoteBook | 阅读次数: | | 字数统计: 1,204

synchronized
synchronized是一种同步锁
同一时刻只能有一个线程能获取到锁

  1. 修饰代码块:同步代码块,作用域是{}里面的代码,作用的对象是调用这个代码块的对象。
  2. 修饰方法:同步方法,作用范围是整个方法,作用对象是调用这个方法的对象。
  3. 修饰静态的方法:作用范围是整个方法,作用对象是这个类的所有对象。
  4. 修饰类:作用范围是synchronized后面括号括起来的部分,作用的对象是这个类的所有对象。
阅读全文 »

Volatile关键字

发表于 2017-08-01 | 更新于: 2019-10-22 | 分类于 NoteBook | 阅读次数: | | 字数统计: 1,645

volatile

Volatile 能够保证可见性。

volatile的两大特性:禁止重排序、内存可见性。

1)保证了不同线程对这个变量进行操作时的可见性,即一个线程修改了某个变量的值,新值对其他线程来说是立即得知的。
2)禁止进行指令重排序。
阅读全文 »

优雅的处理NullPointerExcepter

发表于 2019-10-16 | 更新于: 2019-10-21 | 分类于 NoteBook | 阅读次数: | | 字数统计: 1,080

Optional是Java8提供的为了解决null安全问题的一个API。

阿里巴巴编码规约-异常处理

1
2
3
4
5
6
7
8
9
10
说明:本手册明确防止 NPE 是调用者的责任。  
10. 【推荐】防止 NPE,是程序员的基本修养,注意 NPE 产生的场景:
1)返回类型为基本数据类型,return 包装数据类型的对象时,自动拆箱有可能产生 NPE。
反例:`public int f() { return Integer 对象}`, 如果为 null,自动解箱抛 NPE。
2) 数据库的查询结果可能为 null。
3) 集合里的元素即使 isNotEmpty,取出的数据元素也可能为 null。
4) 远程调用返回对象时,一律要求进行空指针判断,防止 NPE。
5) 对于 Session 中获取的数据,建议 NPE 检查,避免空指针。
6) 级联调用 `obj.getA().getB().getC();`一连串调用,易产生 NPE。
正例:使用 JDK8 的 Optional 类来防止 NPE 问题。

一:Optional类方法

Optional类方法

1. 创建 Optional 相关方法

方法:Optional.of、Optional.ofNullable、Optional.empty():

1
`Optional emptyOptional = Optional.empty(); Optional nonEmptyOptional = Optional.of("name"); Optional nonEmptyOptional = Optional.ofNullable(null); `

2. 检查 Optional 值

方法:Optional.isPresent()、Optional.ifPresent()

  • 如果 Optional有值,isPresent() 返回 true
  • ifPresent() 如果值存在,则执行代码块

3. 通过 Optional 取值

  • get() 返回值包含在 Optional 中返回,(建议配合isPresent() 使用,假如 Optional 不包含一个值, get() 将会抛出一个异常)
  • orElse() 如果值不存在,则返回默认值
  • orElseGet() 与 orElse() 类似,如果 Optional 不包含值,用函数作为返回值
  • orElseThrow() 与 orElseGet() 类似,监测到值为 null 时抛出异常

4. map转换值:Stream和Optional 的map方法对比图

  • Stream和optional的fiatMap方法对比图
    Optional-Map
    Optional-FlatMap
    Optional-Use-Map
    可以把Optional看成包含一个元素的Stream对象。

    5. filter

    1
    `String name = "Aa"; Optional optionalName = Optional.of(name).filter(str -> str.length() > 2);`

注意:

  • 无法序列化

    由于Optional 类设计时就没特别考虑将其作为类的字段使用,所以它也并未实现Serializable;
    把 Optional 类型用作属性或是方法参数在 IntelliJ IDEA 中更是强力不推荐的
    用Optional 声明域模型中某些类型是不错的主意。
    如果非要实现序列化的模型域,可以参考下例

  • 基于值的类(说明:这是一个基于值的class类,对于同一性(特性)敏感的操作 (包含引用的相等性如:==),同一性的hashcode或者同步等等、对optional实例可能会产生不可预料的结果,这种结果应该被避免。)

    https://docs.oracle.com/javase/8/docs/api/java/lang/doc-files/ValueBased.html

    这里说的是基于值的类需要满足以下几点:

    1、 final类型和不可变的(可能会包含可变对象的引用)
    2、 有equals、hashCode、toString方法的实现,它是通过实例的状态计算出来的,而并不会通过其它的对象或变量去计算。
    3、 不会使用身份敏感的操作,比如在二个实例之间引用相等性、hashCode或者内在的锁。
    4、 判断二个值相等仅仅通过equal方法,而不会通过==去判断。
    5、 它不提供构造方法,它通过工厂方法创建它的实例,这不保证返回实例的一致性。
    6、 当它们相等时,它是可以自由替换的。如果x和y 调用equal方法返回true,那么可以将x和y任意交换,它的结果不会产生任何变化。

二:实战示例

1. 用Optional封装可能为Null的值

  • 假设有一个Map<String,Object>方法; 如果map 没有关联的key,就会返回null。

    1
    Object value = map.get("key");

    可以替换成

    1
    Optional<Object> value = Optional.ofNullable(map.get("key"));

2. 作为返回值(不建议作为参数)

3. 把所有内容整合起来

三:增强

  • Java 9
  • or():如果值存在,返回包含该值的 Optional 对象;否则,返回 or() 函数生成的 Optional 对象。
  • ifPresentOrElse(Consumer<? super T>action, Runnable emptyAction):如果值存在,使用该值执行指定调用,否则使用空值执行调用。
  • stream():如果值存在,返回该值的顺序流(Stream);否则返回空流。
  • Java 10
  • orElseThrow():如果值存在,返回该值;否则抛出NoSuchElementException。注意:与 Java 8 不同,不接受任何参数。
  • Java 11
  • isEmpty():如果值不存在,返回 true;否则返回 false。

数据库索引

发表于 2019-10-09 | 更新于: 2019-10-22 | 分类于 NoteBook | 阅读次数: | | 字数统计: 950

索引,用于提升数据库的查找速度。

索引主要是基于Hash表和B+树。

加速查找速度的数据结构,常见的有两类:

(1)哈希,例如HashMap,查询/插入/修改/删除的平均时间复杂度都是O(1);

(2)树,例如平衡二叉搜索树,查询/插入/修改/删除的平均时间复杂度都是O(lg(n));

如果是单行查询确实是哈希索引更快。对于group by 、order by 、比较<>哈希索引时间复杂度会退化成O(n),而树的有序性,依旧能保持O(logn)的高效率。

一般来说,索引本身也很大,不可能全部存储在内存中,因此索引往往以索引文件的形式存储的磁盘上。 磁盘里的数据加载到内存的时候,是以页为单位加载的,节点与节点之间的数据是不联系的,所以不同的节点,很可能分布在不同磁盘页中,

磁盘的加载次数和树的高度是关联的。越矮加载次数越少。

阅读全文 »

MQ归纳

发表于 2019-09-18 | 更新于: 2019-10-23 | 分类于 NoteBook | 阅读次数: | | 字数统计: 188

MQ

Kafka

阅读全文 »

Redis归纳

发表于 2019-08-18 | 更新于: 2019-10-23 | 分类于 NoteBook | 阅读次数: | | 字数统计: 1,252

Redis

一个基于内存的高性能的key-value数据库。

数据结构:String字符串,Hash字典,List列表,Set集合,SortedSet有序集合。

Redis

阅读全文 »

垃圾收集器

发表于 2019-08-05 | 更新于: 2019-10-22 | 阅读次数: | | 字数统计: 2,122

垃圾回收
两个收集器之间存在连线,说明它们可以搭配使用。

阅读全文 »
12…4
萌

萌

33 日志
1 分类
16 标签
RSS
GitHub E-Mail weibo
© 2017 — 2019 萌
0%