业务题第6天

6-1 HashMap和CurrentHashMap的区别是什么?  CurrentHashMap底层结构在1.7和1.8有什么不同?

HashMap和ConcurrentHashMap都是JAVA中双列集合的实现类。他们之间存在以下几种不同。

1.线程安全性:HashMap线程不安全,ConcurrentHashMap线程安全(基于锁分段技术)。

2.性能效率:单线程下HashMap性能比较好,并发读写下,ConcurrentHashMap性能比较好。

3.迭代器:HashMap的迭代器(Iterator)是fail-fast的,因此存在并发修改异常

ConcurrentHashMap的迭代器是弱一致性的,允许迭代过程进行部分修改,但不能反映最新修改。

CurrentHashMap底层结构在1.7和1.8的不同:

1.数据结构:Java 1.7中的ConcurrentHashMap使用了分段锁(Segmented Locking)的机制来保证并发更新的线程安全性。Java1. 8中的ConcurrentHashMap引入了CAS操作和链表/红黑树混结构,以及更细粒度的锁机制,并发性能再一步的得到了提升。

2.扩容机制:Java 1.7中的ConcurrentHashMap在扩容时会锁定整个Map,这可能会导致在扩容期间其他线程的操作被阻塞。Java 1.8中的ConcurrentHashMap使用了更细粒度的锁机制和更高效的扩容算法,减少了扩容时的锁竞争,提高了并发性能。


6-2 假设你有一批历史积分数据要存储,数量在kw条左右 存入mysql 你的方案是什么

对于数据库的海量数据存储,方案有很多,常见的有:分区、分表、分库、集群。、

首先我会先按照项目模块进行分库,每个微服务使用独立的数据库;

然后使用分表方案,分表的拆分方式更加灵活 ,相比分区同时支持水平分表和垂直分表;

最后为了保证单节点的高可用,我会再给数据库建立主从集群,主节点向从节点同步数据;

所以,在大型系统中,我们除了要做分表,还需要对数据做分库,建立综合集群。


6-3 请你说一说你的排行榜功能是如何实现的

在项目中,排行榜对应的是积分微服务。排行榜分为两种,当前赛季积分排行榜,历史赛季积分排行榜。

当前赛季,保存在redis中。具体做法是:在向数据库保存积分的地方,向redis(Zset)中保存,以年月为键,用户id为值,积分为score。

历史赛季积分排行榜,访问量不高,所保存在Mysql。在Mysql中为了防止单表数据量过多,我们采用了分表设计方案,将一个赛季放在一张表里,查询的时根据赛季标识查询,只要查一张表即可。


6-4 历史赛季积分是如何生成的

排行榜对应的是积分微服务。核心就是将redis上一个赛季的数据保存到mysql中。

首先创建历史赛季表(一个赛季一张表)

然后从redis中将数据保存到mysql中对应的赛季表中

最后删除redis中历史赛季的数据

我们选择使用xxl-job定时任务,使用子任务方式规定执行顺序。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值