6-1 HashMap和CurrentHashMap的区别是什么? CurrentHashMap底层结构在1.7和1.8有什么不同?
HashMap是线程不去安全的CurrentHashMap是线程安全的
数组(Segment 或者 Node 数组):
ConcurrentHashMap 内部使用一个数组来存储数据。数组的每个元素可以是一个 Segment 或者一个 Node。
Segment:(分段锁)
ConcurrentHashMap 最初是使用分段锁(Segment)实现并发的读和写操作。每个 Segment 代表一个独立且线程安全的小哈希表,拥有自己的锁。Segment 数量可以通过参数来配置,默认是 16 个。不同的线程可以同时访问不同的 Segment,从而实现并行的读写操作。
Node:
在 JDK8 之后,ConcurrentHashMap 引入了一种新的底层结构,即使用 Node 数组来存储数据。每个 Node 包含了键值对的信息,并通过链表或红黑树来解决哈希冲突。
链表(LinkedList)或红黑树(Red-Black Tree):
当哈希冲突发生时,使用链表或红黑树来处理冲突。当链表长度过长时(默认阈值为8),链表会自动转化为红黑树,提高查询性能。
6-2 假设你有一批历史积分数据要存储,数量在kw条左右 存入mysql 你的方案是什么
1.首先可以进行表分区,当涉及到大量历史数据的存储时,使用MySQL的分区表功能可以提高查询性能和管理效率。这样呢,可以存储更多的文件但是呢,分区字段必须是索引字段不是很灵活。
2.当面对大量历史积分数据时,使用分表的方案也是一种有效的存储方式。分表的拆分方式会更加灵活也可以解决字段过多或者数据过多的问题,但是增删改查的时候会变得更加麻烦。
3.搭建集群:集群解决了海量存储的问题,也提高了并发能力,但是集群就会出现分布式的事务问题,搭建集群的成本也会较高。
6-3 请你说一说你的排行榜功能是如何实现的
首先排行榜主要分为两种,实时榜单跟历史榜单:
实时榜单:
实时榜单主要记录的是本月的积分排名情况,首先在获得积分时需要向Redis中累加分数,这里用到的是Zset数据类型,因为Zset比较方便排序。在个人中心,学生可以查看指定赛季积分排行榜,还可以查看自己总积分和排名。排名数据直接从Redis中查询即可。
历史榜单:
历史榜单主要记录的是历史的积分排名情况,Redis中自会存储本月的排名数据,Redis的数据会在每个月的一号把上个月的数据同步到Mysql中,同步完毕后会删除Redis的数据,这里使用到了XXL-Job的定时任务跟任务链的技术。
6-4 历史赛季积分是如何生成的
我们使用任务链定时从Redis将历史赛季积分数据保存到相应的MySQL赛季表中。为解决数据过多问题,选择水平分表,以赛季为单位进行拆分。
每个赛季初(每月初)创建新的赛季榜单表,利用定时任务实现。接着,在创建积分榜单表后将上一个赛季数据从Redis保存到MySQL,以确保数据完整性。
另外,添加清理Redis缓存任务,使用unlink命令异步线程删除,避免阻塞主线程。所有任务定义完毕后,通过XXL-JOB的子任务功能进行配置任务调度。
day06业务题
最新推荐文章于 2024-11-18 15:46:04 发布