Introduction
- Dự án mình đang làm có liên quan redis, nên tiện thể note lại một chút thực hành luôn.
- Bài này mình sẽ không trình bày: Redis là gì?. Vì sao nên dùng redis.
- Bài viết này chỉ đưa ra kết quả so sánh khi chuyển sang dùng redis làm cache hoặc thay thế các kiểu dữ liệu truyền thống (SQL và NoSQL).
Redis as cache
Cùng xem ví dụ nodejs app trả về thông tin sách thông qua dữ liệu của google api.
- Không sử dụng 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>- Có sử dụng redis làm 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>Khi nhận được request từ client. Server với
withoutRedisAsCache.js
sẽ call api bên thứ ba (ở đây là google) và trả về cho người dùng. Server vớiwithRedisAsCache.js
sẽ check redis trước không có mới gọi api google ( và sẽ được cập nhật vào redis cho lần gọi sau).Để chạy phía server ngoài khởi tạo 2 file như trên. Mình cài đặt 1 số thứ:
npm init -y
khởi tạo project- Cài đặt các module cần thiết:
npm i express axios response-time redis
- Khởi chạy phía server side với
node withoutRedisAsCache.js
hoặcnode withRedisAsCache.js
.
Giờ cùng xem thời gian phản hồi của mỗi api như nào. Với cùng một truy vấn tới server. Ở đây mình muốn check thời gian server phản hồi. Nếu bạn muốn xem full response thì bỏ option
--head
là được:12curl --head --request GET 'http://localhost:3000/book?isbn=0747532699'Khi không có redis thời gian server xử lý 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-aliveKhi có redis làm cache thời gian xử lý 151.236ms:
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
Một ví dụ thứ hai, một số trường hợp thay vì lưu vào db truyền thống SQL hay noSQL chúng ta có thể sử dụng redis thay thế.
Sử dụng 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>Ở đây mình tạo 1 collection
User
với một document đơn giản {name: Asterisk, lastLogin: string} với lastLogin là time theo mili giây.Cài đặt gói mongoose:
npm i mongoose
.Chạy server:
node mongoDB.js
.Check response từ phía server:
123$ curl --request GET 'http://localhost:3000/user'{"_id":"5e39ef517017466d73374df9","name":"Asterisk","lastLogin":"1580855121662","__v":0}Check Header xem thời gian phản hồi:
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-aliveNhư vậy với một bản ghi, đã được index, thời gian cỡ khoảng 2.821ms
Nếu cùng mục đích sử dụng lưu lastLogin nhưng lần này mình sẽ lưu trong redis thì sao:
Sử dụng 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 thử response từ phía server:
123$ curl --request GET 'http://localhost:3000/user'1580857007517- Check header xem thời gian phản hồi 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
- Phần trên mình demo 2 ví dụ thay đổi thời gian phản hồi server tới client:
- Khi dùng redis làm cache thời gian giảm: 748.695ms -> 151.236ms.
- Khi dùng redis làm db thời gian giảm: 2.821ms -> 0.384ms.
- Hai thay đổi về thời gian trên chỉ mang tính tương đối vì mỗi lần chạy thời gian có thay đổi đôi chút. Nhưng dù sao cũng thấy được tỉ lệ thay đổi khá rõ dệt về mặt thời gian phản hồi.
- Khi các kết quả trả về client ít thay đổi chúng ta có thể xem xét việc dùng Redis làm cache và cập nhật lại khi có thay đổi ví dụ: thông tin người dùng, hoặc trong ví dụ trên thông tin một quyển sách: tác giả, năm phát hành …
- Khi API ưu tiên tính thời gian thực phản hồi nhanh như trong ví dụ 2 chúng ta có cũng thế xem xét lưu một số thông tin trong redis thay vì db thông thường. Dù mỗi loại DB vẫn có điểm mạnh riêng chúng ta cần cân nhắc khi chọn lựa
Bonus Redis command exec on:
String:
GET
: lấy ra giá trị của key (get value of key) trả về nil nếu key không tồn tại và error nếu gía trị lưu trong key không phải string. GET chỉ handle giá trị là string.SET
: gán giá trị (kiểu string ) cho một key. Nếu key đã có giá trị nó sẽ bị ghi đè ( không quan tâm kiểu trước đó là gì). Các options:- EX giây: thời gian bị hết hạn theo giây.
- PX mili giây: thời gian bị hết hạn theo mili giây.
- NX: Chỉ xét khi key chưa chứa giá trị.
- XX: Chỉ xét nếu key đã chưa giá trị.
- Do SET có các options như trên nên các câu lệnh như sau có thể bị bỏ trong tương lại: SETEX, SETNX, PSETEX.
INCR
: Tăng số đang được lưu trong key lên một. Nếu key không có giá trị nó được gán về 0 và tăng lên 1 ( tức = 1).Trả về lỗi nếu giá trị lưu trong key không phải là string hoặc string không chuyển thành số được. Phép cộng 1 giới hạn bởi 64 bit signed integers.DECR
: Tương tựINCR
nhưng thằng này trừ 1.
List:
To be con tì niu: sẽ update thêm mấy lệnh nữa trong redis.