问题:现在有二个系统A,B二个系统,A系统是C端的一个系统,B系统是B端的一个系统,B系统DB有一套数据模型,A系统访问B系统获取这份配置数据,如何保证性能以及热点key问题?

方案(1)使用redis缓存,在B系统可以将配置数据放到redis缓存中,同时B系统给A系统提供一个近端包支持 优先从缓存获取,缓存没有命中读取远端的数据

方案(1)面临的问题:

  1、如果缓存数据量过大,一般redis缓存大小为1k左右,不能超过10k,否则会降低整个redis集群的rt? 那需要将这个份配置信息分割为多个维度的接口,比如页面,组件,数据源,规则。查询页面以及页面对应的组件id,然后在根据组件id列表批量查询组件对应的规则和数据源,将一大份配置信息分开存储都缓存中

2、如何解决热点key 的问题?

redis支持针对热点key做缓存,目前redis集群对单key 的访问可以支持3w/s,还可以生成一个key多个版本,C端访问的时候随机一个版本进行访问,将key进行散列一下

3、如何保证DB和缓存数据的一致性?

通过定制任务捞取数据,DB的数据  缓存数据 如果不一致 则以DB数据为准。

4、如果外围对接口进行攻击出现很多不应该出现的缓存key?

可以使用空缓存的方式,将不识别的key进行缓存 并且设置过期时间,缺点会 浪费一些redis的空间

还是可以在近端包中决策缓存key会否合法,可以使用本地缓存的方式进行,使用配置推送的方式进行

5、如果涉及多个业务的缓存页面组件,组件数据源,规则?

需要支持单个页面key查询缓存,以及批量组件key 查询redis缓存,如果是单个key,命中缓存则返回,否则走远端补偿,远端逻辑:先走缓存获取,没有查询DB,然后再将数据放到缓存中,如果DB也没有数据,那么则放一个空缓存进去。

对于批量key查询,缓存很有可能部分命中,那么则将 没有命中的部分走远端补偿,远端接口:从缓存批量获取,将没有命中的,从DB查询,DB没有的则空缓存,否则放入到缓存中,缓存放入之for循环一个一个放,批量获取缓存是可以批量的获取。

方案2 在B系统某一个功能情况下,可以触发将DB的配置数据统送到A系统的内存中,可以使用disconf配置文件推送能力,这种中间件数据最终一致性。A系统监听中间件的消息,B系统触发消息,A系统可以触发需要重新加载配置数据,B系统监听到将本地缓存清除,然后在再从hbase 或者 redis 获取配置数据,放到本地缓存中。这种方式 可以解决 热点key。以及 大数据量的问题。