Usando caché con ASP.NET

Posted on Actualizado enn


Hola, hoy quiero mostrar como podemos usar la cache para tener nuestros datos en memoria y evitar hacer idas y vueltas a nuestra base de datos continuamente.
El proceso para utilizar la cache consta de 3 pasos:

  1. Buscar si existe un determinado elemento en la cache.
  2. Si el elemento existe entonces utilizarlo.
  3. Si el elemento no existe ir a la base de datos y cachear el elemento.

Vamos a revisar tres escenarios:

  1. Cache simple: Podemos utilizar la cache de manera similar a si usáramos una variable de session, simplemente verificamos si existe el elemento, en caso de existir lo usamos de lo contrario vamos a la base de datos y luego cacheamos el elemento. La desventaja de este método es que una vez cacheado el elemento, no es posible determinar si nuetsro origen de datos ha cambiado, lo cual podria generar datos inconsistente.El código siguiente muestra la implementación de este caso:
        
           If Cache("cache1") Is Nothing Then
                dt = oConexion.GetUsers()
                Cache("cache1") = dt
                grvUsuarios.DataSource = dt
                grvUsuarios.DataBind()
                Response.Write("Cache created at: " & Now)
            Else
                dt = CType(Cache("cache1"), DataTable)
                grvUsuarios.DataSource = dt
                grvUsuarios.DataBind()
                Response.Write("Cache used at: " & Now)
            End If
    
    Lo primero es verificar si el objeto existe en la cache, si no existe entonces obtenemos los datos de la base de datos con la función GetUsers() y luego cacheamos el elemento, así en una segunda oportunidad como ya se encuentra el objeto en la cache no se realiza de nuevo la consulta a la base de datos.
  2. Cache con tiempo de expiración: Al igual que con el caso anterior, para acceder a la cache lo hacemos de manera similar a como se accede a una variable de session, la diferencia radica en que cuando creamos el objeto en la cache le definimos un tiempo de vida, así cuando dicho tiempo se cumpla el objeto cacheado “muere” y tendriamos que volver a cachearlo; de esta manera estariamos refrescando regularmente nuestros objetos cacheados para tener siempre los datos reales de la base de datos, sin embargo se puede dar el caso q los datos puedan ser cambiados y que le tiempo de cache no se haya cumplido, pero ya veremos en el siguiente caso como podemos solucionar este caso.
        
            Dim Expires As DateTime
            Expires = DateAdd(DateInterval.Second, 10, Now)
    
            If Cache("cache2") Is Nothing Then
                dt = oConexion.GetUsers()
                Cache.Insert("cache2",
                             dt,
                             Nothing,
                             Expires,
                             System.Web.Caching.Cache.NoSlidingExpiration,
                             System.Web.Caching.CacheItemPriority.Default,
                             Nothing)
                grvUsuarios.DataSource = dt
                grvUsuarios.DataBind()
                Response.Write("Cache created at: " & Now)
            Else
                dt = CType(Cache("cache2"), DataTable)
                grvUsuarios.DataSource = dt
                grvUsuarios.DataBind()
                Response.Write("Cache used at: " & Now)
            End If

    Lo primero es verificar si el objeto existe en la cache, si no existe entonces obtenemos los datos de la base de datos con la función GetUsers() y luego cacheamos el elemento, pero notese aca que el primer caso usamos Cache(“nombreitem”) y en este caso utilizamos Cache.Insert(…), lo que pasa es que cuando se utliza el método Insert(…) tenemos un mayor control y mayores funcionalidades al crear el objeto, con el método simple solo creamos el objeto en cache sin mayores características. En el ejemplo especificamos que el tiempo de vida del objeto en cache sea de 10 segundos, ya que en la línea Expires = DateAdd(DateInterval.Second, 10, Now) a la fecha actual le estamos diciendo que nos sume 10 segundos a la fechha y hora actuales.

  3. Cache con dependencia a SQL Server: Cuando utilizamos caché con dependencia a SQL Sever, lo que se logra es que nuetsra aplicación detecte automáticamente cuando se realiza algún cambio en la tabla origen, así podemos tener siempre en caché los datos actuales de nuestra base de datos. Para realizar este proceso primero debemos decirle a la base de datos que se va a utilizar para cachear con dependecia y luego le especificamos que tabla vamos a utilizar, con el primer proceso se crea una tabla llamada AspNet_SqlCacheTablesForChangeNotification para ir monitoreando los cambios realizados ademas de algunos procedimientos almacenado, al realizar el segundo proceso se crean algunos triggers sobre la tabla que vamos a cachear, la manera de realizar dicho proceso es por medio de la consola de comando ejecutar:
        
    aspnet_regsql -S NOMBRESERVIDOR\INSTANCIA -E -ed -d NOMBREBASE
    

    Allí lo único que se debe especificar es el nombreservidor por el servidor de base de datos y específicamos el nombre de la base de datos a utilizar.

        
    aspnet_regsql -S NOMBRESERVIDOR\INSTANCIA -E -d NOMBREBASE -et -t NOMBRETABLA
    

    En este segundo caso al final debemos especificar el nombre de la tabla que deseamos utilizar.
    Luego de tener nuestra base de datos lista, vamos al webconfig y especificamos:

        
        <caching>
          <sqlCacheDependency enabled="true">
            <databases>
              <add connectionStringName="MiCadena" name="AspCache" pollTime="500"/>
            </databases>
          </sqlCacheDependency>
        </caching>

    Ahora en nuestro código:

        
          If Cache("cache3") Is Nothing Then
                dt = oConexion.GetUsers()
                Dim scd As New SqlCacheDependency(databaseEntryName:="AspCache",
                                                                tableName:="Usuarios")
                Cache.Insert(key:="cache3",
                             value:=dt,
                             dependencies:=scd)
                grvUsuarios.DataSource = dt
                grvUsuarios.DataBind()
                Response.Write("Cache created at: " & Now)
            Else
                dt = CType(Cache("cache3"), DataTable)
                grvUsuarios.DataSource = dt
                grvUsuarios.DataBind()
                Response.Write("Cache used at: " & Now)
            End If
    

    Aca primero verificamos si existe el objeto, en caso negativo entonces llenamos un datatable con los datos, luego creamos un objeto SqlCacheDependency donde en el constructor especificamos el nombre de la base de datos y la tabla a utilizar, luego al crear el objeto en la cache le pasamos como parámetro el objeto creado anteriormente.

    Finalmente le dejo el código del ejemplo, y desde ahora los podrán descargar tanto en vb como en c#:
    Ejemplo en C# !
    Ejemplo en VB !

2 comentarios sobre “Usando caché con ASP.NET

    Juan Camilo Caro Jimenez escribió:
    04/07/2011 en 10:59

    Me preguntaba amigo mio luego de leer su post si este tipo de cache que usted plantea aca, es compartido para todos los usuarios de la aplicacion web que se puedan encontrar actualmente logueados al mismo tiempo, o si este tipo de cache solo funciona para un solo usuario?

    Diana escribió:
    05/16/2016 en 12:45

    Los archivos que dejas no funcionan. no consigo como solucionar mi problema. como hago para crear un bloc de noticias que se suban la foto y el texto y se valla mostrando en la pagina.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s