vista reglas negocio mvc modelo las implementar form estructura encargado ejemplos ejemplo controlador capas php performance caching scalability memcached

php - reglas - Capa de caché para MVC: ¿modelo o controlador?



mvc ejemplos c# (2)

Mantendré mis responsabilidades de almacenamiento en caché firmemente dentro del modelo. No es asunto del controlador o de la vista que el modelo obtenga datos. Lo único que les importa es que cuando se solicitan datos, se proporcionan datos, así es como se supone que el paradigma MVC funciona.

Resuma su funcionalidad mem_cache en la clase de modelo padre. Reducirá la cantidad de código que necesita escribir (código = tiempo = dinero), simplificará las modificaciones al sistema y eliminará la cantidad de errores que produzca por modelo que construya (vea la fórmula anterior).

Estandarizar, estandarizar.

Tengo algunas dudas sobre dónde implementar la parte de almacenamiento en caché. ¿Dónde está el lugar más apropiado para implementarlo, piensas?

¿Dentro de cada modelo o en el controlador?

Enfoque 1 (código psuedo):

// mycontroller.php MyController extends Controller_class { function index () { $data = $this->model->getData(); echo $data; } } // myModel.php MyModel extends Model_Class{ function getData() { $data = memcached->get(''data''); if (!$data) { $query->SQL_QUERY("Do query!"); } return $data; } }

Enfoque 2:

// mycontroller.php MyController extends Controller_class { function index () { $dataArray = $this->memcached->getMulti(''data'',''data2''); foreach ($dataArray as $key) { if (!$key) { $data = $this->model->getData(); $this->memcached->set($key, $data); } } echo $data; } } // myModel.php MyModel extends Model_Class{ function getData() { $query->SQL_QUERY("Do query!"); return $data; } }

Pensamientos:

Enfoque 1:

  • Sin multiget / multi-set. Si se devolviera una gran cantidad de claves, se causaría una sobrecarga.

  • Más fácil de mantener, todo el manejo de la base de datos / caché está en cada modelo

Enfoque 2:

  • Mejor performancewise: se utiliza multiset / multiget

  • Se requiere más código

  • Más difícil de mantener

¡Dime que piensas!


El almacenamiento en caché debe hacerse en el modelo. Si tuviera que elegir en general, probablemente terminaría almacenando en caché de manera transparente la interacción de la base de datos del modelo, lo que no requeriría que realizara ningún cambio en el resto de su código. Esto, por supuesto, se haría en la clase principal de tus modelos.

Definitivamente, concéntrese en el almacenamiento en caché de los resultados de las consultas de su base de datos, ya que al interactuar con su base de datos es donde verá la mayor cantidad de gastos generales. Yo diría que sería más eficiente almacenar en caché los resultados de su base de datos (o tal vez todo su modelo inicializado) más que cualquier otra cosa.

Recuerde que puede serializar sus objetos antes del almacenamiento en caché, por lo que enviar tipos complejos (matrices u objetos) a Memcache no debería ser un problema. PHP 5 proporciona los métodos mágicos __sleep() y __wakeup() con el único propósito de separar y reconstruir tus objetos serializados. Almacenar objetos completos en PHP es básicamente un pedazo de pastel. Consulte http://php.net/manual/en/language.oop5.magic.php para obtener más información.

Si decides guardar en caché solo tus datos o todo tu modelo poco después de la inicialización, depende de ti.