使用Redis如何保证数据库和缓存之间的同步
通常我们有以下几种策略:
-
先删除缓存再更新数据库:为了解决上述问题,使用该方式一定程度上解决了上述的问题,执行的步骤如下,假如有两个方法,update和getAndAdd一个用来更新缓存,一个用来新增缓存:
-
缓存双删(建议使用):使用上述方式其实还会存在一定问题,例如还是上述两个方法:
- update 方法首先先删除缓存
- getAndAdd 方法此时从Redis 中获取数据,没有获取到数据,从数据库中获取数据并放入Redis,由于此时数据库中的数据还没有更新此时获取到的数据则是旧数据
- update 方法继续更新数据库数据
- getAndAdd 第二次被调用,发现Redis 中存在数据,则没有从数据库中更新数据到Redis 当中,就导致了数据还是老数据,并非最数据
所以此时需要使用两次删除:
- update 方法首先先删除缓存
- getAndAdd 方法此时从Redis 中获取数据,没有获取到数据,从数据库中获取数据并放入Redis,由于此时数据库中的数据还没有更新此时获取到的数据则是旧数据
- update 方法继续更新数据库数据,并再次对缓存进行删除
- getAndAdd 第二次被调用,尝试从Redis 中获取不到数据,从数据库获取数据并放入到Redis中