Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Caching 缓存失效策略_Caching_Redis - Fatal编程技术网

Caching 缓存失效策略

Caching 缓存失效策略,caching,redis,Caching,Redis,在我当前的应用程序中,我们正在处理一些很少更改的信息 对于性能优化,我们希望将它们存储在缓存中 但问题在于每当更新这些对象时都会使其无效 我们尚未最终确定缓存产品。 当我们在Azure上构建此应用程序时,我们可能会使用Azure Redis缓存 一种策略是在更新API中添加代码,这将使缓存中的对象无效。 我不确定这是否是一种干净的方式? 我们不希望使用基于时间(TTL)的缓存过期时间。 您能推荐一些用于缓存失效的其他策略吗?在更新阶段使缓存失效是一种可行的方法,在过去曾被大量使用 当更新发生时,

在我当前的应用程序中,我们正在处理一些很少更改的信息 对于性能优化,我们希望将它们存储在缓存中
但问题在于每当更新这些对象时都会使其无效
我们尚未最终确定缓存产品。
当我们在Azure上构建此应用程序时,我们可能会使用
Azure Redis缓存

一种策略是在
更新API
中添加代码,这将使缓存中的对象无效。
我不确定这是否是一种干净的方式?
我们不希望使用基于时间(TTL)的缓存过期时间

您能推荐一些用于缓存失效的其他策略吗?

在更新阶段使缓存失效是一种可行的方法,在过去曾被大量使用

当更新发生时,这里有两个选项:

  • 您可以尝试在更新操作期间设置新值,或
  • 只需删除旧的在读取操作期间更新
  • 如果您想要一个,那么UPDATE可能只是删除旧值,并且在第一次提取对象时,您将在从实际数据库读取后再次创建它。但是,如果您知道缓存非常小,并且正在使用另一个主数据库处理不同于数据大小的问题,则可以在更新期间直接更新

    然而,所有这些都不足以完全一致。
    例如,当您向数据库写入数据时,
    Redis
    缓存可能会在几秒钟内不可用,因此这两个缓存之间的数据保持不同步。
    在这种情况下你会怎么做?
    您可以同时使用多个选项

  • 无论如何都要设置TTL,以便最终刷新损坏的数据
  • 使用惰性读取修复。从数据库读取数据时,请不时与主数据库检查值是否匹配。如果没有,则更新(或删除)缓存项
  • 使用历代记录或类似方式访问数据。不总是可能的,但是有时您可以访问关于给定对象的缓存数据。如果可能,您可以在每次修改对象ID/句柄时对其进行更改,这样就不可能访问缓存中的过时数据:每个键名都引用对象的特定版本
  • 因此,更新时del cache和读取时write cache是基本策略,但您可以使用其他附加系统来最终修复不一致性

    实际上还有另一个选项,而不是使用上述选项,那就是使用Redis
    SCAN
    进行后台处理,以便在出现不一致时逐个键进行验证。此过程可能很慢,并且可以针对数据库的副本运行

    正如您在这里看到的,主要思想始终是一样的:如果缓存更新失败,不要让它成为永久性的问题,可能会永远存在,给它一个机会在以后修复自己。

    我认为lambda(ish)体系结构适合您的用例

  • 即时业务使用的实时更新
  • 批量加载数据以修复任何失败的记录
  • 批量数据加载以删除无效/存档记录中的任何内容
  • 对于实时更新,您必须处理应用程序的代码库,以便将数据写入数据库和缓存

    对于批量数据加载,您可以查看诸如logstash/fluentd之类的数据摄取工具,从数据库中“提取”最新数据并将其推送到缓存中。这可以基于始终递增的列(ID号或时间戳)来完成


    我这边有Oracle数据库。Logstash JDBC插件在获取最新记录方面做得不错。logstash输出可以格式化并打印到Redis可以使用的文件中。我编写了一个小bash脚本来协调这一点。测试了300万条记录,工作正常。

    del cache on update
    在同时调用fetch操作且值不在缓存中时,可能会导致踩踏,所有请求都将转到数据库。可以使用锁定或其他策略来避免这种情况。因此,在读取期间更新缓存可能是一个更好的选择。