2009-05-04 15 views
5

Pregunta: ¿Qué estructuras de caché están disponibles para Delphi y qué tan bien desarrolladas son? Si no hay ninguno, ¿existe una forma ampliamente aceptada de lograr el mismo objetivo? Aplicable a las versiones de targeting Win32 de Delphi.¿Hay marcos de almacenamiento en caché para Delphi?

Detalle Pregunta: El tipo de marco que estoy preguntando acerca existe en gran parte en los marcos de desarrollo web que permite al usuario:

  • Compruebe la cache de datos previamente almacenado/Objeto
  • Recuperar Datos/Objeto
  • Almacenar los nuevos Datos/Objetos
  • Opcionalmente etiquetar los Datos/Objetos y etiquetarlos.
  • Vencimiento de datos/objetos según algunos criterios (etiquetas, etiquetas, límites de tiempo, etc.).

entiendo que la falta de servicios de reflexión para Delphi objetos sin RTTI significa que probablemente no van a existir en la misma forma, pero hay una manera similar de lograr al menos parte del mismo resultado final de una forma más ¿Manera Delphi?

Enfoque alternativo: Como alternativa a una biblioteca Delphi nativa: ¿Existe por ejemplo un buen conjunto de enlaces para memcached o algo similar?

Respuesta

4

He usado memcached en Linux (hay versiones en Windows y MacOS, así como en casi cualquier otro sistema operativo), es bastante simple.

que se ocupó de él directamente, usando TIDTelnet de Indy, mediante la lectura del protocolo de documentation, solamente he utilizado conjunto, obtener, eliminar, y dejar de fumar .

que utilizan este tipo de comandos (I establecer y obtener "nombre", 14 es el número de bytes que se pueden almacenar):

[email protected]:~$ telnet 127.0.0.1 11211 
Trying 127.0.0.1... 
Connected to 127.0.0.1. 
Escape character is '^]'. 
set name 0 0 14 
Osama Alassiry 
STORED 
get name 
VALUE name 0 14 
Osama Alassiry 
END 
quit 

memcached le permite almacenar hasta 1 MB por clave de caché, lo Usó claves compuestas como 'Persona | 17 | nombre', 'Persona | 17 | imagen', 'Empleado | 7 | Salario | Básico' (estos son nombres ficticios no relacionados con lo que realmente hice) ... He almacenado algunos archivos binarios en la memoria caché como base64, lo que permite usar hasta 768k de datos binarios.

memcached también se puede distribuir en varios servidores mediante hash de las teclas y seleccionando uno de varios servidores basados ​​en hash.

+1

+1, creo que este es un buen consejo. memcached es una solución estable y optimizada, que está disponible no solo para Linux, sino también para Windows y Mac OS X. Si hacerlo en el nivel del protocolo sería demasiado difícil, existen bibliotecas cliente (como libmemcached) que los programas Delphi pueden usar como DLL. – mghie

+1

es muy fácil, he añadido un ejemplo. Solo utilicé set y get, delete y quit. Tenía mi propia función para hacer eso. No me gusta agregar dlls. –

+0

Estoy de acuerdo mghie, el mejor consejo hasta el momento, mirando el protocolo, no sería demasiado trabajo usar un contenedor existente como un archivo DLL o crear un contenedor Delphi rápido yo mismo. – jamiei

1

El mecanismo de caché necesita rodar a mano.

Splay Trees son un mecanismo útil y directo para almacenar objetos almacenados en caché, y también detectar cuán rancios están.

1

Estos marcos proporcionan alguna forma de almacenamiento en caché de objetos

Dependiendo de sus requisitos exactos, estos podrían ser exagerado. Si intenta implementar una solución propia, le sugiero que eche un vistazo a los diferentes contenedores en el Jedi VCL como punto de partida.

+0

Estos marcos pueden ser útiles para una aplicación ya usando uno de los anteriores pero por lo demás, como se ha señalado usted correctamente, puede ser una poco por encima. – jamiei

+1

- kbmw, midware, la lista es interminable. –

1

Si desea construir el suyo, probablemente quiera hacerlo en Freepascal, ya que tiene soporte de 64 bits. En lugar de árboles biselados, sugeriría un k-ary.

1

Ok. Probablemente terminaré sintiéndome tonto al respecto, pero ¿cuál es el problema con la TStringList? He estado utilizando una matriz dinámica de datos bastante estructurados con una TStringList para encontrar un elemento basado en una ID de cadena. Recientemente, actualicé el TStringList a un THashedStringList. Puede ser un poco más rápido, pero nada realmente notable todavía. La disposición StringList/Array ha proporcionado un gran rendimiento en mi aplicación hasta ahora.

Hasta ahora he estado almacenando en la memoria caché de 100 a 150 registros, pero espero que funcione bien hasta tal vez un par de miles. En el negocio en el que estoy, esa es una operación bastante grande.

+3

No escala. Tienes 2 GByte de ram en tu máquina (32 bit). Eso hace unos pocos millones de registros. En una lista de cadenas ordenada con un millón de registros, una inserción significa un movimiento de bloque de 500000 punteros (2 MByte). Hashing una cadena es O (longitud (s)). –

+0

Los límites prácticos de tstringlist se activan alrededor de 40000-200000 según los requisitos exactos y el patrón de crecimiento y el código. –

+0

Gracias por comentar. Como dije, guardo en caché unos 150 registros de empleados en un programa de nómina. Si recibo hasta 40,000 empleados, es posible que tenga que considerar las alternativas, pero una StringList es un excelente mecanismo de almacenamiento en caché para la cantidad de registros que creo que probablemente veré. – jrodenhi

Cuestiones relacionadas