news 2026/4/27 8:07:49

高效筛选20w热点数据,从MySQL 2000w中精准提取

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
高效筛选20w热点数据,从MySQL 2000w中精准提取

文章目录

  • MySQL里有2000w数据,Redis中只存20w的数据,如何保证Redis中的数据都是热点数据?
    • 一、什么是热点数据?
    • 二、方法一:日志分析法
      • 1. 基本思路
      • 2. 实际操作
      • 3. 缺点
    • 三、方法二:实时统计法
      • 1. 基本思路
      • 2. 实际操作
      • 3. 缺点
    • 四、方法三:混合策略
      • 1. 基本思路
      • 2. 实际操作
      • 3. 优点
    • 五、如何保证 Redis 中的数据都是最新的?
      • 1. 定时刷新
      • 2. 实时更新
    • 六、总结
    • 希望这篇博客对你有所帮助!如果你有任何问题或建议,欢迎在评论区留言。
      • 📚 领取 | 1000+ 套高质量面试题大合集(无套路,闫工带你飞一把)!

MySQL里有2000w数据,Redis中只存20w的数据,如何保证Redis中的数据都是热点数据?

大家好,我是都叫我闫工!今天我们要聊一个非常有意思的问题:MySQL里有2000万数据,而Redis中只存了20万的数据,如何保证这20万都是热点数据?

这个问题看起来有点复杂,但其实它背后隐藏着一个核心问题:如何从海量数据中筛选出最“热”的那部分数据,并将其高效地加载到Redis中?

一、什么是热点数据?

在开始之前,我们先明确一下什么是热点数据。热点数据是指那些被频繁访问、查询次数多的数据。比如,在电商系统中,某些商品可能因为促销活动而被疯狂点击,这些商品的数据就是热点数据。

那么,问题来了:如何从2000万数据中找到这20万的热点数据呢?

二、方法一:日志分析法

1. 基本思路

日志分析法的核心思想是通过分析用户的行为日志(比如访问日志、点击日志等),找出那些被频繁访问的数据。

具体步骤如下:

  • 收集日志:将用户的访问行为记录下来,存储到一个日志文件中。
  • 统计频率:对日志进行分析,计算每个数据的访问次数。
  • 筛选热点数据:根据访问次数排序,选取前20万的数据作为热点数据。

2. 实际操作

假设我们的 MySQL 数据表结构如下:

CREATETABLE`user`(`id`INT(11)NOTNULLAUTO_INCREMENT,`name`VARCHAR(255)DEFAULTNULL,`age`INT(11)DEFAULTNULL,PRIMARYKEY(`id`))ENGINE=InnoDBDEFAULTCHARSET=utf8mb4;

我们的日志表结构如下:

CREATETABLE`access_log`(`id`INT(11)NOTNULLAUTO_INCREMENT,`user_id`INT(11)DEFAULTNULL,`access_time`DATETIMEDEFAULTCURRENT_TIMESTAMP,PRIMARYKEY(`id`))ENGINE=InnoDBDEFAULTCHARSET=utf8mb4;

我们需要统计每个用户的访问次数:

SELECTuser_id,COUNT(*)ASaccess_countFROMaccess_logGROUPBYuser_idORDERBYaccess_countDESCLIMIT200000;

然后,将这些用户的数据加载到 Redis 中。

3. 缺点

  • 延迟性:日志分析法需要定期运行,无法实时反映最新的热点数据。
  • 资源消耗:如果日志量非常大(比如每天几亿条),统计过程可能会非常耗时。

三、方法二:实时统计法

1. 基本思路

实时统计法的核心思想是在每次用户请求时,实时记录该数据的访问次数,并动态地维护一个“热点数据”列表。

具体步骤如下:

  • 监听页面请求:在应用层(比如Spring Boot)监听每个用户请求。
  • 统计频率:使用 Redis 的INCR命令来增加相应数据的计数器。
  • 维护热点数据:定期遍历所有数据,筛选出访问次数最高的前20万条数据。

2. 实际操作

假设我们的应用是一个电商系统,每个商品都有一个 ID。我们可以在 Redis 中为每个商品创建一个计数器:

# 初始化商品计数器 SET product:123456:count 0 # 用户访问商品时增加计数器 INCR product:123456:count

然后,定期遍历所有商品的计数器,找出前20万条数据:

