Introduction
- The project I’m doing is related to redis, so by the way, I should note a little practice.
- This article I will not present: What is Redis ?. Why should use redis.
- This article only provides comparison results when switching to using redis as a cache or replacing traditional data types (SQL and NoSQL).
Redis as cache
- Let’s look at the example nodejs app that returns book information via google api data.
- Do not use Redis:
123456789101112131415161718192021222324252627282930313233<span class="token comment">// withoutRedisAsCache.js</span><span class="token comment">//Define all dependencies needed</span><span class="token keyword">const</span> express <span class="token operator">=</span> <span class="token function">require</span> <span class="token punctuation">(</span> <span class="token string">"express"</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span><span class="token keyword">const</span> responseTime <span class="token operator">=</span> <span class="token function">require</span> <span class="token punctuation">(</span> <span class="token string">"response-time"</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span><span class="token keyword">const</span> axios <span class="token operator">=</span> <span class="token function">require</span> <span class="token punctuation">(</span> <span class="token string">"axios"</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span><span class="token comment">//Load Express Framework</span><span class="token keyword">var</span> app <span class="token operator">=</span> <span class="token function">express</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span><span class="token comment">//Create a middleware that adds a X-Response-Time header to responses.</span>app <span class="token punctuation">.</span> <span class="token function">use</span> <span class="token punctuation">(</span> <span class="token function">responseTime</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span><span class="token keyword">const</span> <span class="token function-variable function">getBook</span> <span class="token operator">=</span> <span class="token punctuation">(</span> req <span class="token punctuation">,</span> res <span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span><span class="token keyword">let</span> isbn <span class="token operator">=</span> req <span class="token punctuation">.</span> query <span class="token punctuation">.</span> isbn <span class="token punctuation">;</span><span class="token keyword">let</span> url <span class="token operator">=</span> <span class="token template-string"><span class="token string">`https://www.googleapis.com/books/v1/volumes?q=isbn:</span> <span class="token interpolation"><span class="token interpolation-punctuation punctuation">${</span> isbn <span class="token interpolation-punctuation punctuation">}</span></span> <span class="token string">`</span></span> <span class="token punctuation">;</span>axios<span class="token punctuation">.</span> <span class="token keyword">get</span> <span class="token punctuation">(</span> url <span class="token punctuation">)</span><span class="token punctuation">.</span> <span class="token function">then</span> <span class="token punctuation">(</span> response <span class="token operator">=></span> <span class="token punctuation">{</span><span class="token keyword">let</span> book <span class="token operator">=</span> response <span class="token punctuation">.</span> data <span class="token punctuation">.</span> items <span class="token punctuation">;</span>res <span class="token punctuation">.</span> <span class="token function">send</span> <span class="token punctuation">(</span> book <span class="token punctuation">)</span> <span class="token punctuation">;</span><span class="token punctuation">}</span> <span class="token punctuation">)</span><span class="token punctuation">.</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span> err <span class="token operator">=></span> <span class="token punctuation">{</span>res <span class="token punctuation">.</span> <span class="token function">send</span> <span class="token punctuation">(</span> <span class="token string">"The book you are looking for is not found !!!"</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span><span class="token punctuation">}</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span><span class="token punctuation">}</span> <span class="token punctuation">;</span>app <span class="token punctuation">.</span> <span class="token keyword">get</span> <span class="token punctuation">(</span> <span class="token string">"/book"</span> <span class="token punctuation">,</span> getBook <span class="token punctuation">)</span> <span class="token punctuation">;</span>app <span class="token punctuation">.</span> <span class="token function">listen</span> <span class="token punctuation">(</span> <span class="token number">3000</span> <span class="token punctuation">,</span> <span class="token keyword">function</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span>console <span class="token punctuation">.</span> <span class="token function">log</span> <span class="token punctuation">(</span> <span class="token string">"Your node is running on port 3000 !!!"</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span><span class="token punctuation">}</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span>- Use redis as cache:
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748<span class="token comment">// withRedisAsCache.js</span><span class="token keyword">const</span> express <span class="token operator">=</span> <span class="token function">require</span> <span class="token punctuation">(</span> <span class="token string">"express"</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span><span class="token keyword">const</span> responseTime <span class="token operator">=</span> <span class="token function">require</span> <span class="token punctuation">(</span> <span class="token string">"response-time"</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span><span class="token keyword">const</span> axios <span class="token operator">=</span> <span class="token function">require</span> <span class="token punctuation">(</span> <span class="token string">"axios"</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span><span class="token keyword">const</span> redis <span class="token operator">=</span> <span class="token function">require</span> <span class="token punctuation">(</span> <span class="token string">"redis"</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span><span class="token keyword">const</span> client <span class="token operator">=</span> redis <span class="token punctuation">.</span> <span class="token function">createClient</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span><span class="token comment">// Load express Framework</span><span class="token keyword">const</span> app <span class="token operator">=</span> <span class="token function">express</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span><span class="token comment">// Create a middleware that adds a X-Response-Time header to response.</span>app <span class="token punctuation">.</span> <span class="token function">use</span> <span class="token punctuation">(</span> <span class="token function">responseTime</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span><span class="token keyword">const</span> <span class="token function-variable function">getBook</span> <span class="token operator">=</span> <span class="token punctuation">(</span> req <span class="token punctuation">,</span> res <span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span><span class="token keyword">let</span> isbn <span class="token operator">=</span> req <span class="token punctuation">.</span> query <span class="token punctuation">.</span> isbn <span class="token punctuation">;</span><span class="token keyword">let</span> url <span class="token operator">=</span> <span class="token template-string"><span class="token string">`https://wwww.googleapis.com/books/v1/volumes?q=isbn:</span> <span class="token interpolation"><span class="token interpolation-punctuation punctuation">${</span> isbn <span class="token interpolation-punctuation punctuation">}</span></span> <span class="token string">`</span></span> <span class="token punctuation">;</span><span class="token keyword">return</span> axios<span class="token punctuation">.</span> <span class="token keyword">get</span> <span class="token punctuation">(</span> url <span class="token punctuation">)</span><span class="token punctuation">.</span> <span class="token function">then</span> <span class="token punctuation">(</span> response <span class="token operator">=></span> <span class="token punctuation">{</span><span class="token keyword">let</span> book <span class="token operator">=</span> response <span class="token punctuation">.</span> data <span class="token punctuation">.</span> items <span class="token punctuation">;</span><span class="token comment">// Set the string-key: isbn in our cache. With his contents of the cache: title</span><span class="token comment">// Set cache expirations to 1 hour (60minutes)</span>client <span class="token punctuation">.</span> <span class="token function">setex</span> <span class="token punctuation">(</span> isbn <span class="token punctuation">,</span> <span class="token number">3600</span> <span class="token punctuation">,</span> <span class="token constant">JSON</span> <span class="token punctuation">.</span> <span class="token function">stringify</span> <span class="token punctuation">(</span> book <span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span>res <span class="token punctuation">.</span> <span class="token function">send</span> <span class="token punctuation">(</span> book <span class="token punctuation">)</span> <span class="token punctuation">;</span><span class="token punctuation">}</span> <span class="token punctuation">)</span><span class="token punctuation">.</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span> err <span class="token operator">=></span> <span class="token punctuation">{</span>res <span class="token punctuation">.</span> <span class="token function">send</span> <span class="token punctuation">(</span> <span class="token string">"The book you are looking for is not found!!!"</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span><span class="token punctuation">}</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span><span class="token punctuation">}</span> <span class="token punctuation">;</span><span class="token keyword">const</span> <span class="token function-variable function">getCache</span> <span class="token operator">=</span> <span class="token punctuation">(</span> req <span class="token punctuation">,</span> res <span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span><span class="token keyword">let</span> isbn <span class="token operator">=</span> req <span class="token punctuation">.</span> query <span class="token punctuation">.</span> isbn <span class="token punctuation">;</span><span class="token comment">//Check the cache data from the server redis</span>client <span class="token punctuation">.</span> <span class="token keyword">get</span> <span class="token punctuation">(</span> isbn <span class="token punctuation">,</span> <span class="token punctuation">(</span> err <span class="token punctuation">,</span> result <span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span><span class="token keyword">if</span> <span class="token punctuation">(</span> result <span class="token punctuation">)</span> <span class="token punctuation">{</span>res <span class="token punctuation">.</span> <span class="token function">send</span> <span class="token punctuation">(</span> result <span class="token punctuation">)</span> <span class="token punctuation">;</span><span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span><span class="token function">getBook</span> <span class="token punctuation">(</span> req <span class="token punctuation">,</span> res <span class="token punctuation">)</span> <span class="token punctuation">;</span><span class="token punctuation">}</span><span class="token punctuation">}</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span><span class="token punctuation">}</span> <span class="token punctuation">;</span>app <span class="token punctuation">.</span> <span class="token keyword">get</span> <span class="token punctuation">(</span> <span class="token string">"/book"</span> <span class="token punctuation">,</span> getCache <span class="token punctuation">)</span> <span class="token punctuation">;</span>app <span class="token punctuation">.</span> <span class="token function">listen</span> <span class="token punctuation">(</span> <span class="token number">3000</span> <span class="token punctuation">,</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span>console <span class="token punctuation">.</span> <span class="token function">log</span> <span class="token punctuation">(</span> <span class="token template-string"><span class="token string">`Your node is running on port 3000!!!`</span></span> <span class="token punctuation">)</span> <span class="token punctuation">;</span><span class="token punctuation">}</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> - Upon receiving the request from the client. The server with
withoutRedisAsCache.js
will call the third party api (here google) and return it to the user. Server withwithRedisAsCache.js
will check redis first without calling google api (and will be updated to redis for the next call). - To run the external server initialize 2 files as above. I installed a number of things:
npm init -y
initialize project- Install the required modules:
npm i express axios response-time redis
- Launch server side with
node withoutRedisAsCache.js
node withRedisAsCache.js
ornode withRedisAsCache.js
.
- Now let’s look at the response time for each api. With the same query to the server. Here I want to check server response time. If you want to see the full response then remove the
--head
option:12curl --head --request GET 'http://localhost:3000/book?isbn=0747532699' - When there is no redis server time to handle 748,695ms :12345678910<span class="token function">curl</span> --head --request GET <span class="token string">'http://localhost:3000/book?isbn=0747532699'</span>HTTP/1.1 200 OKX-Powered-By: ExpressContent-Type: application/json <span class="token punctuation">;</span> charset <span class="token operator">=</span> utf-8Content-Length: 5555ETag: W/ <span class="token string">"15b3-oclsTdp62saXpCDwbRd1UpovElU"</span>X-Response-Time: 748.695msDate: Tue, 04 Feb 2020 21:47:10 GMTConnection: keep-alive
- When redis caches 151.236ms processing time:12345678910curl --head --request GET 'http://localhost:3000/book?isbn=0747532699'HTTP/1.1 200 OKX-Powered-By: ExpressContent-Type: text/html; charset=utf-8Content-Length: 44ETag: W/"2c-MIHHo48jJM1V6k/iF6QDT81JmfU"X-Response-Time: 151.236msDate: Tue, 04 Feb 2020 21:45:40 GMTConnection: keep-alive
Redis as DB
- As a second example, in some cases instead of saving to traditional SQL or noSQL databases we can use redis instead.
- Use mongodb:12345678910111213141516171819202122232425262728293031323334353637383940414243<span class="token comment">// mongoDB.js</span><span class="token keyword">const</span> mongoose <span class="token operator">=</span> <span class="token function">require</span> <span class="token punctuation">(</span> <span class="token string">"mongoose"</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span><span class="token keyword">const</span> express <span class="token operator">=</span> <span class="token function">require</span> <span class="token punctuation">(</span> <span class="token string">"express"</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span><span class="token keyword">const</span> responseTime <span class="token operator">=</span> <span class="token function">require</span> <span class="token punctuation">(</span> <span class="token string">"response-time"</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span><span class="token keyword">const</span> mongoDB <span class="token operator">=</span> <span class="token string">"mongodb://127.0.0.1/test"</span> <span class="token punctuation">;</span>mongoose <span class="token punctuation">.</span> <span class="token function">connect</span> <span class="token punctuation">(</span> mongoDB <span class="token punctuation">,</span> <span class="token punctuation">{</span> useNewUrlParser <span class="token punctuation">:</span> <span class="token boolean">true</span> <span class="token punctuation">}</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span><span class="token keyword">const</span> app <span class="token operator">=</span> <span class="token function">express</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span>app <span class="token punctuation">.</span> <span class="token function">use</span> <span class="token punctuation">(</span> <span class="token function">responseTime</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span><span class="token comment">// create a Schema</span><span class="token keyword">const</span> UserSchema <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">mongoose <span class="token punctuation">.</span> Schema</span> <span class="token punctuation">(</span> <span class="token punctuation">{</span>name <span class="token punctuation">:</span> String <span class="token punctuation">,</span>lastLogin <span class="token punctuation">:</span> <span class="token punctuation">{</span> type <span class="token punctuation">:</span> String <span class="token punctuation">,</span> index <span class="token punctuation">:</span> <span class="token boolean">true</span> <span class="token punctuation">}</span><span class="token punctuation">}</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span><span class="token comment">// create model from Schema</span><span class="token keyword">const</span> UserModel <span class="token operator">=</span> mongoose <span class="token punctuation">.</span> <span class="token function">model</span> <span class="token punctuation">(</span> <span class="token string">"Users"</span> <span class="token punctuation">,</span> UserSchema <span class="token punctuation">)</span> <span class="token punctuation">;</span><span class="token comment">// run this block only one time to create new User</span><span class="token comment">// start block create user</span><span class="token keyword">const</span> newUser <span class="token operator">=</span> <span class="token function">UserModel</span> <span class="token punctuation">(</span> <span class="token punctuation">{</span>name <span class="token punctuation">:</span> <span class="token string">"Asterisk"</span> <span class="token punctuation">,</span>lastLogin <span class="token punctuation">:</span> <span class="token template-string"><span class="token string">`</span> <span class="token interpolation"><span class="token interpolation-punctuation punctuation">${</span> <span class="token keyword">new</span> <span class="token class-name">Date</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">.</span> <span class="token function">getTime</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token interpolation-punctuation punctuation">}</span></span> <span class="token string">`</span></span><span class="token punctuation">}</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span>newUser <span class="token punctuation">.</span> <span class="token function">save</span> <span class="token punctuation">(</span> err <span class="token operator">=></span> <span class="token punctuation">{</span><span class="token keyword">if</span> <span class="token punctuation">(</span> err <span class="token punctuation">)</span> console <span class="token punctuation">.</span> <span class="token function">error</span> <span class="token punctuation">(</span> <span class="token template-string"><span class="token string">`save to db error: `</span></span> <span class="token punctuation">,</span> err <span class="token punctuation">)</span> <span class="token punctuation">;</span>console <span class="token punctuation">.</span> <span class="token function">log</span> <span class="token punctuation">(</span> <span class="token string">"User created"</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span><span class="token punctuation">}</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span><span class="token comment">// end block create user</span>app <span class="token punctuation">.</span> <span class="token keyword">get</span> <span class="token punctuation">(</span> <span class="token string">"/user"</span> <span class="token punctuation">,</span> <span class="token punctuation">(</span> req <span class="token punctuation">,</span> res <span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span>UserModel <span class="token punctuation">.</span> <span class="token function">findOne</span> <span class="token punctuation">(</span> <span class="token punctuation">{</span> name <span class="token punctuation">:</span> <span class="token string">"Asterisk"</span> <span class="token punctuation">}</span> <span class="token punctuation">,</span> <span class="token punctuation">(</span> err <span class="token punctuation">,</span> response <span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span>res <span class="token punctuation">.</span> <span class="token function">json</span> <span class="token punctuation">(</span> response <span class="token punctuation">)</span> <span class="token punctuation">;</span><span class="token punctuation">}</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span><span class="token punctuation">}</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span>app <span class="token punctuation">.</span> <span class="token function">listen</span> <span class="token punctuation">(</span> <span class="token number">3000</span> <span class="token punctuation">,</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span>console <span class="token punctuation">.</span> <span class="token function">log</span> <span class="token punctuation">(</span> <span class="token template-string"><span class="token string">`Your node runiing on port 3000!`</span></span> <span class="token punctuation">)</span> <span class="token punctuation">;</span><span class="token punctuation">}</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span>
- Here I create a
User
collection with a simple document {name: Asterisk, lastLogin: string} with lastLogin being time in milliseconds. - Install the mongoose package:
npm i mongoose
. - Run server:
node mongoDB.js
. - Check the response from the server:123$ curl --request GET 'http://localhost:3000/user'{"_id":"5e39ef517017466d73374df9","name":"Asterisk","lastLogin":"1580855121662","__v":0}
- Check Header to see response time:12345678910curl --head --request GET 'http://localhost:3000/user'HTTP/1.1 200 OKX-Powered-By: ExpressContent-Type: application/json; charset=utf-8Content-Length: 88ETag: W/"58-tbwvkcJnjDHdbM+ylOQJecz0iEs"X-Response-Time: 2.821msDate: Tue, 04 Feb 2020 22:35:27 GMTConnection: keep-alive
- So for a record, indexed, the time is about 2,821ms
- If the same purpose saved lastLogin but this time I will save in redis:
- Use redis:123456789101112131415161718192021222324<span class="token comment">// redisDB.js</span><span class="token keyword">const</span> express <span class="token operator">=</span> <span class="token function">require</span> <span class="token punctuation">(</span> <span class="token string">"express"</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span><span class="token keyword">const</span> responseTime <span class="token operator">=</span> <span class="token function">require</span> <span class="token punctuation">(</span> <span class="token string">"response-time"</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span><span class="token keyword">const</span> axios <span class="token operator">=</span> <span class="token function">require</span> <span class="token punctuation">(</span> <span class="token string">"axios"</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span><span class="token keyword">const</span> redis <span class="token operator">=</span> <span class="token function">require</span> <span class="token punctuation">(</span> <span class="token string">"redis"</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span><span class="token keyword">const</span> client <span class="token operator">=</span> redis <span class="token punctuation">.</span> <span class="token function">createClient</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span><span class="token keyword">const</span> app <span class="token operator">=</span> <span class="token function">express</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span>app <span class="token punctuation">.</span> <span class="token function">use</span> <span class="token punctuation">(</span> <span class="token function">responseTime</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span><span class="token comment">// Run this line only one time to set for redis</span>client <span class="token punctuation">.</span> <span class="token keyword">set</span> <span class="token punctuation">(</span> <span class="token template-string"><span class="token string">`Asterisk`</span></span> <span class="token punctuation">,</span> <span class="token template-string"><span class="token string">`</span> <span class="token interpolation"><span class="token interpolation-punctuation punctuation">${</span> <span class="token keyword">new</span> <span class="token class-name">Date</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">.</span> <span class="token function">getTime</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token interpolation-punctuation punctuation">}</span></span> <span class="token string">`</span></span> <span class="token punctuation">)</span> <span class="token punctuation">;</span>app <span class="token punctuation">.</span> <span class="token keyword">get</span> <span class="token punctuation">(</span> <span class="token string">"/user"</span> <span class="token punctuation">,</span> <span class="token punctuation">(</span> req <span class="token punctuation">,</span> res <span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span>client <span class="token punctuation">.</span> <span class="token keyword">get</span> <span class="token punctuation">(</span> <span class="token template-string"><span class="token string">`Asterisk`</span></span> <span class="token punctuation">,</span> <span class="token punctuation">(</span> err <span class="token punctuation">,</span> result <span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span><span class="token keyword">if</span> <span class="token punctuation">(</span> err <span class="token punctuation">)</span> console <span class="token punctuation">.</span> <span class="token function">error</span> <span class="token punctuation">(</span> err <span class="token punctuation">)</span> <span class="token punctuation">;</span>res <span class="token punctuation">.</span> <span class="token function">send</span> <span class="token punctuation">(</span> result <span class="token punctuation">)</span> <span class="token punctuation">;</span><span class="token punctuation">}</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span><span class="token punctuation">}</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span>app <span class="token punctuation">.</span> <span class="token function">listen</span> <span class="token punctuation">(</span> <span class="token number">3000</span> <span class="token punctuation">,</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span>console <span class="token punctuation">.</span> <span class="token function">log</span> <span class="token punctuation">(</span> <span class="token template-string"><span class="token string">`Your node is running on port 3000!!!`</span></span> <span class="token punctuation">)</span> <span class="token punctuation">;</span><span class="token punctuation">}</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span>
- Test response from server side:
123$ curl --request GET 'http://localhost:3000/user'1580857007517- Check header view response time 0.384ms :
12345678910curl --head --request GET 'http://localhost:3000/user'HTTP/1.1 200 OKX-Powered-By: ExpressContent-Type: text/html; charset=utf-8Content-Length: 13ETag: W/"d-JS5kVrHA/I/MbbqfR1u35i9JqlI"X-Response-Time: 0.384msDate: Tue, 04 Feb 2020 23:04:12 GMTConnection: keep-alive
Conclusion
- In the above part, I demo 2 examples to change server response time to client:
- When using redis as cache time decreased: 748,695ms -> 151,236ms.
- When using redis as db time decreased: 2,821ms -> 0.384ms.
- The above two changes in time are only relative because each time running has changed slightly. But nonetheless see the rate of change quite clearly in terms of response time.
- When the results returned by the client do not change much, we can consider using Redis as a cache and updating when there are changes, for example, user information, or in the above example, from a book: author , year of issue …
- When the API prioritizes real-time responsiveness as fast as in example 2 we can also consider saving some information in redis instead of the usual db. Although each type of DB still has its own strengths, we need to consider when choosing
Bonus Redis command exec on:
- String:
GET
: Get the value of the key (get value of key) returns nil if the key does not exist and error if the value stored in the key is not string. GET only handles value as string.SET
: assign a value (type of string) to a key. If the key is already valid, it will be overwritten (regardless of the previous type). Options:- EX seconds: the time expires in seconds.
- PX milliseconds: time expires in milliseconds.
- NX: Only considered when the key contains no value.
- XX: Only consider if the key has no value.
- Because SET has the above options, the following statements may be dropped in the future: SETEX, SETNX, PSETEX.
INCR
: Increase the number stored in the key by one. If the key has no value, it is set to 0 and increments by 1 (ie = 1). Returns an error if the value stored in the key is not a string or a string cannot be converted to a number. Addition 1 is limited by 64 bit signed integers.DECR
: Same asINCR
but this guy minus 1.
- List:
- To be a little girl: will update some more commands in redis.