一、双写模式
修改数据库之后,也把缓存的内容修改。
缺点:
1、但修改完数据库之后还需要查一下数据库,然后把内容封装写入redis,也加重了数据库访问
2、暂时的脏数据问题:有两次修改数据库的请求,在第一次修改的时候 由于卡顿问题,第二次修改请求也开始执行,并且修改完缓存,这时候第一次的请求恢复正常,开始修改缓存,就导致了最终的缓存时第一次修改的内容,而数据库内容是第二次修改的内容,出现缓存与数据库不一致现象,但是数据趋于稳定的时候,缓存过期了最终回读到与数据库一直的数据
二、失效模式
数据库更新之后,删除缓存,下一次访问就会查到最新的数据并且缓存
缺点 暂时脏数据问题: 还是有两个改数据请求,第一个修改数据库, 并且删除缓存成功了,这时候第二个改数据请求也发起了,正在修改数据库,但是同时来了一个读数据的请求,这时候读数据,发现没有缓存,于是从数据库读取数据,读到了第一次修改数据库的内容,这个时候第二次改数据的请求刚修改完数据库,并且执行了删缓存的操作,之后读数据的请求才开始更新缓存,于是还是同样的情况,数据库的内容时第二次修改的内容,缓存的内容时第一次修改的内容。
解决方案
1、给缓存设置到期时间,减少脏数据的存活时间
2、添加读写锁,从把修改数据库和修改缓存变成相对原子操作,抱着读取到最新的数据