Hashmap的CurrentHashmap的区别?
1、 HashMap不支持并发操作,而ConcurrentHashMap支持并发操作。通过继承 ReentrantLock,CAS和synchronized来加锁,每次锁住一小数组 segment,只要保证每个 Segment 是线程安全的,也就实现了全局的线程安全。
2、 JDK1.8之前HashMap由数组+链表构成,JDK1.8之后在此前的基础上加红黑树;JDK1.8之前ConcurrentHashMap由segment数组+数组+链表组成,之后ConcurrentHashMap的结构为数组+链表+红黑树。
CurrentHashmap的底层结构1.7和1.8的有什么不同?
JDK1.7:
ConcurrentHashMap 是由
Segment
数组结构和HashEntry
数组结构组成。egment 继承了 ReentrantLock,所以 Segment 是一种可重入锁,扮演锁的角色。Segment 默认为 16,也就是并发度为 16。JDK1.8
ConcurrentHashMap转换成 Node数组+链表+红黑树结构;在锁的实现上,抛弃了原有的 Segment 分段锁,采用
CAS + synchronized
实现更加细粒度的锁。
数据库的海量数据存储
分区:
按照一定的规则,把存储数据的一张表对应的ibd文件分成多个小文件,每个小文件存储原来文件一部分数据。用来解决单表数据较多的问题。只是物理层面的拆分,逻辑上还是一张表。
分表:
分为水平分表和垂直分表两种方式。
水平分表,表结构不变,改变的是数据。例如,赛季榜单,每个赛季一张表;
垂直分表,将宽表(每张表数据可能不会很多,但是字段很多一把超过30个以上)分为多张表,每张表的结构不一样,数自然也不一样。
前两者都是都是真针对单个数据库而言的,这会引发诸多问题:
-
单点故障问题:数据库发生故障,整个系统就会瘫痪
-
单库的性能瓶颈问题:单库受服务器限制,其网络带宽、CPU、连接数都有瓶颈
-
单库的存储瓶颈问题:单库的磁盘空间有上限,如果磁盘过大,数据检索的速度又会变慢
在大行项目中,机会采用微服务的思想来设计数据库,一个服务对应一个数据库,也叫垂直分库;而为了保证单节点的高可用性,我们会给数据库建立主从集群,主节点向从节点同步数据。两者结构一样,可以看做是水平扩展。