Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/extjs/3.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 Clojure';s`memoize`函数在缓存慢速sql查询和复杂计算时有用吗?_Caching_Clojure_Pure Function - Fatal编程技术网

Caching Clojure';s`memoize`函数在缓存慢速sql查询和复杂计算时有用吗?

Caching Clojure';s`memoize`函数在缓存慢速sql查询和复杂计算时有用吗?,caching,clojure,pure-function,Caching,Clojure,Pure Function,我的项目有一个mysql数据库和一个由Clojure编写的后端 数据库的某些表每天只更新一次,以查询最新的 我们将使用的信息 但是: 数据库非常大,网络速度很慢,所以每次查询都会很慢 花点时间 我们需要在每次查询之后进行复杂的计算 我们需要执行多种类型的sql查询,因此保存每个sql查询的结果是不现实的 我们需要经常更改计算函数,以便 调试的目的 在sql查询速度慢的情况下,所有的事情对我们来说都太慢了 幸运的是,我们的数据每天只更新一次,而且我们从数据库中的一些查询被频繁使用 因此,我们希望缓

我的项目有一个mysql数据库和一个由Clojure编写的后端

数据库的某些表每天只更新一次,以查询最新的 我们将使用的信息

但是:

  • 数据库非常大,网络速度很慢,所以每次查询都会很慢 花点时间

  • 我们需要在每次查询之后进行复杂的计算

  • 我们需要执行多种类型的sql查询,因此保存每个sql查询的结果是不现实的

  • 我们需要经常更改计算函数,以便 调试的目的

  • 在sql查询速度慢的情况下,所有的事情对我们来说都太慢了

    幸运的是,我们的数据每天只更新一次,而且我们从数据库中的一些查询被频繁使用

    因此,我们希望缓存常用的sql查询和中间结果

    Clojure的
    记忆功能对这类工作有用吗?我担心sql查询不是纯粹的,所以
    memoize
    不应该缓存它们的结果。但是在一天之内,我们的sql查询结果必须是相同的

    因此,我是否可以在一天内将结果记录下来,并在第二天自动更新结果


    谢谢你的帮助

    您应该使用缓存来实现这一点,例如。Gclojure.core.cache

    为了澄清注释:记忆化有助于纯函数:如果您的函数总是在给定相同输入的情况下返回相同的输出,那么您可以在计算一次后存储它

    如果输出随时间变化,则需要执行失效。带有失效的记忆(以及一些其他问题,如记忆内容的大小)被称为“缓存”

    如果您使用一个用于缓存的备忘录机制,那么您实际上要做的是在其上实现一个缓存。只使用缓存库的工作量要小得多

    在这种情况下,您需要实现类似“午夜失效”的功能。请参阅,以获取如何执行此操作的指针

    编辑:它可能看起来有点像这样(未经测试,今天带上你自己的
    ):


    为什么不clojure.core.memoize?谢谢你的代码。这正是我真正需要做这项工作的优雅方式。
    (defcache MidnightCache [cache dates]
      CacheProtocol
      (lookup [this key]
        (lookup this key nil))
      (lookup [this key not-found]
        (if (has? this key)
          (get cache key)
          not-found))
      (has? [this key]
        (let [d (get dates key)]
          (and d
               (= d (today)))))
      (hit [this key]
        this)
      (miss [this key new-value]
        (MidnightCache. (assoc (dissoc cache key)
                               key new-value)
                        (assoc (dissoc dates key)
                               key (today))))
      (evict [this key]
        (MidnightCache. (dissoc cache key)
                        (dissoc dates key)))
      (seed [this base]
        (MidnightCache. base
                        (zipmap (keys base)
                                (iterate identity (today))))))