412C-A2B-REDIS-更新策略

61 阅读1分钟

方式1:先删除缓存,再更新数据库 更新数据库的时间是比较长的,所以在这段时间内可能会有其他线程进入 此时缓存中的数据已被删除,线程1对Mysql中的数据进行更新中,但是并没有更新完成 线程2进入时缓存未命中,查询数据库,数据为旧值,更新Redis缓存为旧值,然后缓存, 线程1更新数据库完成为新值,出现了数据不一致

方式2:先更新数据库,在删除缓存 如果由于某些原因,导致缓存不存在(Redis宕机,缓存到期等等) 此时线程1进行入,缓存未命中,查询数据库为旧值,在写入缓存的时间时, 线程2进入,更新数据库,然后删除缓存(但注意的是,此操作是无效操作,因为此时的缓存已经因为某种原因失效了) 线程1继续,更新缓存为旧值,出现了数据不一致

可以发现,方式2相较于方式1,出现问题的概率更低 在方式2中,线程1的执行速度是非常快的,再此期间CPU切换到线程2的概率比较低 如果没有切换到线程2,是无法造成数据不一致的,因为旧数据会被更新到缓存,然后就被线程2给删除 后续会出现缓存未命中,新数据e03131更新

总之:先更新数据库,再删除缓存


Citation:

References:

top