day06

本文讨论了HashMap和ConcurrentHashMap在1.7和1.8版本的底层结构差异,以及在处理大量历史积分数据时,如何利用分表策略、Redis和MySQL结合实现排行榜功能,包括实时榜单的Redis存储和历史榜单的定期迁移至MySQL的过程。
摘要由CSDN通过智能技术生成

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

 HashMap 和ConcurrentHashMap区别:

        HashMap 和ConcurrentHashMap 都是用于存储键值对的数据结构,他们的不同点主要有以下几方面:
        首先,HashMap 是非线程安全的,而ConcurrentHashMap 是线程安全的
        其次,ConcurrentHashMap效率比HashMap效率要高

concurrentHashMap底层结构在1.7和1.8的区别:

        在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的zset进行储存数据,在用户获得积分后,同步写入到redis中,用户的积分就是zest集合中的分数,按照分数进行排名。

        我们项目中,按照每个月一更新的模式,以一个月为一个赛季,每月一号凌晨,统计实时榜单内的数据,并写入到MySQL中生成历史榜单。在这个工程中,由于是每月操作,因此,我们使用的是XXL-JOB定时任务来执行的,另外,由于历史榜单较多,我们使用的是分库分表策略,每个赛季记录分为一张表。

        最后,清空Redis中的缓存。

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

        历史赛季积分简单来说就是将Redis中的实时榜单信息写入到MySQL数据库中。

        在每月1号凌晨,定时将Redis中数据写入MySQL数据库,我们使用XXL-JOB来定时完成

        XXL-JOB分为三个任务,首先,执行创建上个月的数据表,成功后,读取Redis数据,写入MySQL数据库,最后,清空Redis中的缓存。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值