如何保持最新状态

use*_*415 9 memcached caching redis

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

例如。如果我是第一次从缓存中读取key1,而它却错过了,那么我将value1提取并将key1 = value1放入缓存中。

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

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

for*_*ack 10

由于您使用的是缓存,因此必须忍受数据不一致的问题,即在某些时候,缓存中的数据不同于数据库中的数据。

只要更改了值,就无需更新缓存中的值。否则,整个缓存系统将非常复杂(例如,您必须维护已缓存的键的列表),并且也可能不需要这样做(例如,键值只能使用一次,而无需使用进行更新)。

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

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

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

如何设置超时时间?

通常,有两种到期策略:

  1. N秒/分钟/小时为单位过期...
  2. 在某个未来时间点到期,例如在2017/7/30 00:00:00到期

较大的超时可以大大减少数据库的负载,而数据可能很长一段时间都已过期。较小的超时可以使数据尽可能保持最新,而数据库将负担沉重。因此,在设计超时时必须权衡取舍

Redis如何使密钥失效?

Redis有两种使密钥失效的方法:

  1. 当客户端尝试对某个键进行操作时,Redis将检查该键是否已达到超时。如果是这样,Redis会删除密钥,并像密钥不存在一样起作用。这样,Redis可确保客户端不会获取过期数据。
  2. Redis还具有一个到期线程,该线程以配置的频率对密钥进行采样。如果密钥达到超时,Redis将删除这些密钥。这样,Redis可以加快密钥的过期过程。


小智 5

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

这是一个图表,可以让您更容易理解: Redis缓存架构图