先更新缓存,再更新数据库:
这种方法明显是不合理的,当更新缓存后,此时缓存中存的是最新的数据,接着更新数据库,但是此时数据库更新报错回滚,数据就不一致了。
先更新新数据库,再更新缓存:
这里用的比较多的是延迟双删方法,即先删除缓存,在更新数据库,接着延迟一段时间再次更新缓存。但是这个延迟的时间不好预估,但是能实现最终一致性,也有可能导致数据不一致。
个人看法:已经使用缓存了,就代表可以允许有一段时间的不一致,那么就没必要使用延迟双删,直接更新数据库再延迟一段时间然后删除缓存即可。
延迟双删如果前面删除了缓存,此时有个线程进来读缓存但是数据库还是旧的数据,该线程就拿着旧的数据等待更新缓存,此时由于各种原因导致该线程写缓存的操作在更新数据库并且延迟一段时间删除缓存后才写入缓存,此时就变成了缓存中的数据还是旧数据,但是数据库中的数据已经是新的数据,并且在删除缓存到更新数据库中间如果有线程来读缓存相当于还需要再次查询数据库中的数据,再次写入缓存,此时还是旧数据,所以这操作可以避免。
总结:个人看法是redis缓存不删除,数据库插入新数据等待一段时间(保证数据库同步)然后再删除缓存,等到下一次读缓存时再到数据库中读数据写入缓存。缓存先删除感觉有点浪费系统资源,因为在缓存删除到更新数据库中的这段时间还是有线程可能来访问缓存,这样又要多一次数据库IO还要多一次写缓存操作。
纯个人看法不喜勿喷。