性能优化-热数据
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 分布式系统功能缓存中说明
