关于热点数据的处理

发布时间 2023-08-31 10:47:15作者: whhhd

 

识别热点

  1. 访问频率统计:通过记录每个数据的访问次数,可以判断哪些数据被频繁访问,从而确定热点数据。你可以使用HashMap或ConcurrentHashMap等数据结构来存储数据和对应的访问次数,每次访问时更新对应的计数。

  2. 时间窗口统计:使用滑动时间窗口的方式统计数据的访问频率。你可以使用一个固定大小的时间窗口,比如最近一小时,然后记录在该时间窗口内每个数据的访问次数。通过比较不同数据的访问次数,可以找出热点数据。

  3. 缓存机制:在代码层面做预热识别,比如给某个接口判断入参是否为热点数据的规则(比如redis过期时间1s,调一次+1但不更新过期时间,若增长量>5则判为热数据),这种方法能更快速的识别热数据,但缺点是业务逻辑复杂,且由于写死在代码中无法扩展。

  4. 日志分析:通过分析应用程序的日志,可以了解哪些数据被频繁操作或修改。你可以使用日志分析工具,如Log4j、Logback等,提取关键信息并统计数据的操作次数。

隔离热点
除了访问层面隔离(不同项目,不同接口)外,主要讲下缓存和数据层如何隔离

热点数据特点是数量少,访问频次高,处理热点数据三个方案:热点散列,多级缓存,热点库

热点库:就是将redis急群中单独划出一些实例库存热点数据,当热点数据可预知时,这个方案是最合适的,也是最稳定可控的

多级缓存:本地缓存+redis,如果对象过大,可考虑把jvm缓存改为堆外缓存

热点散列:相当于分布式版本的二级缓存,把集群每个redis实例的内存区域划分为普通区域+hot zone区域,区别在于普通实例只存放属于自己的数据,而所有实例的hotzone都可存放热数据,即对于普通数据,redis集群是分片存储的,hotzone数据不分片,访问hostzone数据时压力由集群所有实例承担,如图