当memecached或Redis用于数据存储缓存时。当值改变时,如何更新缓存?
例如。如果我第一次从缓存中读取key1并且它丢失了,那么我拉取value1并将key1 = value1放入缓存中。
之后,如果key1的值更改为value2。 缓存中的值如何更新或无效?
这是否意味着key1的值发生变化。应用程序或数据库是否需要检查此key1是否在缓存中并更新它?
答案 0 :(得分:7)
由于您使用的是缓存,必须容忍数据不一致问题,即在某个时间点,缓存中的数据与数据库中的数据不同。
每当值发生变化时,您都不需要更新缓存中的值。否则,整个缓存系统将非常复杂(例如,您必须维护已缓存的密钥列表),也可能没有必要这样做(例如,键值可能只使用一次,不需要更新它。)
我们如何更新缓存中的数据并保持缓存系统简单?
通常,除了在缓存中设置或更新键值对之外,我们还为每个键设置TIMEOUT
。之后,客户端可以从缓存中获取键值对。但是,如果密钥达到超时,则缓存系统会从缓存中删除键值对。这称为THE KEY HAS BEEN EXPIRED
。下一次,客户端试图从缓存中获取该密钥,将一事无成。这称为CACHE MISS
。在这种情况下,客户端必须从数据库中获取键值对,并使用新的超时将其更新为缓存。
如果数据已在数据库中更新,而密钥尚未在缓存中过期,则客户端将获得不一致的数据。但是,当密钥已过期时,其值将从数据库中检索并由某个客户端插入到缓存中。之后,其他客户端将获得更新的数据,直到数据再次更改为止。
如何设置超时?
通常,有两种过期策略:
N
秒/分钟/小时...... 大的超时可以在很大程度上减少数据库的负载,而数据可能会在很长一段时间内过时。小的超时可以尽可能地使数据保持最新,而数据库将负载很重。所以你必须在设计超时时平衡权衡。
Redis如何过期密钥?
Redis有两种方法可以使密钥过期:
答案 1 :(得分:1)
您可以简单地清空 api 函数中的特定缓存值,在该函数中执行该特定值的插入或更新。这样服务器会在下一个请求中获取更新的值,因为你已经清空了缓存值。
这是一张图,让您更容易理解: