6-1 HashMap和CurrentHashMap的区别是什么? CurrentHashMap底层结构在1.7和1.8有什么不同?
首先HashMap和CurrentHashMap都是java中的集合类,他们有下面几点区别:
1,线程安全性:
HashMap不是线程安全的,多个线程访问HashMap可能会导致数据不一致或者抛出ConcurrentModificationException异常
CurrentHashMap是线程安全的,它使用了锁分段技术来保证并发访问安全性
2,性能
在高并发情况下,CurrentHashMap性能要优于HashMap,因为它允许多个线程同时读取和写入不同的段,而HashMap需要通过外部同步手段来保证线程安全,所以性能不高
3,迭代器
CurrentHashMap的迭代器是弱一致性的,它不会抛出异常,但是会看到更新前后的数据
HashMap的迭代器是快速失败的,如果在迭代过程中有其他线程对HashMap进行结构修改,会立即抛出ConcurrentModificationException异常
CurrentHashMap底层结构在1.7和1.8有什么不同?
1,CurrentHashMap在1.7之前是数组加链表,在1.8之后是数组加链表加红黑树,
2,CurrentHashMap在1.7的存储操作是通过分段锁去实现,在1.8之后是基于CAS操作和红黑树
3,2,CurrentHashMap在1.7之前的扩容操作会等待阻塞你执行完扩容操作,在1.8之后会协作你完成扩容操作,尽可能加快扩容速度
6-2 假设你有一批历史积分数据要存储,数量在kw条左右 存入mysql 你的方案是什么
在我们项目中存储历史积分数据的方案是分表设计方案, 做了分表,在逻辑上或者在物理上,一张表就变成了多张表,采用水平分表来将每张表的数据查出来然后合并数据.
6-3 请你说一说你的排行榜功能是如何实现的
我们的排行榜功能主要是通过积分实现的,分为实时积分榜和历史积分榜,
实时积分榜查询大我们选择存入Rdeis中,实时积分榜是指当前月份,每个用户按积分数量最多排序,
我以当前月为key,用户为value,积分为score,保存数据的时候在redis中是向现有的积分进行累加.
历史积分榜我们选择直接存入数据库中 ,这就是我在项目中实现排行榜功能
6-4 历史赛季积分是如何生成的
在我们项目中历史赛季积分通过下面几点生成的
1,首先我们要进行水平分表,就是按照赛季拆分,每一个赛季是一个独立的表 ,
2,接下来,将上一个赛季的数据从redis中保存到mysql中
3,为了让保证业务按顺序执行,使用xxl-job构建任务链
3,删除redis中历史赛季数据.