day06

6-1 HashMap和CurrentHashMap的区别是什么? 

HashMap和ConcurrentHashMap都是Java中的集合类,用于存储键值对。它们之间的主要区别有以下几方面:

1.线程安全性:

HashMap是非线程安全的,如果多个线程同时访问HashMap并且至少有一个线程修改了HashMap的结构(如put、remove操作),则必须通过外部同步手段来保证HashMap的线程安全性。

ConcurrentHashMap是线程安全的,它使用了一种称为分段锁(segmented locking)的机制来支持并发访问。这意味着多个线程可以同时读取ConcurrentHashMap,而不会导致线程冲突,而对于写操作,只有部分分段会被锁定,允许多个线程同时执行写操作。

2.扩容机制

       HashMap扩容针对整个Map,每次扩容时,原来数组中的元素依次重新计算存放位置,并重新插入

       ConcurrentHashMap的扩容时段内扩容,对段内元素超过该段对应Entry数组长度的75%触发扩容

3.迭代器区别

       ConcurrentHashMap的迭代器是弱一致的,允许其在迭代过程中进行修改,而hashmap不能,如果在迭代过程中对hashmap进行修改会立即报错

CurrentHashMap底层结构在1.7和1.8有什么不同?

        jdk1.7及其以下的版本中,结构是用Segments数组 + HashEntry数组 + 链表实现的,ConcurrentHashMap 使用了分段锁技术来保证线程安全,它把数据分成一段一段的,也就是Segments [] 数组,Segments数组中每一个元素就是一个段,每个元素里面又存储了一个Enter数组,这个enter数组就相当于是一个HashMap,所以在高并发场景下,每次修改内容时只会锁住segment数组的每个元素,多个元素之间各自负责自己的锁, 既做到了并发,又提升了效率.

       ​ 在JDK1.8中,对ConcurrentHashMap的结构做了一些改进,其中最大的区别就是jdk1.8抛弃了Segments数组,摒弃了分段锁的方案,而是改用了和HashMap一样的结构操作,也就是数组 + 链表 + 红黑树结构,比jdk1.7中的ConcurrentHashMap提高了效率,在并发方面,使用了cas + synchronized的方式保证数据的一致性;因为去掉了分段锁,所以在高并发时锁住的就是数组的节点了,使得结构更加简单了.

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

为了避免大量数据直接存入数据库导致数据库宕机,有以下几种优化方式:

  1. 分批操作:将历史数据进行分批处理,避免一次性处理大量数据导致内存溢出
  2. 考虑使用数据库分片:如果数据量非常大,可以考虑使用数据库分片来水平扩展数据库,以提高存储和查询的性能。
  3. 数据库连接池优化:配置合适的数据库连接池,以确保数据库连接的复用和性能的最大化。
  4. 考虑使用缓存:对于频繁访问的数据,可以考虑使用缓存技术,如Redis等,以减轻数据库的压力。

6-3 请你说一说你的排行榜功能是如何实现的
排行榜功能主要是基于积分来实现的,积分分为实时积分榜和历史积分榜,由于实时积分查询量很大,所以存在了redis里面,使用了redis里面的zset结构,xx作key,xx作value;历史积分查询量一般不会很大,所以存在了MySQL里面,单表数据不多,采用了分表的数据方案,一个赛季放在一张表里,需要的时候根据赛季标识查询,这样一次只需要查一张表即可

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

       在我们的项目中,每一个月就是一个赛季,所以生成历史赛级积分榜实际上就是将redis中的数据持久化存储到数据库中的过程

       具体步骤大体上可以分为以下三步:

       1. 创建历史赛季表(一个赛季一张表)

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

3.删除redis中历史赛季的数据

其中,由于历史赛级越来越多,如果将数据都存入一张表中,数据量过多,所以我们分表的方式使用的是水平分表,每一个赛季都是一个单独的表,之后我们将数据从redis中存入mysql中,数据保存完成后使用unlink命令异步删除redis数据

以上三个步骤我们均使用xxl-job来完成,并使用了子任务功能来确保任务按照123的顺序执行

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值