publicvoidrefreshHotData(){// 获取所有商品IDList<String>productIdList=getAllProductIds();// 统计访问次数Map<String,Long>countMap=newHashMap<>();for(StringproductId:productIdList){longcount=redisTemplate.opsForValue().get(productId+":count");countMap.put(productId,count);}// 根据访问次数排序,选取前20万条数据List<Map.Entry<String,Long>>sortedEntries=newArrayList<>(countMap.entrySet());sortedEntries.sort((a,b)->b.getValue().compareTo(a.getValue()));// 将前20万条数据加载到Redis中for(inti=0;i<200000&&i<sortedEntries.size();i++){StringproductId=sortedEntries.get(i).getKey();// 加载到Redis的hash结构中redisTemplate.opsForHash().put("hot_products",productId,getProductDetails(productId));}}

3. 缺点

  • 性能问题:如果商品数量非常多(比如几千万),遍历所有商品的计数器会非常耗时。
  • 内存占用:Redis 中存储所有商品的计数器可能会占用大量内存。

四、方法三:混合策略

1. 基本思路

结合日志分析法和实时统计法,先通过日志分析法预加载一批热点数据到 Redis 中,然后在运行时通过实时统计法动态调整热点数据列表。

2. 实际操作

  • 初始化阶段:通过日志分析法,将前20万的热点数据加载到 Redis 中。
  • 运行阶段:使用实时统计法,动态维护热点数据列表,及时淘汰冷门数据,加入新的热点数据。

3. 优点

  • 高效性:结合了两种方法的优点,既能快速预加载热点数据,又能动态调整。
  • 灵活性:可以根据业务需求调整预加载和动态调整的频率。

五、如何保证 Redis 中的数据都是最新的?

在实际应用中,我们需要确保 Redis 中的热点数据是最新的。为此,我们可以采用以下策略:

1. 定时刷新

定期(比如每小时一次)重新计算热点数据,并更新 Redis 中的内容。

publicvoidscheduleRefresh(){// 每小时执行一次ScheduledExecutorServicescheduler=Executors.newSingleThreadScheduledExecutor();scheduler.scheduleAtFixedRate(this::refreshHotData,0,1,TimeUnit.HOURS);}

2. 实时更新

在每次用户请求时,动态调整热点数据列表。例如,在某个商品的访问次数超过一定阈值时,将其加入到 Redis 的热点数据中。

publicvoidhandleRequest(StringproductId){// 增加计数器redisTemplate.opsForValue().increment(productId+":count",1);// 如果访问次数达到阈值,加入热点数据longcount=redisTemplate.opsForValue().get(productId+":count");if(count>THRESHOLD){redisTemplate.opsForHash().put("hot_products",productId,getProductDetails(productId));}}

六、总结

通过以上方法,我们可以有效地将热点数据加载到 Redis 中,并确保这些数据是最新的。具体选择哪种方法取决于业务需求和系统资源:

  • 如果需要实时反映最新的热点数据,可以采用实时统计法。
  • 如果对延迟性要求不高,但希望减少系统开销,可以采用日志分析法。
  • 如果希望兼顾高效性和灵活性,可以采用混合策略。

希望这篇博客对你有所帮助!如果你有任何问题或建议,欢迎在评论区留言。

📚 领取 | 1000+ 套高质量面试题大合集(无套路,闫工带你飞一把)!

你想做外包吗?闫工就是外包出身,但我已经上岸了!你也想上岸吗?

闫工精心准备了程序准备面试?想系统提升技术实力?闫工精心整理了1000+ 套涵盖前端、后端、算法、数据库、操作系统、网络、设计模式等方向的面试真题 + 详细解析,并附赠高频考点总结、简历模板、面经合集等实用资料!

✅ 覆盖大厂高频题型
✅ 按知识点分类,查漏补缺超方便
✅ 持续更新,助你拿下心仪 Offer!

📥免费领取👉 点击这里获取资料

已帮助数千位开发者成功上岸,下一个就是你!✨

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/26 14:14:18

拥有AI员工,才发现误会了领导

人工智能爆火三年&#xff0c;大模型和AI工具好用之后&#xff1a;职场从个人单刷模式&#xff0c;转变成带几个AI助手打团战&#xff0c;可以更高效的干活&#xff0c;但节奏却慢不下来。打工人成领导&#xff0c;不知薪水涨多少&#xff1f;虽说只是几个AI助手&#xff0c;但…

作者头像 李华
网站建设 2026/4/24 6:27:17

GD5F1GM7UEYIGR:兆易创新1Gbit SPI NAND闪存,高效低功耗

品牌&#xff1a;兆易创新(GigaDevice) 型号&#xff1a;GD5F1GM7UEYIGR 容量&#xff1a;1Gbit 产品类型&#xff1a;NAND FLASH 接口类型&#xff1a; 标准SPI接口&#xff0c;支持1、2、4线模式。这意味着它只需要极少&#xff08;通常6-7个&#xff09;的GPIO引脚即可实…

作者头像 李华
网站建设 2026/4/24 20:56:40

九章算Angew. Chem. Int. Ed.解读【水系质子电池】江苏科技大学博士一作最新:几何预构型调控熵受限质子迁移的超快且稳定的水系质子电池

【文章信息】 本文第一作者是江苏科技大学在读博士生刘贺&#xff0c;曾以第一作者或共同作者在Angewandte Chemie、Advanced Functional Materials等期刊发表论文十余篇&#xff0c;欢迎各位科研同行交流。 【研究背景】 水系质子电池&#xff08;Aqueous Proton Batteries, …

作者头像 李华
网站建设 2026/4/24 12:30:53

建模智能体,AI 时代的数据治理新范式

从制度治理到生成式治理的根本转变 1 数据治理是上一代信息化的体系性问题 过去十多年&#xff0c;企业在数据治理上的投入并不算少。沿着数据治理方法论&#xff0c;我们有主数据、元数据、数据标准、数据质量、数据资产目录、数据开发与分析、安全分级分类……几乎每一个治理…

作者头像 李华
网站建设 2026/4/25 2:55:36

苹果手机照片怎么导入电脑?苹果手机传输照片就用这5招

大家的苹果手机中都存储着许多照片吧&#xff0c;它们通常很占内存&#xff0c;无论是为了腾空间&#xff0c;还是安全备份&#xff0c;将照片导入电脑都是一个明智的选择。那&#xff0c;苹果手机照片怎么导入电脑&#xff1f;听起来简单是吧&#xff1f;但实际操作中&#xf…

作者头像 李华
网站建设 2026/4/24 7:32:37

配环境1天,上线3分钟:我把整个团队的本地环境都扔了

“在我电脑上明明是好的”&#xff0c;这句话我曾说过无数次&#xff0c;也听过无数次。一个微小的环境差异&#xff0c;就能让整个团队的联调陷入僵局&#xff0c;浪费掉一下午的时间。在又一次因为环境问题导致上线延期后&#xff0c;我意识到&#xff0c;我们必须彻底抛弃这…

作者头像 李华