先删缓存还是先改数据库?
如果先修改数据库,再删除缓存,有可能数据库修改成功了,但是缓存删除失败
如果先删除缓存,再修改数据库,如果删除缓存成功,数据库修改失败,第二个请求发现缓存没数据,从数据库读取后放入缓存中,正常情况下不会有问题
高并发下的双写不一致问题
第一个请求数据发生变更,先删除了缓存,然后要去修改数据库,此时还没来得及去修改;
第二个请求过来去读缓存,发现缓存空了,去查询数据库,查到了修改前的旧数据,放到了缓存中;
第三个请求读取缓存中的数据 (此时第一个请求已经完成了数据库修改的操作)。完了,数据库和缓存中的数据不一样了。。。。
解决方案
只有在对同一数据高并发读写时才有可能出现上面的情况,导致数据库和缓存不一致
对同一数据读写进行串行化,我们在程序中维护一组队列,读写数据时先对数据哈希取余,路由到对应的队列
每个队列对应一个线程,串行读写操作