第六天业务

本文讨论了HashMap和ConcurrentHashMap在Java中的差异,包括线程安全、性能、迭代器特性,并详细比较了Java1.7和1.8中ConcurrentHashMap的变化。还介绍了处理历史积分数据的MySQL和Redis存储方案,以及排行榜功能的实现和历史赛季积分生成方法。
摘要由CSDN通过智能技术生成

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实现,而且要规定好执行顺序(任务链)。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值