一致性哈希算法
一、什么是一致性哈希一致性哈希算法(Consistent Hashing)是一种特殊的哈希算法,在移除或添加服务器时,能够尽可能小地改变已存在的键值映射关系。主要应用于分布式缓存系统中,解决节点动态增减时的数据重新分配问题。 传统哈希的问题假设有 3 台缓存服务器,使用传统取模方式分配数据: int serverIndex = hash(key) % serverCount; 当服务器数量变化时: 增加节点:serverCount 从 3 变为 4,大部分数据的映射关系都会改变 删除节点:serverCount 从 3 变为 2,同样导致大量数据重新分配 这会导致缓存大面积失效,引发缓存雪崩。 二、一致性哈希原理2.1 哈希环一致性哈希将整个哈希值空间组织成一个虚拟的圆环(Hash Ring),范围为 0 ~ 2^32-1: 服务器节点映射:对每台服务器的 IP 或主机名进行哈希,映射到环上的某个位置 数据映射:对数据的 key 进行哈希,映射到环上的某个位置 查找规则:从数据位置开始顺时针查找,遇到的第一个服务器节点即为存储位置 2.2 节点增减的影响删除节点: 只...
ConcurrentHashMap源码解析
面试常见问题 ConcurrentHashMap实现原理 ConcurrentHashMap如何保证线程安全 本文基于JDK1.8 一、构造方法和基本属性JDK8中ConcurrentHashMap参考了JDK8 HashMap的实现,构造方法和基本属性与HashMap大致相同,可参考HashMap源码解,以下主要列举不同的地方。 /** * Encodings for Node hash fields. See above for explanation. */ static final int MOVED = -1; // hash for forwarding nodes static final int TREEBIN = -2; // hash for roots of trees static final int RESERVED = -3; // hash for transient reservations // Hash节点正常可用位 static final int HASH_BITS = 0x7fffffff; // usable ...
HashMap源码解析
面试常见问题 1、你看过那些源码吗?2、那你能讲讲HashMap的实现原理吗?3、HashMap什么时候会进行rehash?4、HashMap什么时候会进行扩容?5、那HashMap的初始容量设置成多少比较合适呢?6、结合源码说说HashMap在高并发场景中为什么会出现死循环?7、JDK1.8中对HashMap做了哪些性能优化?8、HashMap和HashTable有何不同?9、HashMap 和 ConcurrentHashMap 的区别?10、ConcurrentHashMap和LinkedHashMap有什么区别?11、为什么ConcurrentHashMap中的链表转红黑树的阀值是8?12、什么是ConcurrentSkipListMap?他和ConcurrentHashMap有什么区别?13、还看过其他的源码吗?Spring的源码有了解吗?14、SpringBoot的源码呢?知道starter是怎么实现的吗? 一、构造方法1.1无参构造方法 默认初始化容量16,加载因子0.75 /** * Constructs an empty <tt>HashMap&l...
MySQL插入速度测试
一、测试环境1.1 硬件环境 名称 配置 操作系统 win7 64位 CPU 4核4线程 i5-4590 内存 16G 硬盘 128G SSD MySQL Version 5.6 1.2 数据库表结构CREATE TABLE `user` ( `id` int(11) NOT NULL AUTO_INCREMENT, `username` varchar(50) DEFAULT NULL, `password` varchar(50) DEFAULT NULL, `sex` int(11) DEFAULT NULL, `phone` varchar(20) DEFAULT NULL, `email` varchar(50) DEFAULT NULL, `remark` varchar(255) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8; 二、插入实验2.1 普通插入 线程数 插入量(...
深入理解Java线程池:ThreadPoolExecutor
看完ThreadPoolExecutor线程池源码准备写博客记录一下,但是发现一篇博客对ThreadPoolExecutor源码分析很详细,这里不再重复造轮子,所以直接转载了这篇文章。 原文地址:深入理解Java线程池:ThreadPoolExecutor 线程池介绍在web开发中,服务器需要接受并处理请求,所以会为一个请求来分配一个线程来进行处理。如果每次请求都新创建一个线程的话实现起来非常简便,但是存在一个问题: 如果并发的请求数量非常多,但每个线程执行的时间很短,这样就会频繁的创建和销毁线程,如此一来会大大降低系统的效率。可能出现服务器在为每个请求创建新线程和销毁线程上花费的时间和消耗的系统资源要比处理实际的用户请求的时间和资源更多。 那么有没有一种办法使执行完一个任务,并不被销毁,而是可以继续执行其他的任务呢? 这就是线程池的目的了。线程池为线程生命周期的开销和资源不足问题提供了解决方案。通过对多个任务重用线程,线程创建的开销被分摊到了多个任务上。 什么时候使用线程池? 单个任务处理时间比较短 需要处理的任务数量很大 使用线程池的好处 引用自 http://ife...
MySQL中MVCC是否真的能够解决幻读问题?
偶然间看到同事在看MySQL的MVCC问题,就随口插了一句,“MVCC模式解决了MySQL中的幻读问题”,但是 同事告诉我并没有,我说不可能,我清楚的记得在看《高性能MySQL 第3版》一书的事务隔离级别中的,在介绍**REPEATABLE READ **隔离级别时候提过,MVCC解决了幻读的问题。说完我还找到了书中内容给他看,内容如下: 英文原版: REPEATABLE READ REPEATABLE READ solves the problems that READ UNCOMMITTED allows. It guarantees that any rows a transaction reads will “look the same” in subsequent reads within the same transaction, but in theory it still allows another tricky problem: phantom reads. Simply put, a phantom read can happ...
使用策略模式重构系统导入导出
合理的使用设计模式能提高代码的可维护性,但是往往一开始设计开发的时候没有考虑到业务的扩展性,在后期业务扩展的时候,需要在原有代码逻辑上增加新功能,这对开发人员来说无疑是非常痛苦的。刚好接到了在新的业务系统增加导入导出功能开发任务,在了解到系统原有导入导出复杂的逻辑后,决定利用策略模式来重构这一功能,降低开发的复杂度。 系统原有导入导出 系统原有使用异步导入导出方式,导入导出任务提交后,先将任务放到任务队列中去,使用一个线程不断从任务队列中获取待执行的任务交由任务线程池去执行。 精简后的部分代码如下: FileTaskExecutor.java // 任务分发器线程内部类 class Boss implements Runnable { @Override public void run() { for (;;) { FileTask task = null; try { task = taskQueue.take(); // 导入导出任务封装为Work...
基于Nginx实现三级域名访问和https访问
Nginx实现三级域名访问我的VPS上部署了MPOOM工作台、个人博客、文件共享平台三个系统,并且在阿里云平台购买了域名,想要通过nginx实现不同的三级域名访问不同的系统,例如: MPOOM工作台:http://www.mpoon.cn 个人博客: http://blog.mpoom.cn 文件共享平台:http://m.mpoom.cn ps:如果域名要解析到国内云服务器,域名要提前在工信部进行备案,但是如果解析到国外,则没有这个限制. 配置文件mpoom.conf如下: # mpoom工作台 server { listen 80; server_name mpoom.cn www.mpoom.cn; location / { proxy_pass http://127.0.0.1:8090; } } # 个人博客 server { listen 80; server_name blog.m...
Shiro简介及使用
Apache Shiro™ is a powerful and easy-to-use Java security framework that performs authentication, authorization, cryptography, and session management. With Shiro’s easy-to-understand API, you can quickly and easily secure any application – from the smallest mobile applications to the largest web and enterprise applications. Apache Shiro™是一个功能强大且易于使用的Java安全框架,可执行身份验证,授权,加密和会话管理。 借助Shiro易于理解的API,您可以快速轻松地保护任何应用程序 - 从最小的移动应用程序到最大的Web和企业应用程序。 #一、Apache Shiro简介 Apache Shiro的首要目标是易于使用和理解。安全有时可...
Java类加载机制
一、类加载过程 类从被加载到虚拟机内存中开始,直到卸载出内存为止,它的整个生命周期包括了: 加载、验证、准备、解析、初始化、使用和卸载 这7个阶段。其中, 验证、准备和解析这三个部分统称为连接(linking) 。 其中,加载、验证、准备、初始化和卸载这五个阶段的顺序是确定的,类的加载过程必须按照这种顺序按部就班的“开始”(仅仅指的是开始,而非执行或者结束,因为这些阶段通常都是互相交叉的混合进行,通常会在一个阶段执行的过程中调用或者激活另一个阶段),而解析阶段则不一定(它在某些情况下可以在初始化阶段之后再开始,这是为了支持Java语言的运行时绑定)。 加载“加载”(Loading)阶段是“类加载”(Class Loading)过程的第一个阶段,在此阶段,虚拟机需要完成以下三件事情: 1、 通过一个类的全限定名来获取定义此类的二进制字节流。 2、 将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构。 3、 在Java堆中生成一个代表这个类的java.lang.Class对象,作为方法区这些数据的访问入口。 加载阶段既可以使用系统提供的类加载器...









