我在考虑在Web服务器中缓存动态内容。我的目标是通过返回缓存的HTTP响应来桥接整个处理过程,而不必打扰数据库(或Hibernate)。这个问题不涉及选择现有缓存解决方案之间的选择;我目前关注的是失效。
我确定,基于时间的失效根本没有意义:每当用户更改任何内容时,他们都希望立即看到效果,而不是在几秒钟甚至几分钟后才看到。而且,在短时间内(因为大多数数据是特定于用户的),缓存一小部分秒钟是无用的,因为没有针对相同数据的重复请求。
对于每个数据更改,我都会收到一个事件,并可以使用它来使依赖于更改数据的所有内容失效。由于请求是同时发生的,所以存在两个与时间相关的问题:
- 使失效可能太晚了,可能会向已更改数据的客户端提供陈旧的数据。 - 在失效完成后,长时间运行的请求可能会完成,并且其陈旧的数据可能被放入缓存。
这两个问题在某种程度上是相反的。我猜,前者很容易通过针对相同客户端的
后者更为严重,因为它基本上意味着一个“失效的失效”,并永远(或太久)提供陈旧的数据。
我可以想像一种解决方案,就是在每个请求之后重复失效,以便于在更改发生之前启动。但这听起来相当复杂和耗时。我想知道是否有任何现有的缓存支持这个功能,但我主要感兴趣的是如何实现这个功能。
澄清:
问题是一个简单的竞争条件:
- 请求 A 执行查询并获取结果 - 请求 B 进行了一些更改 - 由于 B,使失效发生 - 延迟某些原因,请求 A 完成 - 请求 A 的过时的响应被写入缓存
我确定,基于时间的失效根本没有意义:每当用户更改任何内容时,他们都希望立即看到效果,而不是在几秒钟甚至几分钟后才看到。而且,在短时间内(因为大多数数据是特定于用户的),缓存一小部分秒钟是无用的,因为没有针对相同数据的重复请求。
对于每个数据更改,我都会收到一个事件,并可以使用它来使依赖于更改数据的所有内容失效。由于请求是同时发生的,所以存在两个与时间相关的问题:
- 使失效可能太晚了,可能会向已更改数据的客户端提供陈旧的数据。 - 在失效完成后,长时间运行的请求可能会完成,并且其陈旧的数据可能被放入缓存。
这两个问题在某种程度上是相反的。我猜,前者很容易通过针对相同客户端的
ReadWriteLock
部分序列化请求来解决。所以我们忘记它。后者更为严重,因为它基本上意味着一个“失效的失效”,并永远(或太久)提供陈旧的数据。
我可以想像一种解决方案,就是在每个请求之后重复失效,以便于在更改发生之前启动。但这听起来相当复杂和耗时。我想知道是否有任何现有的缓存支持这个功能,但我主要感兴趣的是如何实现这个功能。
澄清:
问题是一个简单的竞争条件:
- 请求 A 执行查询并获取结果 - 请求 B 进行了一些更改 - 由于 B,使失效发生 - 延迟某些原因,请求 A 完成 - 请求 A 的过时的响应被写入缓存