xxl-sso知识点

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

1、哈希环算法

通过将数据分配到一个环形的哈希表上来实现数据的分布根据环上的顺序依次进行分配。

对于数据敏感的服务不能用取余hash来实现当新增节点时之前按照取余hash放的数据在新增节点之后在相应的节点找不到数据而哈希环就可以避免这个问题另外取余hash还会造成数据分布不均匀的问题一些节点存储了大量的数据一些索引节点却存储很少的数据这会使系统变得不均衡影响系统的性能而哈希环可以实现均匀的数据分布所以哈希环是一种更可靠的分布式存储方法。

原理图

先求出不同服务器的哈希值然后映射到一个范围为0 — 2^32-1的数值空间的圆环中即将首(0)和尾(2^32-1)相接的圆环。

初始圆环

 新增数据后映射到这个环上新增的数据会顺时针寻找找到的第一个服务器节点就是目标要保存的节点

d1,d2存储到Node B

d3, d4, d5存储到Node C

d6, d7, d8存储到Node A

 假如Node B宕机了其他都不会受到印象只有d1d2受到影响放到Node C

 如果新增加一台机器Node D在NodeA和NodeC之间那么d6d7就会存储到了Node D影响也比较小。

改良版

如果出现极限情况下只有两台机器然后大量的数据都集中在一台机器上那么一致性会hash将一个物理节点虚拟出N个虚拟节点来用

Node A可以虚拟出Node A1Node A2Node A3

Node B可以虚拟出Node B1Node B2Node B3

 

2、池化思想

提前准备一些资源在需要时可以重复使用这些预先准备的资源。

和StringBuffer类似先申请一份大的空间再依次放数据这样可以防止空间频繁的创建。

优点可以节省实时分配空间的时间成本减少对空间的使用降低高并发下的gc频率提升性能。

比较典型的几种策略

内存池预先申请内存提高申请内存的速度减少内存碎片
连接池预先申请数据库连接提升申请链接的速度降低系统开销
实例池循环使用对象减少资源在初始化和释放时昂贵损耗
线程池预先申请线程重复利用珍贵的线程资源并且任务到到达时无需等待线程的创建立刻执行。

3、ThreadLocal

变量在线程间隔离而在方法间共享。

ThreadLocal中的变量属于当前线程其他线程是无法拿到其中的变量的即当前线程独有的变量。

使用场景

在处理多方法中线程并发安全的最常用的方法就是使用锁通过锁来控制多个不同线程对临界区的访问。但是无论是什么样的锁乐观锁或者悲观锁都会在并发冲突的时候对性能产生一定的影响。而ThreadLocal就可以解决这个问题ThreadLocal 通常用于多线程编程中用于存储用户 ID 或事务 ID 等信息这些信息可以在整个执行线程中使用而对其他线程不可见。

ThreadLocal的使用方法

创建一个ThreadLocal对象

private ThreadLocal<Integer> threadLocal= new ThreadLocal<>();

设置和获取threadLocal变量的值

public int setAndGet(){
    threadLocal.set(8);
    return threadLocal.get();
}

得到的值为8.

由于ThreadLocal里设置的值只有当前线程自己看得见这意味着你不可能通过其他线程为它初始化值。为了弥补这一点ThreadLocal提供了一个withInitial()方法统一初始化所有线程的ThreadLocal的值

private ThreadLocal<Integer> threadLocal= ThreadLocal.withInitial(() -> 6);

将threadLocal的初始值设置为6这对全体线程都是可见的。

ThreadLocal实现原理

每个线程在往ThreadLocal里设置值的时候都是往自己的ThreadLocalMap里存即每个线程都有一个属于自己的ThreadLocalMapThreadLocalMap内部维护着Entry数组每个Entry代表一个完整的对象key是ThreadLocal本身value是ThreadLocal的泛型值。

读取也是以某个ThreadLocal作为引用在自己的map里找对应的key从而实现了线程隔离。

 ThreadLocal的内存泄露问题

由于ThreadLocalMap中的key为ThreadLocal的弱引用弱引用比较容易被回收。因此如果ThreadLocal (ThreadLocalMap的Key)被垃圾回收器回收了但是因为ThreadLocalMap生命周期和Thread是一样的它这时候如果不被回收就会出现这种情况ThreadLocalMap的key没了value还在这就会造成内存泄漏问题。

弱引用:只要垃圾回收机制一运行不管JVM的内存空间是否充足都会回收该对象占用的内存。

如何解决内存泄漏问题

使用完ThreadLocal后及时调用remove()方法释放内存空间。

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6