Ruby on rails 在Rails中使用只读记忆类变量
我有一个rails应用程序,它有一个简单的类,叫做营养素。这涉及到一个包含大约150个营养项目和一些少量信息的表格。此数据在应用程序使用期间不会更改。由于这些项目使用得相当频繁,而且数据的总大小很小,我真的希望在内存中不断维护它们(以减少不必要的数据库或缓存访问) 因此,我研究了如何使用课堂记忆技术,即:Ruby on rails 在Rails中使用只读记忆类变量,ruby-on-rails,multithreading,class,global-variables,memoization,Ruby On Rails,Multithreading,Class,Global Variables,Memoization,我有一个rails应用程序,它有一个简单的类,叫做营养素。这涉及到一个包含大约150个营养项目和一些少量信息的表格。此数据在应用程序使用期间不会更改。由于这些项目使用得相当频繁,而且数据的总大小很小,我真的希望在内存中不断维护它们(以减少不必要的数据库或缓存访问) 因此,我研究了如何使用课堂记忆技术,即: class Nutrient < ApplicationRecord def self.all_cached @@all_nutrients ||= Nutrient.al
class Nutrient < ApplicationRecord
def self.all_cached
@@all_nutrients ||= Nutrient.all.to_a
end
end
class
在live rails应用程序中这样做安全吗?我担心线程的安全性,可能让不同的进程访问同一个阵列会降低速度或导致崩溃。
此营养素列表在应用程序启动后不会更改或变异。您使用这些值执行哪些控制器操作。不如将这些值存储在redis中,然后向redis查询这些值,这样做既快速又避免了对数据库的影响。在整个应用程序中,它们被大量不同的操作所使用。是的,所以这肯定是另一种选择,但在redis永远不会改变的时候,甚至去redis似乎都没有必要。毕竟,这仍然会比服务器上的内存慢得多。您查看了这个答案了吗?谢谢,但这仍然不能完全解决这个问题。会议绝对不是举行会议的场所。我想弄清楚的是,当多进程rails应用程序为只读时,您是否可以在其中安全地使用类变量,或者这会导致阻塞和并发崩溃。否则,我当然可以使用redis缓存,但最好知道,无论哪种方式,我都会在试图记忆类或类实例变量以跨请求缓存时遇到奇怪的、零星的错误,所以我避免了它。我使用Rails.cache.fetch跨请求缓存原语。但是没有ActiveRecord结果的答案。您使用这些值执行哪些控制器操作。不如将这些值存储在redis中,然后向redis查询这些值,这样做既快速又避免了对数据库的影响。在整个应用程序中,它们被大量不同的操作所使用。是的,所以这肯定是另一种选择,但在redis永远不会改变的时候,甚至去redis似乎都没有必要。毕竟,这仍然会比服务器上的内存慢得多。您查看了这个答案了吗?谢谢,但这仍然不能完全解决这个问题。会议绝对不是举行会议的场所。我想弄清楚的是,当多进程rails应用程序为只读时,您是否可以在其中安全地使用类变量,或者这会导致阻塞和并发崩溃。否则,我当然可以使用redis缓存,但最好知道,无论哪种方式,我都会在试图记忆类或类实例变量以跨请求缓存时遇到奇怪的、零星的错误,所以我避免了它。我使用Rails.cache.fetch跨请求缓存原语。但是没有ActiveRecord结果的答案。