【问题标题】:Caching text file contents in Sinatra在 Sinatra 中缓存文本文件内容
【发布时间】:2012-05-25 03:43:26
【问题描述】:

我是 Sinatra 和网络编程的新手,所以使用的一些术语可能不太正确。总之……

我有一个应用程序将 .txt 逐行读取到一个数组中,然后当您加载 index.html.erb 时,它会随机显示其中一行。我将内容放在文本文件中,而不是直接放入数组中,这样如果我需要添加更多数据,则更容易更新,然后直接添加到数组中并重新部署应用程序。我担心的是它是否在每次加载页面时重新创建数组并重新读取文件。我不知道这种东西在服务器端是如何工作的,或者如何检查它。创建数组的代码如下:

before do
  @ways ||= ['']
  if @ways[1].nil?
    File.open('ways.txt', 'r').each_line { |line| @ways << line }
  end
end

然后是我的路线:

get '/' do
  @way = @ways.sample

  erb :index
end

有没有办法确保尽可能高效?还是应该完全以其他方式完成?根据 Chrome 开发工具,每页加载传输约 800b。

【问题讨论】:

  • 提示:获取随机数组元素使用@ways.sample

标签: ruby caching sinatra


【解决方案1】:

您在此处编写的内容确实会在每次请求时将文件读入数组。

提示:您可以使用 @ways = File.readlines('ways.txt')

使其更短、更快

如果你想缓存这个数组,你可以在应用启动时作为一个常量来做,例如:

WAYS = File.readlines('ways.txt').map(&:chomp)
get "/" do
  @way = WAYS.sample
  erb :index
end

但是,如果您编辑了文本文件,则需要退出并重新启动服务器。如果您想避免这种情况,您可以在 before 操作中检查文件的修改时间,如果内容已更改,则仅更新数组(replace 它)。

如果您在最后一个建议方面需要帮助,请告诉我,我可以根据需要进行编辑。


编辑:这是使用常量保存数据并仅在文件更改时重新加载的一种方法:

WAYS = { file:'ways.txt', all:[] }
before do
  if WAYS[:updated] != (mtime=File.mtime(WAYS[:file]))
    WAYS[:all].replace File.readlines(WAYS[:file]).map(&:chomp)
    WAYS[:updated] = mtime
  end
end
get "/" do
  @way = WAYS[:all].sample
  erb :index
end

这有点激进——检查每个请求的文件修改时间——但除了最重的负载或最慢的磁盘之外,性能应该没问题。

另一种解决方案是每隔几分钟启动一个线程来强制检查/更新数组,例如

require 'sinatra'

WAYS = { file:'ways.txt', all:[] }
Thread.new do
  loop do
    if WAYS[:updated] != (mtime= File.mtime(WAYS[:file]))
      WAYS[:all].replace File.readlines(WAYS[:file]).map(&:chomp)
      WAYS[:updated] = mtime
    end
    sleep 5 # seconds
  end
end

get '/' do
  WAYS[:all].sample
end

【讨论】:

  • 我明白你的意思,但如果你能把它充实一点,我将不胜感激。
  • 这太棒了!你给了我很多阅读。非常感谢!
  • 完全实用。我有一个 Web 应用程序,它使用线程 (a) 一次睡眠 5 分钟(在发送排队的电子邮件之间)和 (b) 一次睡眠 24 小时(使用一次更新数据库中的非规范化统计表- 日快照)。
  • @thekungfuman 不,实例变量是特定于请求的;您需要一个跨请求持续存在的数据结构
  • 糟糕!我有一个错字。固定的。我已经编辑了答案以包含一个在本地对我有用的完整独立示例(经过测试)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-01-09
  • 2013-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-29
  • 1970-01-01
相关资源
最近更新 更多