如何使缓存保持最新

时间:2017-07-29 03:18:25

标签: caching redis memcached

当memecached或Redis用于数据存储缓存时。当值改变时,如何更新缓存?

例如。如果我第一次从缓存中读取key1并且它丢失了,那么我拉取value1并将key1 = value1放入缓存中。

之后,如果key1的值更改为value2。 缓存中的值如何更新或无效?

这是否意味着key1的值发生变化。应用程序或数据库是否需要检查此key1是否在缓存中并更新它?

2 个答案:

答案 0 :(得分:7)

由于您使用的是缓存,必须容忍数据不一致问题,即在某个时间点,缓存中的数据与数据库中的数据不同。

每当值发生变化时,您都不需要更新缓存中的值。否则,整个缓存系统将非常复杂(例如,您必须维护已缓存的密钥列表),也可能没有必要这样做(例如,键值可能只使用一次,不需要更新它。)

  

我们如何更新缓存中的数据并保持缓存系统简单?

通常,除了在缓存中设置或更新键值对之外,我们还为每个键设置TIMEOUT 。之后,客户端可以从缓存中获取键值对。但是,如果密钥达到超时,则缓存系统会从缓存中删除键值对。这称为THE KEY HAS BEEN EXPIRED。下一次,客户端试图从缓存中获取该密钥,将一事无成。这称为CACHE MISS。在这种情况下,客户端必须从数据库中获取键值对,并使用新的超时将其更新为缓存。

如果数据已在数据库中更新,而密钥尚未在缓存中过期,则客户端将获得不一致的数据。但是,当密钥已过期时,其值将从数据库中检索并由某个客户端插入到缓存中。之后,其他客户端将获得更新的数据,直到数据再次更改为止。

  

如何设置超时?

通常,有两种过期策略:

  1. N秒/分钟/小时......
  2. 过期
  3. 在某个未来时间点过期,例如2017/7/30 00:00:00到期
  4. 大的超时可以在很大程度上减少数据库的负载,而数据可能会在很长一段时间内过时。小的超时可以尽可能地使数据保持最新,而数据库将负载很重。所以你必须在设计超时时平衡权衡

      

    Redis如何过期密钥?

    Redis有两种方法可以使密钥过期:

    1. 当客户端尝试操作密钥时,Redis会检查密钥是否已达到超时。如果是这样,Redis会删除密钥,就好像密钥不存在一样。通过这种方式,Redis可确保客户端无法获得过期数据。
    2. Redis还有一个到期线程,它以配置的频率对密钥进行采样。如果密钥达到超时,Redis将删除这些密钥。通过这种方式,Redis可以加速密钥到期过程。

答案 1 :(得分:1)

您可以简单地清空 api 函数中的特定缓存值,在该函数中执行该特定值的插入或更新。这样服务器会在下一个请求中获取更新的值,因为你已经清空了缓存值。

这是一张图,让您更容易理解: Redis Caching Architecture diagram