缓存实现和更新设计

场景

提升查询性能,修改操作如果大于查询操作时则没必要做Cache设计

Cache类型

客户端Cache

页面Cache

浏览器Cache

代理Cache(边缘Cache)

服务端Cache

DB Cache (MySql)

应用Cache

Cache算法

Ehcache

GuavaCache

Redis

Cache更新策略

  • 1、定时全量更新

    定时器按固定周期把最新数据全量更新到Cache中
    问题: 不实时,全量加载太慢,REDIS场景下如果是DEl操作Cache中的老数据没有清除,需要设置过期时间;

  • 2、改进方法1:改为更新落库后实时增量的更新Cache, 从Cache中查数据,如果没命中,则查数据库

    问题: 如果更新Cache出现失败,则查询都会走数据库;

  • 3、改进方法2:方法二的基础上,如果没命中,查完数据库后更新到Cache中

    问题:有两个更新入口,并发情况下回出现脏数据问题;

  • 4、改进方法3:Cache Aside

    修改时让Cache失效,由查询操作更新到Cache
    理论上的并发问题:线程1查询DB后,线程2更新DB后把Cache失效,然后线程1再来到重新把Cache恢复成了老数据,由于更新操作比查询操作要慢很多,除非系统异常情况下,否则不会出现;

  • 5、有同事提出在Cache Aside 有空查询问题,即错误的数据都会查询一遍DB

    这种情况我认为不会有问题,这种情况多出在恶意攻击注入的时候,这个时候应该是在上层做其他的拦截,例如限流、降级、黑名单等;

  • 6、设计上的改进,将Cache和DB合并为一个服务,由Cache实现与DB的交互,屏蔽更新Cache的细节;

  • 7、高可靠高并发的改进:所有更新和查询都在Cache 上实现,再由Cache异步的同步到DB上,这样DB只做一个数据恢复,这里需要Cache在实现上是高可用的,极小概率会出现数据丢失。

###