day6--1.19CurrentHashMap+排行榜

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

HashMap和ConcurrentHashMap是Java中常用的两种Map实现,它们在多线程环境下的并发性能有所不同。

        1.区别:

  • 线程安全性:HashMap是非线程安全的,而ConcurrentHashMap是线程安全的。
  • 锁机制:HashMap在多线程环境下需要使用外部同步机制(如synchronized)来保证线程安全,而ConcurrentHashMap使用了分段锁(Segment)来实现更细粒度的并发控制,不同的Segment可以由不同的线程同时访问,提高了并发性能。
  • 迭代器:HashMap的迭代器是fail-fast的,即在迭代过程中如果其他线程对HashMap进行了结构性修改,会抛出ConcurrentModificationException异常;而ConcurrentHashMap的迭代器是weakly consistent的,它不会抛出异常,可以获取到迭代器创建时的快照数据

        

        2.ConcurrentHashMap底层结构:

  • Java 1.7:ConcurrentHashMap的底层结构是由Segment数组和HashEntry数组组成。Segment是一种可重入锁ReentrantLock的扩展,每个Segment维护了一个HashEntry数组的子集,不同的Segment可以由不同的线程同时访问,提高了并发性能。
  • Java 1.8:ConcurrentHashMap的底层结构进行了改进,使用了CAS(Compare and Swap)操作和synchronized来实现并发控制。它引入了Node数组,每个Node是一个链表的头节点,每个链表通过CAS操作进行插入和删除节点,解决了1.7版本中Segment级别的锁竞争问题,提高了并发性能。

综上,ConcurrentHashMap相比HashMap在多线程环境下具有更好的并发性能,但在单线程环境下HashMap的性能更好。在Java 1.8版本中,ConcurrentHashMap的底层结构进行了改进,使用了CAS操作和synchronized来提高并发性能。


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

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

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

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

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

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


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

我们项目中排行榜是主要根据积分实现的,主要分为实时积分榜和历史积分榜。

实时积分榜由于查询量比较大,我们选择存在redis,使用其Zset结构,将日期(eg:202401,年月)作为key,将用户id和积分作为value,将积分作为分数从而实现自动排行。

历史积分榜由于数据比较大,查询量不算很高,我们选择存在MySQL,在MySQL中为了防止单表数据量过多,我们采用了分表设计方案,具体来说就是一个赛季放在一张表里,这样等查询的时候根据赛季标识查询,只要查一张表即可。

以上就是排行榜功能的实现。


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

历史赛季积分主要有三大步,它的核心就是把redis上一个赛季的数据保存到MySQL中。

因此,

第一步,要生成数据表,

第二步,redis数据转存到MySQL里,

第三步,清理redis中的数据,

由于这是非人为操作,该操作在每月凌晨一点执行,所以我们选择使用XXL-JOB定时任务;为保证这个三步按顺序执行,采用了子任务的方式。

以上就是历史赛季积分的生成。

  • 24
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值