【问题标题】:Caching dataset results in Sequel and Sinatra在 Sequel 和 Sinatra 中缓存数据集结果
【发布时间】:2015-01-29 19:50:11
【问题描述】:

我正在使用 Sinatra 以及 Sequel 作为 postgres 数据库上的 ORM 构建一个 API。

我有一些复杂的数据集要以分页方式查询,所以我想将数据集保存在缓存中,以便在第一次调用后跟踪下一页请求。

我已阅读 Sequel 数据集默认缓存,但我需要将此对象保留在 2 个请求之间以使此行为受益。 因此,如果再次调用相同的查询而不是每次都执行完整的新数据集,我想将这个对象放在某个地方以便稍后检索它。

我在 Sinatra 会话哈希中尝试过,但在将对象数据集放入其中时,我得到了 TypeError : can't dump anonymous class #<Class:0x000000028c13b8>

我想知道是否可以使用 memcached。

非常感谢任何关于最佳方式的建议,谢谢。

【问题讨论】:

  • 续集数据集根本不缓存,顺便说一句。

标签: ruby caching dataset sinatra sequel


【解决方案1】:

Memcached 或 Redis(使用 LRU)可能是您所描述的合适的解决方案。 Ruby Dalli gem 使开始使用 memcached 变得非常容易。你可以在https://github.com/mperham/dalli找到它。

在 Github 页面上,您将看到以下基本示例

require 'dalli'
options = { :namespace => "app_v1", :compress => true }
dc = Dalli::Client.new('localhost:11211', options)
dc.set('abc', 123)
value = dc.get('abc')

这说明了使用 gem 的基础知识。考虑一下 Memcached 只是一个利用 LRU(最近最少使用)影响的键/值存储。这意味着您将内存分配给 Memcached 并让您的密钥自然过期,除非有 reason 手动使密钥过期。

从那里开始,它变得简单地尝试从 memcached 中获取一个键,然后只有在没有找到匹配项时才运行真正的查询。

found = dc.get('my_unique_key')
unless found
  # Do your Sequel query here
  dc.set('my_unique_key', 'value_goes_here')
end

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-01
    • 2015-08-22
    • 1970-01-01
    • 2017-07-03
    • 2011-01-06
    • 1970-01-01
    相关资源
    最近更新 更多