- 缓存的主动更新和被动更新
主动更新是指在数据发生变化时,应用程序主动更新缓存。这种方式需要应用程序去检测数据的变化,并主动更新缓存。例如,一些系统会使用定时任务或者轮询的方式来检测数据的变化,一旦发现数据发生变化,就会主动更新缓存。这种方式数据及时性较高,可以保证缓存和数据源之间的数据一致性。
被动更新是指数据使用程序需要时才被动更新缓存。当应用程序需要使用数据时,会先从缓存中获取数据,如果缓存中没有数据或者数据已经过期,则从数据源中获取最新数据并更新缓存。这种方式不需要应用程序去检测数据的变化,可以减少应用程序的负担。但是,如果数据频繁变化,缓存中的数据可能会长时间不更新,导致缓存和数据源之间的数据不一致。
- 什么情况下需要考虑使用两级缓存?
我遇到的情况是,本来接口程序的负载数量不多,大概10个左右的时候,一级缓存能够满足业务的使用场景,后边因为调用数量激增,在将负载数量增大到25个以上的时候,发现接口程序偶发的调用时间不满足业务要求。
造成这种问题的主要原因是,1.读取数据库的访问压力变大;2.缓存命中率变得很低。
补充一下,我的缓存更新策略是被动更新的,一级缓存用的是内存缓存。
在这种情况下,增加Redis缓存作为二级缓存,问题被大大的解决
- 二级缓存哪个是一级
一级缓存指的是更靠近程序或者说更靠近数据使用者的一层,通常把内存缓存当作一级缓存。
二级缓存值得是原理程序或者说数据使用者的一层,常见的二级缓存是Redis。
- 多负载情况下,两级缓存比一级缓存较少对数据库的访问次数
在一级缓存中,每个实例或负载都有自己的缓存,当数据发生变化时,所有的缓存都需要被更新。因此,在多实例或多负载的环境中,如果一个实例或负载的数据发生变化,其他实例或负载的缓存也需要被更新,这会导致更多的数据库访问。
相比之下,两级缓存通常包括一个共享的二级缓存,它被多个实例或负载共享。当数据发生变化时,只需要更新共享的二级缓存,而不需要更新每个实例或负载的缓存。这样可以减少对数据库的访问次数,提高性能和效率。
- 关于两级缓存的缓存时长计算
首先,两级缓存中数据在缓存中可能停留的最大时长,为两级缓存时长的累加,比如一级缓存时长为T1,二级缓存的缓存时长为T2,那么两级缓存中数据停留最长时长为T1+T2
然后,两级缓存中数据在缓存中停留的最短时长,为两级缓存中更短的那个时长,比如比如一级缓存时长为T1,二级缓存的缓存时长为T2,那么两级缓存中数据停留最长时长为min(T1, T2)。这里多聊两句,比如一级缓存的时长为15分钟,二级缓存的时长为10分钟,有人会觉得,那么数据停留最短时长应该是15分钟啊,这里边有一个误区,停留时间不一定是被调用的,如果为主动更新到二级缓存,一级缓存没有被人调用过的话,那数据只会在二级缓存中停留10分就被更新掉了。如果是被动更新的情况下,我觉得数据最小停留时长确实应该是15分钟(不过这里先存疑,我会在后边进行验证和解释)。
- 关于两级缓存的各级缓存时长怎么设定的问题
数据的重要性和变化频率:如果数据非常重要且频繁变化,最小值应该相对较小,以便能够及时获取最新的数据。如果数据重要性较低或变化频率较低,最小值可以适当增大。
系统性能和可用性要求:如果系统对性能要求较高或对可用性要求较高,最小值应该相对较小,以便能够快速响应请求和提高系统的可用性。
缓存系统本身的限制:不同的缓存系统有不同的限制和特点,最小值的计算需要考虑这些因素。例如,一些缓存系统可能会有最小缓存时间的限制,因此最小值需要根据这些限制进行计算。
分布式系统的同步机制:在分布式系统中,缓存的同步机制也会影响最小值的计算。如果系统采用同步机制进行缓存更新,最小值应该相对较小,以便能够及时同步数据。如果采用异步机制,最小值可以适当增大