关注功能分析
首先确定的是关注操作并非一个非常高频的操作,但也算是经常使用的,那么我们就考虑使用缓存去分担一部分数据库的压力,这里与其说是讨论关注功能的几种实现方法,不如说是讨论有几种方法进行缓存更新。
1、Cache Aside Pattern
- 失效:应用程序先从cache取数据,没有得到,则从数据库中取数据,成功后,放到缓存中。
- 命中:应用程序从cache中取数据,取到后返回。
- 更新:先把数据存到数据库中,成功后,再让缓存失效。
分析一下这个方法是否并发安全。如果并发从cache种读取数据,那么有两种情况,1、cache中有数据,那么命中,并发安全。2、cache中没有数据,查询数据库查成功后放入缓存,这个放入缓存的操作如果缓存中的数据结构是set等就并发安全,其余的可能得查重防止数据冗余。 然后讨论一下更新操作,并发删除缓存是安全的。
除了这些情况以外,有没有可能读到旧数据呢,我们更新到数据库的之后,在缓存失效前,如果有一个线程读取数据,那么此时读到的数据不就是旧数据吗???
这种情况的概率比较小,并且影响不大,由于是低概率事件,且如果碰巧读到了一个旧数据,那么只需要刷新一次就有新数据了
可能更加严重的是这种情况:一个是读操作,但是没有命中缓存,然后就到数据库中取数据,此时来了一个写操作,写完数据库后,让缓存失效,然后,之前的那个读操作再把老的数据放进去,这样缓存就一直都是老数据,和数据库的数据可能要要等到下一次更新时才会同步,这期间读取的数据全是旧数据。
但是这种情况的发生比较困难,因为写操作的时间要长于读操作,发生这种情况的条件是在读操作从数据库取数据的时间要发生在写操作写数据库前,并且读操作更新缓存的时间要在写操作让缓存失效之后, 这样来看读操作的时间长于写操作,所以一般不可能发生