网站建设发展历程,小程序商城怎么开发,嘉兴建设规划网站,学校网站建设栏目有哪些关注我#xff0c;升职加薪就是你#xff01; 当我们对数据进行修改的时候#xff0c;到底是先删缓存#xff0c;还是先写数据库#xff1f; 1、如果先删缓存#xff0c;再写数据库#xff1a;在高并发场景下#xff0c;当第一个线程删除了缓存#xff0c;还没来得及写…关注我升职加薪就是你 当我们对数据进行修改的时候到底是先删缓存还是先写数据库 1、如果先删缓存再写数据库在高并发场景下当第一个线程删除了缓存还没来得及写数据库第二个线程来读取数据会发现缓存中的数据为空那就会去读数据库中的数据旧值脏数据读完之后把读到的结果写入缓存此时第一个线程已经将新的值写到缓存里面了这样缓存中的值就会被覆盖为修改前的脏数据。 解决方案 1先操作缓存但是不会删除缓存。将缓存修改为一个特殊值-999。客户端读缓存时发现是默认值就休眠一小会再去查一次Redis。 此方案存在的缺点 a. 特殊值对业务有侵入。 b. 休眠时间内可能会存在多次重复对性能有影响。 2延时双删。先删除缓存然后写数据库休眠一小会再次删除缓存。 此方案存在的缺点如果数据写操作频繁同样还是会有脏数据的问题。 总结在这种方式下通常要求写操作不会太频繁。 2、先写数据库再删缓存如果数据库写完了之后缓存删除失败数据就会不一致。 解决方案 1给缓存设置一个过期时间。 此方案存在的问题是过期时间内缓存数据不会更新。 2引入MQ保证原子操作。两个消费者一个消费者负责删除Redis 一个消费者负责写数据库。 解决方案将热点数据缓存设置为永不过期但是再value当中写入一个逻辑上的过期时间另外起一个后台线程扫描这些key对于已逻辑上过期的缓存进行删除。 总结始终只能保证一定时间内的最终一致性。 关注我升职加薪就是你