导航网站怎么做点击网站建设的重要性
-
用户更新数据库,需要再去更新redis缓存,否则会造成缓存与数据库数据不一致
-
一致性的两种方法
1). 双写模式
更新完数据库之后,更新redis缓存数据
问题: 因为请求时间的问题,造成缓存数据不是最新的 数据。
原因:A先修改key为1,B后修改key为5,mysql先更新为1,后为5,随后更新redis缓存的时候,由于A请求时间过慢,B先更新key为5,最后的结果是缓存key为A修改的1。数据库为5,缓存为1,数据不一致。
2). 失效模式
更新完数据库之后,删除缓存数据,下次新的请求进来再去请求数据库,再去更新缓存。
问题:由于请求时间问题,会造成脏数据,缓存与数据库不一致。
原因:A修改数据库key为1,删除缓存
B修改数据库key为5,在进行修改mysql未完成
D到缓存查询key为null,到数据库查询key(此时还是1),随后存到缓存中(在进行,未完成)
B此时修改数据库完成,缓存此时还是空不需要删除
D在B 存mysql和redis完成之后,更新了key为1
这种情况导致数据库是最新的,但是仍然是A的旧数据,数据不一致。
- 解决数据一致性方法
可以将整个更新过程进行加锁,更新mysql和更新缓存数据加锁,执行完毕再unlock,下一个线程才能进来。
但是这种方法会导致服务变慢。
如果数据经常修改,加锁会慢。如果要求实时读取,直接读取数据库,缓存里面加上过期时间。