diff --git a/src/db/redis.js b/src/db/redis.js
index c1f7405fb2a15b02f45078744504e523d97bede2..eacf468fc216ad898858fb4b73e96e45393a605f 100644
--- a/src/db/redis.js
+++ b/src/db/redis.js
@@ -28,7 +28,7 @@ class Redis {
                         if (err) {
                             reject(err);
                         } else {
-                            resolve(res[0] === '{' ? JSON.parse(res) : res);
+                            resolve(res && res.length > 0 && res[0] === '{' ? JSON.parse(res) : res);
                         }
                     });
                     this.client[call_name].apply(this.client, args);
diff --git a/src/server/app_render.jsx b/src/server/app_render.jsx
index 05a1171f531119321e10446f01d579578acb98fa..7c7d70e1fce4a953442789053f955238ad4ead5b 100644
--- a/src/server/app_render.jsx
+++ b/src/server/app_render.jsx
@@ -1,6 +1,7 @@
 import React from 'react';
 import { renderToString } from 'react-dom/server';
 import Tarantool from 'db/tarantool';
+import Redis from 'db/redis';
 import ServerHTML from './server-html';
 import universalRender from '../shared/UniversalRender';
 import models from 'db/models';
@@ -84,7 +85,14 @@ async function appRender(ctx) {
             }
         }
 
-        const { body, title, statusCode, meta } = await universalRender({location: ctx.request.url, store, offchain, ErrorPage, tarantool: Tarantool.instance()});
+        const { body, title, statusCode, meta } = await universalRender({
+            location: ctx.request.url,
+            store,
+            offchain,
+            ErrorPage,
+            tarantool: Tarantool.instance(),
+            redis: Redis.instance()
+        });
 
         // Assets name are found in `webpack-stats` file
         const assets_filename = ROOT + (process.env.NODE_ENV === 'production' ? '/tmp/webpack-stats-prod.json' : '/tmp/webpack-stats-dev.json');
diff --git a/src/shared/UniversalRender.jsx b/src/shared/UniversalRender.jsx
index e70af7ba06110b58c196f8934992925e7d95d868..9b84cba00ed50b458f6c4245c2dd17d2244e6907 100644
--- a/src/shared/UniversalRender.jsx
+++ b/src/shared/UniversalRender.jsx
@@ -27,7 +27,6 @@ import Translator from 'app/Translator';
 import {notificationsArrayToMap} from 'app/utils/Notifications';
 import {routeRegex} from "app/ResolveRoute";
 import {contentStats} from 'app/utils/StateFunctions'
-
 import {api} from 'steem';
 
 const sagaMiddleware = createSagaMiddleware(
@@ -59,7 +58,7 @@ const onRouterError = (error) => {
     console.error('onRouterError', error);
 };
 
-async function universalRender({ location, initial_state, offchain, ErrorPage, tarantool }) {
+async function universalRender({ location, initial_state, offchain, ErrorPage, tarantool, redis }) {
     let error, redirect, renderProps;
     try {
         [error, redirect, renderProps] = await runRouter(location, RootRoute);
@@ -119,7 +118,14 @@ async function universalRender({ location, initial_state, offchain, ErrorPage, t
         if (url.indexOf('/curation-rewards') !== -1) url = url.replace(/\/curation-rewards$/, '/transfers');
         if (url.indexOf('/author-rewards') !== -1) url = url.replace(/\/author-rewards$/, '/transfers');
 
-        onchain = await api.getStateAsync(url);
+        try {
+            onchain = await redis.get(url);
+        } catch (error) {
+        }
+        if (!onchain) {
+            onchain = await api.getStateAsync(url);
+            redis.set(url, onchain);
+        }
 
         if (Object.getOwnPropertyNames(onchain.accounts).length === 0 && (url.match(routeRegex.UserProfile1) || url.match(routeRegex.UserProfile3))) { // protect for invalid account
             return {
@@ -141,7 +147,16 @@ async function universalRender({ location, initial_state, offchain, ErrorPage, t
 
         if (!url.match(routeRegex.PostsIndex) && !url.match(routeRegex.UserProfile1) && !url.match(routeRegex.UserProfile2) && url.match(routeRegex.PostNoCategory)) {
             const params = url.substr(2, url.length - 1).split("/");
-            const content = await api.getContentAsync(params[0], params[1]);
+            const content_key = `content/${params[0]}/${params[1]}`;
+            let content;
+            try {
+                content = await redis.get(content_key);
+            } catch (error) {
+            }
+            if (!content) {
+                content = await api.getContentAsync(params[0], params[1]);
+                redis.set(content_key, content);
+            }
             if (content.author && content.permlink) { // valid short post url
                 onchain.content[url.substr(2, url.length - 1)] = content;
             } else { // protect on invalid user pages (i.e /user/transferss)