情节严重违法行为处罚可达五千万
|
如图中所示,刚开始时(初始),数据库和缓存中的数据是一致的,但是在写请求过来后,数据库更新成功,而缓存删除失败。这就导致数据库中的数据是最新的,但缓存中却依然存着旧数据。 这时,如果读请求过来,就会直接读取缓存中的旧数据返回了。 双写一致方案 1、先删除缓存,后更新数据库 既然问题的原因是删除缓存失败了,那么我们先确保把缓存删除成功了,再去更新数据库。也就是说我们先删除缓存,后更新数据库。 可能你会问了,如果我数据库更新失败了呢?
我们不妨通过图来看下这种情况: 那我们再看写的部分。 2、先更新数据库,后删除缓存 你可能会问了,为什么不在更新完数据库后,采取更新缓存的方案,而是将其删除。原因有这么几点:
你想想,如果修改库中的某个字段,一段时间内频繁进行更新。那么你修改多少次,缓存也跟着更新多少次。但是这个缓存数据在这段时间内也就被偶尔使用了几次。 那么你看,是不是就会导致资源浪费了。
还有一种情况,如果这个缓存的数据计算成本比较高。比如为了一个数据,要通过多张表来计算才能得到结果。那么每修改一次,为了更新缓存还要再查询多张表来算一次,我的天。
这种情况最为致命,不但修改频繁,同时缓存数据还要经过复杂计算。 生产环境里要是这么搞的话,那估计你就可以准备简历了。 既然更新缓存的方式不可行,那么我们换个思路,删除掉呢? 还是按照上边的步骤,先更新数据库,只是我们把更新缓存的操作换成了删除。 在这种情况下,读请求过来的时候,发现 Redis 中没有数据,就会去数据库里读取,然后写入缓存中。 这也是一种懒加载方式,只有缓存被需要的时候才会去计算。这样可以避免大量计算及频繁更新。
但是,这样会有什么隐患的问题?是不是看着没什么毛病。你想想,如果数据更新成功,但是删除缓存失败怎么办? (编辑:信阳站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
