{"id":1320,"date":"2026-03-28T08:33:12","date_gmt":"2026-03-28T11:33:12","guid":{"rendered":"https:\/\/maurobernal.com.ar\/blog\/cache-aside-pattern-en-net-cache-eficiente-con-imemorycache\/"},"modified":"2026-03-28T08:33:12","modified_gmt":"2026-03-28T11:33:12","slug":"cache-aside-pattern-en-net-cache-eficiente-con-imemorycache","status":"publish","type":"post","link":"https:\/\/maurobernal.com.ar\/blog\/cache-aside-pattern-en-net-cache-eficiente-con-imemorycache\/","title":{"rendered":"Cache-Aside Pattern en .NET: Cache Eficiente con IMemoryCache"},"content":{"rendered":"<p>El rendimiento de una aplicaci\u00f3n backend depende en gran medida de cu\u00e1ntas veces consulta la base de datos. El <strong>patr\u00f3n Cache-Aside<\/strong> (tambi\u00e9n conocido como <em>Lazy Loading<\/em>) es una estrategia que permite reducir dr\u00e1sticamente esas consultas al almacenar temporalmente los datos m\u00e1s accedidos en memoria.<\/p>\n<p>En esta primera parte vemos la implementaci\u00f3n con <strong>IMemoryCache<\/strong>, la soluci\u00f3n de cach\u00e9 integrada en ASP.NET Core. En la <a href=\"#\">segunda parte<\/a> escalamos la misma estrategia con <strong>Redis<\/strong>.<\/p>\n<h2>\u00bfQu\u00e9 es el patr\u00f3n Cache-Aside?<\/h2>\n<p>En el patr\u00f3n Cache-Aside, la <strong>aplicaci\u00f3n gestiona expl\u00edcitamente el cach\u00e9<\/strong>. A diferencia de otras estrategias donde el cach\u00e9 se llena de forma autom\u00e1tica, aqu\u00ed el desarrollador controla qu\u00e9 se cachea, cu\u00e1ndo y por cu\u00e1nto tiempo.<\/p>\n<p>El flujo de ejecuci\u00f3n t\u00edpico es:<\/p>\n<ol>\n<li>La aplicaci\u00f3n intenta leer el dato desde el cach\u00e9.<\/li>\n<li>Si existe (<em>cache hit<\/em>), lo devuelve de inmediato.<\/li>\n<li>Si no existe (<em>cache miss<\/em>), lo consulta en la base de datos.<\/li>\n<li>Almacena el resultado en el cach\u00e9.<\/li>\n<li>Devuelve el dato al llamador.<\/li>\n<\/ol>\n<p>Este enfoque garantiza que solo se cachean los datos realmente necesarios, lo que lo hace eficiente y predecible.<\/p>\n<h2>\u00bfPor qu\u00e9 usar Cache-Aside?<\/h2>\n<ul>\n<li><strong>Mejor rendimiento:<\/strong> datos frecuentes se sirven desde memoria, sin tocar la base de datos.<\/li>\n<li><strong>Menor carga en la DB:<\/strong> menos queries = mejor escalabilidad del motor de base de datos.<\/li>\n<li><strong>Control fino:<\/strong> el desarrollador decide qu\u00e9 cachear y con qu\u00e9 pol\u00edtica de expiraci\u00f3n.<\/li>\n<li><strong>Flexibilidad:<\/strong> funciona con cach\u00e9 en memoria (IMemoryCache) y distribuida (Redis).<\/li>\n<\/ul>\n<h2>\u00bfCu\u00e1ndo usarlo?<\/h2>\n<p>Es ideal cuando:<\/p>\n<ul>\n<li>Los datos se leen con frecuencia pero se actualizan raramente.<\/li>\n<li>Se tolera una ligera inconsistencia temporal.<\/li>\n<li>El costo de consultar la base de datos es alto (joins complejos, queries lentas).<\/li>\n<\/ul>\n<p>Casos de uso t\u00edpicos: cat\u00e1logos de productos, perfiles de usuario, datos de configuraci\u00f3n, APIs de solo lectura.<\/p>\n<h2>Implementaci\u00f3n en .NET con IMemoryCache<\/h2>\n<p><code>IMemoryCache<\/code> es la soluci\u00f3n de cach\u00e9 en memoria incluida en ASP.NET Core. Almacena los datos en el proceso de la aplicaci\u00f3n y es ideal para <strong>instancias \u00fanicas<\/strong>.<\/p>\n<h3>Configuraci\u00f3n en Program.cs<\/h3>\n<pre><code class=\"language-csharp\">builder.Services.AddMemoryCache();<\/code><\/pre>\n<h3>Servicio con patr\u00f3n Cache-Aside<\/h3>\n<pre><code class=\"language-csharp\">public class ProductService\n{\n    private readonly IMemoryCache _cache;\n    private readonly AppDbContext _dbContext;\n\n    public ProductService(IMemoryCache cache, AppDbContext dbContext)\n    {\n        _cache = cache;\n        _dbContext = dbContext;\n    }\n\n    public async Task&lt;Product?&gt; GetProductAsync(int id)\n    {\n        var cacheKey = $\"product_{id}\";\n\n        if (!_cache.TryGetValue(cacheKey, out Product? product))\n        {\n            \/\/ Cache miss: consulta la base de datos\n            product = await _dbContext.Products.FindAsync(id);\n\n            if (product != null)\n            {\n                var options = new MemoryCacheEntryOptions()\n                    .SetSlidingExpiration(TimeSpan.FromMinutes(5))\n                    .SetAbsoluteExpiration(TimeSpan.FromMinutes(30));\n\n                _cache.Set(cacheKey, product, options);\n            }\n        }\n\n        return product;\n    }\n}<\/code><\/pre>\n<p><strong>Primera request:<\/strong> el cach\u00e9 est\u00e1 vac\u00edo, se consulta la DB y se almacena el resultado.<br \/>\n<strong>Requests siguientes:<\/strong> el dato se sirve desde memoria, sin tocar la base de datos.<br \/>\n<strong>Tras la expiraci\u00f3n:<\/strong> la siguiente request vuelve a cargar el dato fresco.<\/p>\n<h2>Estrategias de expiraci\u00f3n<\/h2>\n<h3>Sliding Expiration (expiraci\u00f3n deslizante)<\/h3>\n<p>La entrada expira si no se accede durante un per\u00edodo determinado. Ideal para datos de acceso frecuente: mientras se consulten, se mantienen en cach\u00e9.<\/p>\n<h3>Absolute Expiration (expiraci\u00f3n absoluta)<\/h3>\n<p>La entrada expira despu\u00e9s de un tiempo fijo, independientemente de cu\u00e1ntas veces se haya accedido. Garantiza que los datos se refresquen peri\u00f3dicamente.<\/p>\n<h3>Estrategia combinada (recomendada)<\/h3>\n<p>Usar ambas juntas es el enfoque m\u00e1s equilibrado: evita que datos calientes sean desalojados prematuramente, pero tambi\u00e9n previene que datos desactualizados persistan indefinidamente.<\/p>\n<h2>Invalidaci\u00f3n del cach\u00e9<\/h2>\n<p>Cuando se actualiza un dato en la base de datos, hay que eliminar o actualizar la entrada del cach\u00e9 para evitar inconsistencias:<\/p>\n<pre><code class=\"language-csharp\">public async Task UpdateProductAsync(Product product)\n{\n    _dbContext.Products.Update(product);\n    await _dbContext.SaveChangesAsync();\n\n    \/\/ Invalidar la entrada del cach\u00e9\n    var cacheKey = $\"product_{product.Id}\";\n    _cache.Remove(cacheKey);\n}<\/code><\/pre>\n<p>La pr\u00f3xima lectura detectar\u00e1 un <em>cache miss<\/em> y cargar\u00e1 el dato actualizado desde la DB.<\/p>\n<h2>Problemas comunes y soluciones<\/h2>\n<h3>Cache Stampede<\/h3>\n<p>Cuando una entrada expira, m\u00faltiples requests simult\u00e1neas pueden intentar cargar el dato de la base de datos al mismo tiempo, generando un pico de carga. Soluciones:<\/p>\n<ul>\n<li>Usar <code>SemaphoreSlim<\/code> para serializar el acceso al recurso.<\/li>\n<li>Implementar <em>request coalescing<\/em>.<\/li>\n<li>Migrar a un cach\u00e9 distribuido como Redis (ver <a href=\"#\">parte 2<\/a>).<\/li>\n<\/ul>\n<h3>Datos desactualizados (Stale Data)<\/h3>\n<p>Si la invalidaci\u00f3n no se implementa correctamente, el cach\u00e9 puede devolver datos obsoletos. Estrategias: tiempos de expiraci\u00f3n cortos, invalidaci\u00f3n por eventos, versionado de claves.<\/p>\n<h3>Presi\u00f3n de memoria<\/h3>\n<p>El cach\u00e9 en memoria consume RAM del proceso. Limit\u00e1 el tama\u00f1o del cach\u00e9 con <code>SizeLimit<\/code> y evit\u00e1 cachear objetos de gran tama\u00f1o. Para escalar horizontalmente, la soluci\u00f3n es Redis.<\/p>\n<h2>Conclusi\u00f3n<\/h2>\n<p>El patr\u00f3n Cache-Aside con <code>IMemoryCache<\/code> es una forma simple y efectiva de mejorar el rendimiento en aplicaciones .NET de instancia \u00fanica. La clave est\u00e1 en elegir bien las estrategias de expiraci\u00f3n e implementar una invalidaci\u00f3n correcta cuando los datos cambian.<\/p>\n<p>Para entornos con m\u00faltiples instancias (load balancers, contenedores escalados), el siguiente paso natural es usar <strong>Redis como cach\u00e9 distribuida<\/strong>. El patr\u00f3n es exactamente el mismo, pero compartido entre todas las instancias. Lo vemos en la <a href=\"#\">segunda parte de esta serie<\/a>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Aprende que es el patron Cache-Aside y como implementarlo en ASP.NET Core con IMemoryCache para reducir consultas a la base de datos y mejorar el rendimiento de tus APIs.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2}},"categories":[1],"tags":[38,359,412,39,419,316,421,65,420],"class_list":["post-1320","post","type-post","status-publish","format-standard","hentry","category-blog","tag-net","tag-asp-net-core","tag-backend","tag-c","tag-cache-aside","tag-caching","tag-patrones-de-diseno","tag-performance","tag-redis"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.4 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Cache-Aside Pattern en .NET: Cache Eficiente con IMemoryCache &#183; devops Mauro Bernal<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/maurobernal.com.ar\/blog\/cache-aside-pattern-en-net-cache-eficiente-con-imemorycache\/\" \/>\n<meta property=\"og:locale\" content=\"es_ES\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Cache-Aside Pattern en .NET: Cache Eficiente con IMemoryCache &#183; devops Mauro Bernal\" \/>\n<meta property=\"og:description\" content=\"Aprende que es el patron Cache-Aside y como implementarlo en ASP.NET Core con IMemoryCache para reducir consultas a la base de datos y mejorar el rendimiento de tus APIs.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/maurobernal.com.ar\/blog\/cache-aside-pattern-en-net-cache-eficiente-con-imemorycache\/\" \/>\n<meta property=\"og:site_name\" content=\"devops Mauro Bernal\" \/>\n<meta property=\"article:published_time\" content=\"2026-03-28T11:33:12+00:00\" \/>\n<meta name=\"author\" content=\"Mauro Bernal\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@_maurobernal\" \/>\n<meta name=\"twitter:site\" content=\"@_maurobernal\" \/>\n<meta name=\"twitter:label1\" content=\"Escrito por\" \/>\n\t<meta name=\"twitter:data1\" content=\"Mauro Bernal\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tiempo de lectura\" \/>\n\t<meta name=\"twitter:data2\" content=\"4 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/cache-aside-pattern-en-net-cache-eficiente-con-imemorycache\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/cache-aside-pattern-en-net-cache-eficiente-con-imemorycache\\\/\"},\"author\":{\"name\":\"Mauro Bernal\",\"@id\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/#\\\/schema\\\/person\\\/09c4dbdfb59b20e015c703fd19713283\"},\"headline\":\"Cache-Aside Pattern en .NET: Cache Eficiente con IMemoryCache\",\"datePublished\":\"2026-03-28T11:33:12+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/cache-aside-pattern-en-net-cache-eficiente-con-imemorycache\\\/\"},\"wordCount\":743,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/#\\\/schema\\\/person\\\/09c4dbdfb59b20e015c703fd19713283\"},\"keywords\":[\".NET\",\"ASP.NET Core\",\"Backend\",\"c#\",\"Cache-Aside\",\"caching\",\"Patrones de Diseno\",\"performance\",\"Redis\"],\"articleSection\":[\"Blog\"],\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/cache-aside-pattern-en-net-cache-eficiente-con-imemorycache\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/cache-aside-pattern-en-net-cache-eficiente-con-imemorycache\\\/\",\"url\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/cache-aside-pattern-en-net-cache-eficiente-con-imemorycache\\\/\",\"name\":\"Cache-Aside Pattern en .NET: Cache Eficiente con IMemoryCache &#183; devops Mauro Bernal\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/#website\"},\"datePublished\":\"2026-03-28T11:33:12+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/cache-aside-pattern-en-net-cache-eficiente-con-imemorycache\\\/#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/cache-aside-pattern-en-net-cache-eficiente-con-imemorycache\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/cache-aside-pattern-en-net-cache-eficiente-con-imemorycache\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Portada\",\"item\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Cache-Aside Pattern en .NET: Cache Eficiente con IMemoryCache\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/\",\"name\":\"devops Mauro Bernal\",\"description\":\"Cuando tu trabajo es hacer que las cosas funcionen bien...\",\"publisher\":{\"@id\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/#\\\/schema\\\/person\\\/09c4dbdfb59b20e015c703fd19713283\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"es\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/#\\\/schema\\\/person\\\/09c4dbdfb59b20e015c703fd19713283\",\"name\":\"Mauro Bernal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\\\/\\\/i0.wp.com\\\/maurobernal.com.ar\\\/blog\\\/wp-content\\\/uploads\\\/2023\\\/07\\\/logo-maurobernal.png?fit=1740%2C1740&ssl=1\",\"url\":\"https:\\\/\\\/i0.wp.com\\\/maurobernal.com.ar\\\/blog\\\/wp-content\\\/uploads\\\/2023\\\/07\\\/logo-maurobernal.png?fit=1740%2C1740&ssl=1\",\"contentUrl\":\"https:\\\/\\\/i0.wp.com\\\/maurobernal.com.ar\\\/blog\\\/wp-content\\\/uploads\\\/2023\\\/07\\\/logo-maurobernal.png?fit=1740%2C1740&ssl=1\",\"width\":1740,\"height\":1740,\"caption\":\"Mauro Bernal\"},\"logo\":{\"@id\":\"https:\\\/\\\/i0.wp.com\\\/maurobernal.com.ar\\\/blog\\\/wp-content\\\/uploads\\\/2023\\\/07\\\/logo-maurobernal.png?fit=1740%2C1740&ssl=1\"},\"description\":\"Desarrollo de Sistemas en .Net, IT Callcenters, DBA de SQL Server, Mikrotik, Pentest y T\u00e9cnico consultor de Sistemas Bejerman\",\"sameAs\":[\"https:\\\/\\\/maurobernal.com.ar\",\"https:\\\/\\\/x.com\\\/_maurobernal\",\"https:\\\/\\\/youtube.com\\\/maurobernal\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Cache-Aside Pattern en .NET: Cache Eficiente con IMemoryCache &#183; devops Mauro Bernal","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/maurobernal.com.ar\/blog\/cache-aside-pattern-en-net-cache-eficiente-con-imemorycache\/","og_locale":"es_ES","og_type":"article","og_title":"Cache-Aside Pattern en .NET: Cache Eficiente con IMemoryCache &#183; devops Mauro Bernal","og_description":"Aprende que es el patron Cache-Aside y como implementarlo en ASP.NET Core con IMemoryCache para reducir consultas a la base de datos y mejorar el rendimiento de tus APIs.","og_url":"https:\/\/maurobernal.com.ar\/blog\/cache-aside-pattern-en-net-cache-eficiente-con-imemorycache\/","og_site_name":"devops Mauro Bernal","article_published_time":"2026-03-28T11:33:12+00:00","author":"Mauro Bernal","twitter_card":"summary_large_image","twitter_creator":"@_maurobernal","twitter_site":"@_maurobernal","twitter_misc":{"Escrito por":"Mauro Bernal","Tiempo de lectura":"4 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/maurobernal.com.ar\/blog\/cache-aside-pattern-en-net-cache-eficiente-con-imemorycache\/#article","isPartOf":{"@id":"https:\/\/maurobernal.com.ar\/blog\/cache-aside-pattern-en-net-cache-eficiente-con-imemorycache\/"},"author":{"name":"Mauro Bernal","@id":"https:\/\/maurobernal.com.ar\/blog\/#\/schema\/person\/09c4dbdfb59b20e015c703fd19713283"},"headline":"Cache-Aside Pattern en .NET: Cache Eficiente con IMemoryCache","datePublished":"2026-03-28T11:33:12+00:00","mainEntityOfPage":{"@id":"https:\/\/maurobernal.com.ar\/blog\/cache-aside-pattern-en-net-cache-eficiente-con-imemorycache\/"},"wordCount":743,"commentCount":0,"publisher":{"@id":"https:\/\/maurobernal.com.ar\/blog\/#\/schema\/person\/09c4dbdfb59b20e015c703fd19713283"},"keywords":[".NET","ASP.NET Core","Backend","c#","Cache-Aside","caching","Patrones de Diseno","performance","Redis"],"articleSection":["Blog"],"inLanguage":"es","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/maurobernal.com.ar\/blog\/cache-aside-pattern-en-net-cache-eficiente-con-imemorycache\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/maurobernal.com.ar\/blog\/cache-aside-pattern-en-net-cache-eficiente-con-imemorycache\/","url":"https:\/\/maurobernal.com.ar\/blog\/cache-aside-pattern-en-net-cache-eficiente-con-imemorycache\/","name":"Cache-Aside Pattern en .NET: Cache Eficiente con IMemoryCache &#183; devops Mauro Bernal","isPartOf":{"@id":"https:\/\/maurobernal.com.ar\/blog\/#website"},"datePublished":"2026-03-28T11:33:12+00:00","breadcrumb":{"@id":"https:\/\/maurobernal.com.ar\/blog\/cache-aside-pattern-en-net-cache-eficiente-con-imemorycache\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/maurobernal.com.ar\/blog\/cache-aside-pattern-en-net-cache-eficiente-con-imemorycache\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/maurobernal.com.ar\/blog\/cache-aside-pattern-en-net-cache-eficiente-con-imemorycache\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Portada","item":"https:\/\/maurobernal.com.ar\/blog\/"},{"@type":"ListItem","position":2,"name":"Cache-Aside Pattern en .NET: Cache Eficiente con IMemoryCache"}]},{"@type":"WebSite","@id":"https:\/\/maurobernal.com.ar\/blog\/#website","url":"https:\/\/maurobernal.com.ar\/blog\/","name":"devops Mauro Bernal","description":"Cuando tu trabajo es hacer que las cosas funcionen bien...","publisher":{"@id":"https:\/\/maurobernal.com.ar\/blog\/#\/schema\/person\/09c4dbdfb59b20e015c703fd19713283"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/maurobernal.com.ar\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"es"},{"@type":["Person","Organization"],"@id":"https:\/\/maurobernal.com.ar\/blog\/#\/schema\/person\/09c4dbdfb59b20e015c703fd19713283","name":"Mauro Bernal","image":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/i0.wp.com\/maurobernal.com.ar\/blog\/wp-content\/uploads\/2023\/07\/logo-maurobernal.png?fit=1740%2C1740&ssl=1","url":"https:\/\/i0.wp.com\/maurobernal.com.ar\/blog\/wp-content\/uploads\/2023\/07\/logo-maurobernal.png?fit=1740%2C1740&ssl=1","contentUrl":"https:\/\/i0.wp.com\/maurobernal.com.ar\/blog\/wp-content\/uploads\/2023\/07\/logo-maurobernal.png?fit=1740%2C1740&ssl=1","width":1740,"height":1740,"caption":"Mauro Bernal"},"logo":{"@id":"https:\/\/i0.wp.com\/maurobernal.com.ar\/blog\/wp-content\/uploads\/2023\/07\/logo-maurobernal.png?fit=1740%2C1740&ssl=1"},"description":"Desarrollo de Sistemas en .Net, IT Callcenters, DBA de SQL Server, Mikrotik, Pentest y T\u00e9cnico consultor de Sistemas Bejerman","sameAs":["https:\/\/maurobernal.com.ar","https:\/\/x.com\/_maurobernal","https:\/\/youtube.com\/maurobernal"]}]}},"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack-related-posts":[],"jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/maurobernal.com.ar\/blog\/wp-json\/wp\/v2\/posts\/1320","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/maurobernal.com.ar\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/maurobernal.com.ar\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/maurobernal.com.ar\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/maurobernal.com.ar\/blog\/wp-json\/wp\/v2\/comments?post=1320"}],"version-history":[{"count":0,"href":"https:\/\/maurobernal.com.ar\/blog\/wp-json\/wp\/v2\/posts\/1320\/revisions"}],"wp:attachment":[{"href":"https:\/\/maurobernal.com.ar\/blog\/wp-json\/wp\/v2\/media?parent=1320"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/maurobernal.com.ar\/blog\/wp-json\/wp\/v2\/categories?post=1320"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/maurobernal.com.ar\/blog\/wp-json\/wp\/v2\/tags?post=1320"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}