caching - 缓存依赖

标签 caching architecture redis

我开始为分布式系统实现缓存,我的系统运行在许多独立的服务和多种语言(C#、Java、AngularJS 等)中。

在查看了几种方案后,我选择用Redis来实现缓存部分。 在缓存解决方案的设计过程中,我注意到我有很多缓存依赖项,解决这个问题的最简单方法是保存一个管理所有依赖项的表(键 ->需要在缓存上删​​除\更新的项目的多值)关键改变的时间)。 问题是这是否是实现缓存依赖的正确方法? 我想每个使用缓存的软件都会遇到缓存依赖的挑战,所以我确信有更好的解决方案。

缓存依赖示例 - 如果缓存处理了所有用户的列表,并且有人删除或添加了新用户到系统,如果用户没有在缓存上更新,那么系统将显示错误的列表用户。

谢谢。

最佳答案

缓存失效是一个 super 难题。然而,解决方案有很多。保留缓存对象和可能更新的关联域对象的集合(在 Redis 或其他地方)是一种合理的方法。

对于复杂的相互依赖的缓存,有很多方法,包括俄罗斯娃娃缓存和 key-based caching .

基于 key 的缓存的基本概念是拥有一个复杂的缓存 key ,其中包括固定标识符和动态标识符。

例如,如果您想要为用户 #123 缓存一个名为“user_navigation_bar”的对象/片段,您可以将缓存写入 user_nav_bar:123:201705071122 这样的键。最后一部分是用户更新时的时间戳。这是动态部分,每次用户执行操作时都会发生变化。要读取缓存,您只需要用户 ID 和更新时间戳。对于示例中的用户列表,您可以对所有用户使用最近创建/更新的时间戳,或者拥有一个 UserList 对象,您可以在创建/更新用户时更新时间戳。

通过这种方法,您永远不会更新或删除任何内容。所有对缓存的写入都是针对全新的键。

您不应该自己删除缓存项目。如果您将 Redis 配置为最大内存大小和 LRU eviction policy (最近最少使用)它会自动清除最长时间未访问的缓存项。随着“user_navigation_bar”等项目被更新并写入具有新时间戳的新对象,旧的将不再被访问并最终将被清除。

如果您将 Redis 用于缓存对象之外的其他用途,您可能需要运行多个实例。一种配置为 LRU 缓存,具有固定的最大内存大小,并且可能没有持久性。另一个更像是默认的 redis 安装,没有最大内存和永久对象的持久性。

如果您使用单个 Redis 实例,您可以为缓存对象设置长期过期时间,并使用 volatile-lru 驱逐策略,这样 Redis 只会清除设置了过期时间的键。如果您使用此方法,请确保将最大内存设置得足够高,以便有足够的空间容纳所有永久数据。

您的问题非常广泛,但希望这会有所帮助。

关于caching - 缓存依赖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43826095/

相关文章:

java - 如何使用 Spring SimpleCacheManager 缓存多个列表?

web-services - 微服务和 "single point of failure"概念

memory - 查看Redis v2.8的总内存

redis - 迁移 Redis 数据到集群

lua - Redis 集群 : Find which master holds particular key/slot

java - 时钟缓存算法

c# - ASP.net 如何在控件公共(public)属性上输出缓存 webusercontrol

c - 如何获取指定架构(x86、pic Controller )中的芯片名称和可寻址内存?

c++ - 线程体系结构问题 C++ 消息传递

php - 缓存zend framework 2 php代码执行结果