一致性哈希算法
一致性哈希算法一致性哈希算法是为了解决分布式缓存中的热点问题而提出的。一致性哈希将每个对象映射到圆环边上的一个点,系统再将可用的节点机器映射到圆环不同位置。查找某个对象对应的机器时,需要用一致性哈希算法计算得到对象在圆环上的位置,沿着圆环边顺序查找,直到遇到默认机器节点,这台机器即为该对象的存储位置。当删除一台节点机器时,这台机器上的所有对象都要移动到下一台机器上。当添加一台机器到圆环边上的一个点,这个点下一台机器需要将这个点之前的对象移动到新机器上。
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</ ...
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 bit ...
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://ifeve. ...
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 happen ...
使用策略模式重构系统导入导出
合理的使用设计模式能提高代码的可维护性,但是往往一开始设计开发的时候没有考虑到业务的扩展性,在后期业务扩展的时候,需要在原有代码逻辑上增加新功能,这对开发人员来说无疑是非常痛苦的。刚好接到了在新的业务系统增加导入导出功能开发任务,在了解到系统原有导入导出复杂的逻辑后,决定利用策略模式来重构这一功能,降低开发的复杂度。
系统原有导入导出 系统原有使用异步导入导出方式,导入导出任务提交后,先将任务放到任务队列中去,使用一个线程不断从任务队列中获取待执行的任务交由任务线程池去执行。
精简后的部分代码如下:
FileTaskExecutor.java
// 任务分发器线程内部类
class Boss implements Runnable {
@Override
public void run() {
for (;;) {
FileTask task = null;
try {
task = taskQueue.take();
// 导入导出任务封装为Worker交 ...
基于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.mpoo ...
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集合
早在 Java 2 中之前,Java 就提供了特设类。比如:Dictionary, Vector, Stack, 和 Properties 这些类用来存储和操作对象组。
虽然这些类都非常有用,但是它们缺少一个核心的,统一的主题。由于这个原因,使用 Vector 类的方式和使用 Properties 类的方式有着很大不同。
集合框架被设计成要满足以下几个目标。
该框架必须是高性能的。基本集合(动态数组,链表,树,哈希表)的实现也必须是高效的。
该框架允许不同类型的集合,以类似的方式工作,具有高度的互操作性。
对一个集合的扩展和适应必须是简单的。
为此,整个集合框架就围绕一组标准接口而设计。你可以直接使用这些接口的标准实现,诸如: LinkedList, HashSet, 和 TreeSet 等,除此之外你也可以通过这些接口实现自己的集合。
从上面的集合框架图可以看到,Java 集合框架主要包括两种类型的容器,一种是集合(Collection),存储一个元素集合,另一种是图(Map),存储键/值对映射。Collection 接口又有 3 种子类型,List、Set 和 Qu ...