0

我正在将我的应用程序(单个客户端)转换为多租户应用程序。

我曾经将一些设置(很少更改/非常频繁访问)存储到全局变量(哈希)中。应用程序启动时,此全局变量的值已从数据库中提取。显然,这些设置特定于客户/租户。

我现在看到了一些选项,但没有一个看起来不错:

  • 保留全局哈希,但引入租户的概念,$global[:client1][:settingX]但这感觉不好/可扩展/安全
  • 每次都调用数据库,但我担心性能会受到影响(大约 40 次额外调用数据库)

我可以用 Memcache 做些什么吗?但我不知道从哪里开始选项。

注意:该应用程序托管在 Heroku 上

4

1 回答 1

0

这听起来像是使用 memcached 或 redis 的一个很好的论据。您需要一个集中的地方,这些值可以存放在您的所有应用程序服务器池中。您的用例主要通过偶尔写入来更新值来读取。

我将构建一个货币助手,每次请求从 memcached/redis 延迟加载一次,然后保存货币汇率数据以用于该请求中的任何价值计算。

我不知道您的问题域,但我们假设您正在尝试向系统中的不同用户提供本地货币定价,并且不同用户的费率不同(即:折扣等)。

class CurrencyHelper
  attr_reader :currency_rates

  def initialize(user_id)
     @currency_rates = load_or_generate_exchange_rates
  end

  def load_or_generate_exchange_rates
    key = "/currency/rates/#{user_id}"
    REDIS.get(key) || begin
      rates = generate_exchange_rates
      REDIS.put(key, rates)
      rates
    end
  end

  def convert_from_usd_to(amount_usd, currency)
    round_money( usd * currency_rates[currency] )
  end
end

在您的控制器代码中:

  def currency_helper
    @currency_helper ||= CurrencyHelper.new(current_user.id)
  end

  def show
    localized_price = currency_helper.convert_from_usd_to(price_usd, params[:country_code])
  end
于 2013-02-06T16:42:58.340 回答