我正在将我的应用程序(单个客户端)转换为多租户应用程序。
我曾经将一些设置(很少更改/经常访问)存储到全局变量(哈希)中。 应用程序启动时,此全局变量的值已从数据库中拉出。 显然,这些设置特定于客户/租户。
我现在看到一些选项,但它们似乎都不好看:
$global[:client1][:settingX]
的概念,但这感觉不太好/可扩展/安全我有什么可以用Memcache做的吗?但我不知道从哪里开始选择。
注意:该应用程序托管在Heroku上
答案 0 :(得分: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