缓存失效策略

失效缓存---->更新数据库数据

  1. 缺点

    • 如果缓存失效失败,根据策略可能会影响后续的正常的数据更新操作

    • 直接失效缓存会增加后续的一次缓存查询的Miss

  2. 优点

    • 避免数据库更新成功,缓存失效失败,导致缓存中是旧数据

  3. 场景

    • 对缓存准确率要求比较高的业务

  4. 异常情况

    • 线程A需要更新数据库数据,失效缓存;线程B发现缓存没有命中,查询数据库中取出旧的值;线程A更新数据库数据,提交事务,线程A将数据放入缓存

更新数据库数据---->失效缓存

  1. 缺点

    • 如果数据更新成功,但是缓存失效失败,缓存中存放的是旧数据

    • 直接失效缓存会增加一次缓存查询的Miss

  2. 优点

    • 更新数据不会强依赖缓存,就算失效缓存失败,也不会影响数据库的更新

  3. 场景

    • 对缓存和数据库的一致性要求不是很高的场景

  4. 异常情况

    • 在更新数据库数据和失效缓存之前的所有查询,查询到的都是旧数据

更新数据库数据---->更新缓存

  1. 优点

    • 避免了一次额外的缓存查询Miss

  2. 缺点

    • 数据库更新成功,但是更新缓存失败,缓存中存储的是旧数据

  3. 场景

    • 缓存粒度比较小,缓存的数据不需要经过计算(更新商品数据,但是缓存还需要用户数据)

  4. 异常情况

    • A线程查询缓存发现缓存中没有数据,查询数据库;B线程更新数据库并且更新了缓存;A再把查询的数据放入缓存,缓存中将会是旧数据

更新缓存---->更新数据库数据

  1. 优点

    • 避免了一次额外的缓存查询Miss

  2. 缺点

    • 缓存更新成功,但是数据库更新失败,导致缓存数据是旧数据;并且更新缓存失败,根据策略可能导致更新数据库失败

  3. 场景

    • 缓存粒度比较小,缓存的数据不需要经过计算(更新商品数据,但是缓存还需要用户数据)

  4. 异常情况

    • 在更新缓存成功和更新数据库数据之前拿到的缓存是和数据库不一致的(不过这种情况造成的负面影响很小)


iMouseWu
1.6k 声望53 粉丝

Conding with Java