1 HashMap和CurrentHashMap的区别是什么? CurrentHashMap底层结构在1.7和1.8有什么不同?
HashMap 和 ConcurrentHashMap 是 Java 中常用的两种 Map 实现,它们之间有一些重要的区别。
线程安全:
hashmap是非线程安全,如果在多线程的环境下并发地进行读写操作,可能会导致数据不一致或者抛出 ConcurrentModificationException 异常。 concurrentHashMap是线程安全的,它使用了锁分段的机制来实现并发访问不同的分段可以被不同的线程同时访问,从而提高并发性能。
性能:
在单线程环境下,HashMap的性能会略有雨ConcurrentHashMap,因为ConcurrentHashMap需要进行额外的并发控制。在多线程的环境下,ConcurrentHashMap的性能通常会优于HashMap,因为它能够支持更高的并发访问。
底层结构:
在Java1.7中,ConcurrentHashMap的底层数据结构是疣分段数组和链表组成的,及时使用了分段锁的机制来保证并发安全。
在Java1.8中,ConcurrentHashMap的底层结构进行了重大的改进,引入了CAS操作和红黑树,用于提高并发性和减少锁竞争。具体来说,1.8的ConcurrentHashMap使用了Node数组+链表/红黑树的结构,以及CAS操作来实现并发安全和高性能。
总的来说,ConcurrentHashMap 相对于 HashMap 来说,提供了更好的并发性能和线程安全性。
2 假设你有一批历史积分数据要存储,数量在kw条左右 存入mysql 你的方案是什么
对于要往数据库存储千万条左右的数据,处理的方案很多,但是常见的有:分区、分表、分库、集群
分区:
表分区(Partition)是一种数据存储方案,可以解决单表数据较多的问题,MySQL5.1开始支持表分区功能
分区就是按照某种规则,把表数据对应的ibd文件拆分成多个文件来存储
从物理上来看,一张表的数据被拆到多个表文件存储了;从逻辑上来看,他们对外表现是一张表
增删改查的方式不会有什么变化,只不过底层MySQL底层的处理上会有变更,例如检索时可以只检索某个文件,而不是全部
分表:
分表是一种表设计方案,由开发者在创建表时按照自己的业务需求拆分表。一旦做了分表,无论是逻辑上,还是物理上,就从一张表变成了多张表。增删改查的方式就发生了变化,必须自己考虑要去哪张表做数据处理。
分表可以分为水平分表和垂直分表。
分库和集群
无论是分区,还是分表,我们刚才的分析都是建立在单个数据库的基础上。但是单个数据库也存在一些问题:
-
单点故障问题:数据库发生故障,整个系统就会瘫痪
-
单库的性能瓶颈问题:单库受服务器限制,其网络带宽、CPU、连接数都有瓶颈
-
单库的存储瓶颈问题:单库的磁盘空间有上限,如果磁盘过大,数据检索的速度又会变慢
综上,在大型系统中,我们除了要做分表、还需要对数据做分库,建立综合集群。
3 请你说一说你的排行榜功能是如何实现的
在排行榜这个业务中,我们要考虑很多的元素,大量的数据、实时性等,这是我们就是用Redis来惊醒排行榜功能的实现。我们只要将原来代码中保存到MySQL的数据同时保存到Redis中即可。
4 历史赛季积分是如何生成的
生成历史赛季积分本质就是要把Redis中上一个赛季的完整数据保存到MySQL中。
首先创建历史赛季表,表单在每个赛季刚开始(月初)创建,利用定时任务实现。把Redis中保存的历史数据持久化到数据库中,由于数据量巨大,分表方式选择水平分表,按照历史赛季拆分,每个赛季一个表。
然后表单建立后,将Redis中的数据持久化到MySQL数据库中。
最后删除Redis中历史赛季的数据。
本文讨论了HashMap和ConcurrentHashMap在Java中的差异,包括线程安全、性能对比,以及在Java1.7和1.8版本中底层结构的变化。还介绍了在处理大量历史积分数据时,如何使用MySQL分区、分表和分库,以及Redis在排行榜功能中的应用。

被折叠的 条评论
为什么被折叠?



