是否可以指定具有片段缓存的缓存或确定特定调用的缓存命中/未命中率
is it possible to specify a cache with fragment caching or determine cache hit / miss ratio for a specific call
我们有一个 Rails 4.2 应用程序,目前正在多个应用程序之间使用共享缓存。我们的 memcached 未命中率非常高(例如 85% 的命中率和 15% 的未命中率),但由于多个应用程序共享同一个 memcached 实例这一事实使情况变得复杂。因此,我们可能会发现几个关键缓存进程的未命中率很高(我们的 DataDog 数据会支持这一点)。
是否可以在碎片缓存调用中指定缓存存储,例如:
cache(order, OrderCache) do
# whatever
end
我认为这可以通过对象缓存来实现,方法如下:
OrderCache = ActiveSupport::Cache::MemCacheStore.new
是否有其他方法可以解决特定缓存操作的命中/未命中率问题?
也许这是一个复杂的想法,但我认为如果我正确理解您的问题,您可以制作自己的缓存存储包装器来决定使用哪个缓存存储。
调用缓存方法时,它最终会调用控制器 https://apidock.com/rails/AbstractController/Caching/Fragments/read_fragment 上的 read_fragment
和 write_fragment
,这些方法会调用 cache_store.read
和 cache_store.write
。
然后您可以使用自定义 read
和 write
方法创建自定义缓存存储 class,根据选项,将读取和写入委托给真正的缓存存储。
class MyCacheStore < ...
def initialize
@my_catchall_store = ActiveSupport::Cache::MemCacheStore.new
@my_order_store = ActiveSupport::Cache::MemCacheStore.new
end
def read(key, options)
case options[:store]
when :order_store then @my_order_store.read(key, options)
else
@my_catchall_store.read(key, options)
end
end
# similar for .write
然后你就可以像...
cache(:order, store: :order_store) do
# some code
end
cache(:something_else) do
# some code
end
抱歉,我不确定你问的是不是这个。
我们有一个 Rails 4.2 应用程序,目前正在多个应用程序之间使用共享缓存。我们的 memcached 未命中率非常高(例如 85% 的命中率和 15% 的未命中率),但由于多个应用程序共享同一个 memcached 实例这一事实使情况变得复杂。因此,我们可能会发现几个关键缓存进程的未命中率很高(我们的 DataDog 数据会支持这一点)。
是否可以在碎片缓存调用中指定缓存存储,例如:
cache(order, OrderCache) do
# whatever
end
我认为这可以通过对象缓存来实现,方法如下:
OrderCache = ActiveSupport::Cache::MemCacheStore.new
是否有其他方法可以解决特定缓存操作的命中/未命中率问题?
也许这是一个复杂的想法,但我认为如果我正确理解您的问题,您可以制作自己的缓存存储包装器来决定使用哪个缓存存储。
调用缓存方法时,它最终会调用控制器 https://apidock.com/rails/AbstractController/Caching/Fragments/read_fragment 上的 read_fragment
和 write_fragment
,这些方法会调用 cache_store.read
和 cache_store.write
。
然后您可以使用自定义 read
和 write
方法创建自定义缓存存储 class,根据选项,将读取和写入委托给真正的缓存存储。
class MyCacheStore < ...
def initialize
@my_catchall_store = ActiveSupport::Cache::MemCacheStore.new
@my_order_store = ActiveSupport::Cache::MemCacheStore.new
end
def read(key, options)
case options[:store]
when :order_store then @my_order_store.read(key, options)
else
@my_catchall_store.read(key, options)
end
end
# similar for .write
然后你就可以像...
cache(:order, store: :order_store) do
# some code
end
cache(:something_else) do
# some code
end
抱歉,我不确定你问的是不是这个。