数据服务的缓存方案设计

离线T+1的数据分析场景

由于数据是T+1的,只有昨天的数据,所以缓存的性价比将会非常高:

  • 每天的数据刷新之前,基本上早晨8点到第二天早晨8点,数据是不变的,缓存的时间可以设置的时间比较长

难点:

  • 第二天数据刷新之后,如何能够立刻清除缓存,保证用户请求到的数据是最新跑完的
  • 如何能够一次性清除某个接口或者某个页面的所有缓存

方案:

  • 缓存采用map的数据结构进行存储,也就是value是个map,而不是一个简单的字符串
  • 这样缓存的key可以是一个接口的名字,缓存的value的key是方法的入参,value是响应的结果
  • 删除的时候,直接根据接口的名字就将整个接口的所有缓存都清楚掉了

存在的问题:

  • 将一个接口的所有缓存都放在一个key下,cellar对于一个key的缓存有大小限制,value过大的时候,写入会异常

解决方案:

  • 缓存的key采用接口名称+一个哈希值构成,相当于将一个接口的缓存分配到不同的key上
  • 哈希值是接口的入参经过hash之后的值,这样一个入参过来之后,通过hash也可以成功找到这个入参所在的key
  • 清楚的时候,直接通过接口名称+所有的哈希值,将所有的缓存进行删除

可能存在的隐患:

hash是多少是通过目前的现状,结合经验,评估出来的一个数值,如果后续业务发展很快,缓存的数据量增大非常多,有可能这个hash的数量是不够的,这个问题应该如何解决