gpt4 book ai didi

ruby - Sinatra 中的缓存变量

转载 作者:IT王子 更新时间:2023-10-29 06:10:12 25 4
gpt4 key购买 nike

我有一组约 60 个排序集,每个包含约 200 个我正在尝试处理的成员。以前我构建了一个 Redis (Lua) 服务器端脚本,但请求的大 (O) 时间值在负载下陷入困境。

我现在正尝试将处理工作卸载到 Ruby/Sinatra,并在每次请求时刷新结果,但事实证明这是低效的。鉴于下面的代码,有没有办法在 Sinatra 中缓存“分数”结果,这样我就不必在每次请求时都从 Redis 中提取?

global = redis.smembers("id_list")

i=0
scores = redis.pipelined do
global.each do |key|
redis.zrange("user:#{global[i]}",0,100,:with_scores => true)
i+=1
end
end

最佳答案

Sinatra 有一个全局范围,其中对象将在请求之间持久存在。如果您定义了一个记分员类,它为您的分数维护一个实例变量,那么您可以为保存该值的分数找到一个查找方法。例如:

class Scorekeeper
def initialize
@scores = nil
end

def scores
@scores ||= get_scores
end

def get_scores
global = redis.smembers("id_list")
i=0
scores = redis.pipelined do
global.each do |key|
redis.zrange("user:#{global[i]}",0,100,:with_scores => true)
i+=1
end
end
scores
end
end

现在您的 Sinatra 应用程序只需要在任何资源声明之外实例化记分员:

require 'sinatra'
keeper = Scorekeeper.new

get '/scores' do
keeper.scores
end

这样在第一次请求时,scores 属性将被填充,在所有进一步的请求中,它将使用缓存的值。

关于ruby - Sinatra 中的缓存变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20001588/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com