在操作Redis的缓存更新策略的时候,需要考虑三个问题:
- 是删除缓存还是更新缓存
- 如何保证缓存与数据库更新的操作同时成功呢?
- 是先操作缓存还是先操作数据库呢?
对于第一个问题,有两种可能性:
- 更新缓存:每次更新数据库更新缓存,无效写操作较多
- 删除缓存:更新数据库时让缓存失效,查询的时候在更新缓存
第二个问题:可以将缓存与更新数据库操作放在一个事物中
第三个问题:
- 是先删除缓存,在操作数据库
- 先操作数据库,在删除缓存
以上图片是先删除缓存,在操作数据库:情况是有两条线程同时执行,当第一条线程删除了缓存,但是在这个时候第二条线程进来了,由于没有查询到缓存,则会去数据中查询,但此时数据库还没有更新,所以查出来的是旧数据,并将旧数据写入到缓存中,等到结束后,第一条线程才开始更新数据库,这样就会导致数据库的值与缓存的值不一致;
以上是先操作数据库,后在进行删除缓存,当线程一的缓存失效,要查询数据库,查完后准备写入缓存,但是第二条线程进入,更新了数据库,在删除了缓存,这时候第一条才写入缓存,这样也会造成问题,但是这个操作明显比第一个操作来的更加难发生,一般情况下更新是比查询要慢许多的,所以推荐先操作数据库,后在进行删除缓存