Skip to content

性能优化-热数据

About 846 wordsAbout 3 min

性能新书

2026-08-24

5.16 热数据

热数据是指系统中最重要、最频繁访问的数据,系统希望能最快的访问和更新这些数据。如下都是IT系统的中的热数据

  • CPU的L1/L2/L3 Cache 容量极小但访问速度极快;磁盘也有类似机制实现缓存以实现高速存取而避免直接操作硬盘
  • 热数据会存储在高性能SSD上,冷数据会存储在机械硬盘上,甚至是磁带上。Clickhouse创建表时候可以指定最新7天的数据存放在SSD上,其他数据自动迁移到其他磁盘上。大部分NOSQL或者云存储都具备热数据处理机制。
  • 社交网络大V的的文章和评论属于热数据
  • 秒杀活动中的库存数据属于热数据,其库存预先存放在Redis,扣减库存操作Redis,避免操作数据库
  • 业务系统中,一些元数据会加载到JVM内存中,比如部门,角色,权限等信息。以及字典表数据。
  • 用户经常通过物联网控制空调,空调的物模型在夏季是热数据,空调物模型缓存在JVM中,用于快速计算空调的数据模型,以展示空调的属性和能发出的控制的命令列表。

数据架构早期可以判定某些数据模型是热数据,比如业务系统的角色和权限信息、业务系统的规则配置信息等,可以随着业务系统启动加载到热数据容器中,这种热数据容器可以是简单的Java集合类,比如ConcurrentHashMap。 也可以在数据实际使用过程中,把最近访问过的,或者访问频率达到某个阈值设定为热数据。 单机系统推荐的热数据容器是缓存框架Caffeine,它能自动根据数据访问频率设置为热数据,具有如下特定

  • Caffeine针对缓存数据,实现W-TinyLFU 算法,针对高频率访问的数据,可以自动设定其为热数据
  • 拥有比其他缓存框架更快的访问速度
  • 丰富的机制控制数据被淘汰的策略,如缓存总数,读/写的时间等
  • 数据的同步或者异步加载,异步加载在数据过期时候允许返回一个旧值,然后异步加载新值,避免同步加载阻塞正常业务执行。
  • 丰富的监控功能,了解缓存的运行效果,如缓存命中率等

如下代码缓存总共5000个物模型,使用过程Caffeine淘汰使用频率较低的物模型缓存数据

LoadingCache<String, DeviceModle> graphs = Caffeine.newBuilder()
.maximumSize(5000)
.build(key -> createDeviceModle(key));

如下代码定义了物模型缓存的过期时间为1小时,超时后重新调用createDeviceModle加载

LoadingCache<String, DeviceModle> modelCache = Caffeine.newBuilder()
    .expireAfterWrite(60, TimeUnit.MINUTES)
    .build(deviceId -> createDeviceModle(deviceId));

借助Caffeine工具,很简单实现单机系统的热点数据存取和更新,对于分布式系统,复杂的地方在于数据更新后,需要同步到各个分布式节点的热数据容器,这将在7.8 分布式系统功能缓存中说明

知行合一