6-1 HashMap和CurrentHashMap的区别是什么? CurrentHashMap底层结构在1.7和1.8有什么不同?
HashMap和ConcurrentHashMap都是JAVA中双列集合的实现类。他们之间存在以下几种不同。
1.线程安全性: HashMap线程不安全,ConcurrentHashMap线程安全(基于锁分段技术)
2.性能效率: 单线程下HashMap性能比较好,并发读写下,ConcurrentHashMap性能比较好
3,法代器: HashMap的迭代器(lterator) 是failfast的,因此存在并发修改异常;ConcurrentHashMap的选代器是弱一致性的,允许跌代过程进行部分修改,但不能反映最新修改。
ConcurrentHashMap在JAVA1.7和JAVA1.8中也有明显的不同。
1.数据结构: Java 1.7中的ConcurentHashMap使用了分段锁(Segmented Locking) 的机制来保证并发更新的线程安全性。Java1.8中的ConcurrentHashMap引入了CAS操作和链表/红里树混合结构,以及更细粒度的锁机制,并发性能再一步的得到了提升
2.扩容机制:,ava 17中的ConcurentHashMaD在扩容时会销定整个Map,这能会导致在扩容期间其他生程的提作被阳赛。Java 1.8中的ConcurrentHashMap使用了更细粒度的锁机制和更高效的扩容算法,减少了扩容时的锁竞争,提高了并发性能。
6-2 假设你有一批历史积分数据要存储,数量在kw条左右 存入mysql 你的方案是什么
对于数据库的海量数据存堵,方案有很多,常见的有:分区、分表、分库、集群。但对于千万级别的历史积分数据,我在项目中的方案是分表
1.找到这批数据的区别点,比如第n期或者第n赛季
2.根据区别点,水平分出不同的表,每张表中插入对应区别点的数据.
6-3 请你说一说你的排行榜功能是如何实现的
排行榜对应的是积分微服务。排行榜分为两种,一种是当前赛季积分排行榜,一种是历史赛季积分排行榜。
对于当前赛季,我保存在了redis中,具体做法就是: 在向数据库保存积分的地方,向redis (Zset) 中保存,以年月为键,用户id为值,积分为score,保存。
对于历史赛季积分排行榜,不是特别重要,而且访问量也不高,所以我将其保存在了Mysql。
这就是我在项目中排行榜功能的实现流程。
6-4 历史赛季积分是如何生成的
排行榜对应的是积分微服务。历史赛季积分榜是排行榜的一种。它的本质就是将redis中上一个赛季的完整数据保存到mysql中。
1.创建历史赛季表(一个赛季一张表)
2.从redis中将数据保存到mysql中对应的赛季表中
3.删除redis中历史赛季的数据
使用xxl-job实现,而且要规定好执行顺序(任务链)。