Particionar el cache del ActiveSupport::Cache::FileStore
Para un sitio con mucho trafico (tipo Sumavisos en un tiempo :) y muchos objetos distintos cacheados, el comportamiento por defecto del ActiveSupport::Cache::FileStore deja mucho que desear: como guarda todos los archivos al mismo directorio, uno puede facilmente terminar con un directorio con 100.000 archivos.
Entonces, el filesystem sufre cuando el ActiveSupport quiere chequear si tal cache-archivo existe y si existe abrirlo. Para eso, monkeypatcheamos un poquito el FileStore para que particione los caches en distintos directorios.
De esta manera los archivos quedan distribuidos en distintos directorios y el lookup deberia ser mas rapido.
Magia Ruby + Magia Rails, poner esto en algun lugar (por ejemplo, /config/initializers)
class ActiveSupport::Cache::FileStore
def real_file_path_with_partition(name)
real_file_path_without_partition(partition_cache_key(name))
end
def partition_cache_key(name)
k = MD5.hexdigest(name)
key = k[1 .. 1] + "/"
key += k[2 .. 2] + "/"
key += k[3 .. 3] + "/"
key += k[4 .. 4] + "/"
key += k[5 .. 5] + "/"
return key + name
end
alias_method_chain :real_file_path,:partition
end
Nota, esta version del codigo no es la original. Esta esta mucho mejor y anda con el TimedFileStore que permite expirar el cache segun su antiguedad