day06

本文讨论了HashMap和ConcurrentHashMap在线程安全、迭代器特性、初始化设置上的差异,以及在多线程环境下的选择。同时介绍了在处理大规模历史积分数据和排行榜功能时,如何利用MySQL和Redis进行存储和计算。
摘要由CSDN通过智能技术生成
6-1 HashMap和CurrentHashMap的区别是什么?  CurrentHashMap底层结构在1.7和1.8有什么不同?

HashMapConcurrentHashMap 是两种不同的哈希表实现.主要区别有一下几点:

1,.线程安全性

hashMap是线程不安全的,如果多线程同时访问或者修改,会导致数据不一致

ConcurrentHashMap是线程安全的,他的核心是使用锁分段的方式来实现并发访问和修改,不会阻塞整个表,因此可以支持多线程并发操作.

2.迭代器

HashMap 的迭代器是 fail-fast 的,即如果在迭代过程中对 HashMap 结构发生了修改,会抛出 ConcurrentModificationException 异常。ConcurrentHashMap 的迭代器是弱一致性的,允许在迭代过程中对表进行修改而不抛出异常。

3.初始化容量和并发级别:

在创建时,HashMap 需要指定初始容量和负载因子,但并不需要指定并发级别。ConcurrentHashMap 在创建时需要同时指定初始容量和并发级别,这些参数可以影响并发性能。

因此,如果需要在多线程环境中进行并发访问,可以选择使用 ConcurrentHashMap,而在单线程环境中,HashMap 可能会更加简单和高效。

concurrentHashMap 在JDK1.7 底层采用分段数组+链表实现。Segment数组是不可扩容的,HashEntry数组可以扩容,数组中可以存取链表。
在JDK1.8 采用的数据结构跟HashMap1.8的结构一样,都是数据+链表/红黑树。
除此以外,他们的加锁方式也不一样
JDK1.7采用Segment分段锁,底层使用的是ReentrantLock。锁定力度为整个HashEntry数组。
JDK1.8以后采用CAS添加新节点,采用synchronized锁定链表或红黑树的首节点,相对Segment分段锁粒度更细,发生并发冲突更低,性能更好


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

对于数据库的海量数据存储,方案有很多,常见的有:分区、分表、分库、集群。但对于千万级别的历史积分数据,我在项目中的方案是分表。

我们采用分表的形式存入大量的数据,这种方案拆分方式更加灵活,可以解决多表字段过多和数据量过大的问题.在分表的两种模式中,我们采用的是水平分表的方式.水平分表每张表字段相同数据不同.


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

排行榜功能我使用的是在redis和mysql实现的.

对于当前赛季排行榜,首先在redis中每名用户获取的总积分以Zset的方式保存,然后根据总积分排序

对于历史赛季积分排行榜,不是特别重要,而且访问量也不高,所以我将其保存在了Mysql。

这就是我在项目中排行榜功能的实现流程。


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

历史赛季积分在我的项目中是使用xxl-job进行定时任务,将redis中上一个赛季的完整数据保存到mysql中.主要步骤分为三步

第一步, 创建历史赛季表(一个赛季一张表)

第二步. 从redis中将数据保存到mysql中对应的赛季表中

第三步. 删除redis中历史赛季的数据

以上便是我们实现历史积分排行榜的步骤

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值