一致性问题是指当数据库中的数据发生更新时,如何保证Redis缓存中的数据也能及时更新,以避免数据不一致的情况发生。
缓存更新策略
内存淘汰:不用维护,Redis自动淘汰部分数据,只能一定程度下保证一致性,一致性差(LRU最久未使用算法);
超时剔除:通过expire()方法给缓存数据添加有效时间TTL,时间到期后自动删除,一致性一般;
主动更新:自己编写业务逻辑,每当修改数据库时,更新Redis缓存,一致性好;(Cache-Aside)
主动更新
更新:每当数据库更新,缓存都要更新,开销较大,可能很多是无效操作(用户没查); ×
删除:更新数据库时让缓存失效,用户查询时再去更新 √
;
那么是先删除缓存还是先删除数据库中的要更新的数据
结论:先修改数据库,再删除缓存
原因其实很好想:
在此情况下,线程2读到的是数据还未更新的值
-
Cache-Aside(旁路缓存)策略:
- 当应用程序需要获取数据时,首先从缓存中查询数据。
- 如果数据在缓存中存在,则直接返回给应用程序。
- 如果数据在缓存中不存在,则从数据库中获取数据,并将数据存储到缓存中,然后再返回给应用程序。
- 当数据库中的数据发生更新时,同时更新数据库和删除对应的缓存项。下次需要该数据时,按照上述步骤重新缓存。