{"id":89036,"date":"2025-07-06T22:44:51","date_gmt":"2025-07-06T15:44:51","guid":{"rendered":"https:\/\/itviec.com\/blog\/?p=89036"},"modified":"2025-07-06T22:44:54","modified_gmt":"2025-07-06T15:44:54","slug":"huong-dan-trien-khai-redis-nodejs","status":"publish","type":"post","link":"https:\/\/itviec.com\/blog\/huong-dan-trien-khai-redis-nodejs\/","title":{"rendered":"Redis Nodejs: C\u00e1ch s\u1eed d\u1ee5ng Redis trong Nodejs chi ti\u1ebft A-Z"},"content":{"rendered":"<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_84 counter-hierarchy ez-toc-counter ez-toc-grey ez-toc-container-direction\">\n<div class=\"ez-toc-title-container\">\n<p class=\"ez-toc-title\" style=\"cursor:inherit\">N\u1ed9i dung b\u00e0i vi\u1ebft<\/p>\n<span class=\"ez-toc-title-toggle\"><a href=\"#\" class=\"ez-toc-pull-right ez-toc-btn ez-toc-btn-xs ez-toc-btn-default ez-toc-toggle\" aria-label=\"Toggle Table of Content\"><span class=\"ez-toc-js-icon-con\"><span class=\"\"><span class=\"eztoc-hide\" style=\"display:none;\">Toggle<\/span><span class=\"ez-toc-icon-toggle-span\"><svg style=\"fill: #999;color:#999\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"list-377408\" width=\"20px\" height=\"20px\" viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z\" fill=\"currentColor\"><\/path><\/svg><svg style=\"fill: #999;color:#999\" class=\"arrow-unsorted-368013\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"10px\" height=\"10px\" viewBox=\"0 0 24 24\" version=\"1.2\" baseProfile=\"tiny\"><path d=\"M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z\"\/><\/svg><\/span><\/span><\/span><\/a><\/span><\/div>\n<nav><ul class='ez-toc-list ez-toc-list-level-1 ' ><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/itviec.com\/blog\/huong-dan-trien-khai-redis-nodejs\/#Tong_quan_ve_Redis\" >T\u1ed5ng quan v\u1ec1 Redis&nbsp;<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/itviec.com\/blog\/huong-dan-trien-khai-redis-nodejs\/#Cai_dat_va_ket_noi_Redis_Nodejs\" >C\u00e0i \u0111\u1eb7t v\u00e0 k\u1ebft n\u1ed1i Redis Node.js<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/itviec.com\/blog\/huong-dan-trien-khai-redis-nodejs\/#Cac_thao_tac_du_lieu_trong_Redis_Nodejs\" >C\u00e1c thao t\u00e1c d\u1eef li\u1ec7u trong Redis Nodejs<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-4\" href=\"https:\/\/itviec.com\/blog\/huong-dan-trien-khai-redis-nodejs\/#Cac_vi_du_su_dung_Redis_thuc_te_trong_Nodejs\" >C\u00e1c v\u00ed d\u1ee5 s\u1eed d\u1ee5ng Redis th\u1ef1c t\u1ebf trong Nodejs<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-5\" href=\"https:\/\/itviec.com\/blog\/huong-dan-trien-khai-redis-nodejs\/#Mot_so_luu_y_khi_su_dung_Redis_trong_Nodejs\" >M\u1ed9t s\u1ed1 l\u01b0u \u00fd khi s\u1eed d\u1ee5ng Redis trong Node.js<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-6\" href=\"https:\/\/itviec.com\/blog\/huong-dan-trien-khai-redis-nodejs\/#Cau_hoi_thuong_gap_ve_Redis_Nodejs\" >C\u00e2u h\u1ecfi th\u01b0\u1eddng g\u1eb7p v\u1ec1 Redis Nodejs<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-7\" href=\"https:\/\/itviec.com\/blog\/huong-dan-trien-khai-redis-nodejs\/#Tong_ket_Redis_Nodejs\" >T\u1ed5ng k\u1ebft Redis Nodejs<\/a><\/li><\/ul><\/nav><\/div>\n\n<p><strong><em>Khi k\u1ebft h\u1ee3p gi\u1eefa Redis Nodejs, ta kh\u00f4ng ch\u1ec9 t\u0103ng t\u1ed1c \u0111\u1ed9 ph\u1ea3n h\u1ed3i c\u1ee7a \u1ee9ng d\u1ee5ng m\u00e0 c\u00f2n gi\u1ea3m \u0111\u00e1ng k\u1ec3 \u00e1p l\u1ef1c l\u00ean API v\u00e0 c\u01a1 s\u1edf d\u1eef li\u1ec7u. S\u1ef1 k\u1ebft h\u1ee3p n\u00e0y l\u00e0 s\u1eed d\u1ee5ng Redis nh\u01b0 m\u1ed9t l\u1edbp cache trung gian: thay v\u00ec g\u1ecdi API nhi\u1ec1u l\u1ea7n, ta ch\u1ec9 c\u1ea7n g\u1ecdi m\u1ed9t l\u1ea7n duy nh\u1ea5t, sau \u0111\u00f3 l\u01b0u k\u1ebft qu\u1ea3 v\u00e0o b\u1ed9 nh\u1edb v\u00e0 t\u00e1i s\u1eed d\u1ee5ng cho c\u00e1c l\u1ea7n sau. K\u1ebft qu\u1ea3 l\u00e0 \u1ee9ng d\u1ee5ng ch\u1ea1y nhanh h\u01a1n, m\u01b0\u1ee3t h\u01a1n v\u00e0 ti\u1ebft ki\u1ec7m t\u00e0i nguy\u00ean h\u01a1n.<\/em><\/strong><\/p>\n\n\n\n<p>Trong b\u00e0i vi\u1ebft n\u00e0y, ch\u00fang ta s\u1ebd c\u00f9ng t\u00ecm hi\u1ec3u c\u00e1ch t\u00edch h\u1ee3p Redis v\u00e0o \u1ee9ng d\u1ee5ng Node.js \u0111\u1ec3 khai th\u00e1c t\u1ed1i \u0111a l\u1ee3i \u00edch t\u1eeb m\u00f4 h\u00ecnh n\u00e0y. C\u1ee5 th\u1ec3:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>C\u00e1ch c\u00e0i \u0111\u1eb7t v\u00e0 k\u1ebft n\u1ed1i Redis v\u1edbi Node.js<\/li>\n\n\n\n<li>C\u00e1c thao t\u00e1c d\u1eef li\u1ec7u trong Redis Node.js<\/li>\n\n\n\n<li>C\u00e1c v\u00ed d\u1ee5 th\u1ef1c th\u1ebf<\/li>\n\n\n\n<li>M\u1ed9t s\u1ed1 l\u01b0u \u00fd \u0111\u1ec3 s\u1eed d\u1ee5ng Redis Node.js hi\u1ec7u qu\u1ea3<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-t\u1ed5ng-quan-v\u1ec1-redis-nbsp\"><span class=\"ez-toc-section\" id=\"Tong_quan_ve_Redis\"><\/span><strong>T\u1ed5ng quan v\u1ec1 Redis&nbsp;<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>Redis l\u00e0 m\u1ed9t h\u1ec7 th\u1ed1ng c\u01a1 s\u1edf d\u1eef li\u1ec7u in-memory m\u00e3 ngu\u1ed3n m\u1edf, n\u1ed5i ti\u1ebfng v\u1edbi t\u1ed1c \u0111\u1ed9 truy xu\u1ea5t si\u00eau nhanh v\u00e0 kh\u1ea3 n\u0103ng x\u1eed l\u00fd d\u1eef li\u1ec7u theo th\u1eddi gian th\u1ef1c.<\/p>\n\n\n\n<p>Redis kh\u00f4ng ch\u1ec9 \u0111\u01a1n thu\u1ea7n l\u00e0 m\u1ed9t n\u01a1i l\u01b0u t\u1ea1m d\u1eef li\u1ec7u (<em>cache<\/em>) m\u00e0 c\u00f2n h\u1ed7 tr\u1ee3 nhi\u1ec1u c\u1ea5u tr\u00fac d\u1eef li\u1ec7u phong ph\u00fa nh\u01b0 chu\u1ed7i k\u00fd t\u1ef1 (strings), hashes (b\u1ea3ng \u00e1nh x\u1ea1 kh\u00f3a-gi\u00e1 tr\u1ecb gi\u1ed1ng nh\u01b0 t\u1eeb \u0111i\u1ec3n), danh s\u00e1ch c\u00f3 th\u1ee9 t\u1ef1 (lists), t\u1eadp h\u1ee3p kh\u00f4ng tr\u00f9ng l\u1eb7p (sets), t\u1eadp h\u1ee3p c\u00f3 th\u1ee9 t\u1ef1 v\u00e0 k\u00e8m \u0111i\u1ec3m s\u1ed1 \u0111\u1ec3 s\u1eafp x\u1ebfp (sorted sets), bitmaps v\u00e0 streams.<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p><em>\u0110\u1ecdc th\u00eam: <a href=\"https:\/\/itviec.com\/blog\/redis-la-gi\/\" target=\"_blank\" rel=\"noreferrer noopener\"><strong>Redis l\u00e0 g\u00ec: T\u1ed5ng h\u1ee3p t\u00ednh n\u0103ng h\u1eefu \u00edch nh\u1ea5t c\u1ee7a Redis<\/strong><\/a><\/em><\/p>\n<\/blockquote>\n\n\n\n<p>Khi Redis \u0111\u01b0\u1ee3c t\u00edch h\u1ee3p v\u00e0o \u1ee9ng d\u1ee5ng <a href=\"https:\/\/itviec.com\/blog\/nodejs-la-gi\/\" target=\"_blank\" rel=\"noreferrer noopener\">Node.js<\/a>, nh\u1eefng c\u1ea5u tr\u00fac n\u00e0y mang l\u1ea1i nhi\u1ec1u l\u1ee3i \u00edch thi\u1ebft th\u1ef1c nh\u01b0: hashes r\u1ea5t ph\u00f9 h\u1ee3p \u0111\u1ec3 l\u01b0u session ng\u01b0\u1eddi d\u00f9ng m\u1ed9t c\u00e1ch hi\u1ec7u qu\u1ea3; lists v\u00e0 sorted sets th\u01b0\u1eddng \u0111\u01b0\u1ee3c d\u00f9ng \u0111\u1ec3 qu\u1ea3n l\u00fd h\u00e0ng \u0111\u1ee3i ho\u1eb7c b\u1ea3ng x\u1ebfp h\u1ea1ng; c\u00f2n Pub\/Sub v\u00e0 streams l\u1ea1i gi\u00fap x\u00e2y d\u1ef1ng c\u00e1c h\u1ec7 th\u1ed1ng x\u1eed l\u00fd th\u1eddi gian th\u1ef1c nh\u01b0 chat ho\u1eb7c th\u00f4ng b\u00e1o.<\/p>\n\n\n\n<p>V\u00ec Redis c\u1ef1c k\u1ef3 nh\u1eb9, nhanh v\u00e0 d\u1ec5 t\u00edch h\u1ee3p, n\u00f3 \u0111\u00e3 tr\u1edf th\u00e0nh m\u1ed9t gi\u1ea3i ph\u00e1p quen thu\u1ed9c trong c\u00e1c \u1ee9ng d\u1ee5ng web hi\u1ec7n \u0111\u1ea1i t\u1eeb c\u00e1c startup nh\u1ecf \u0111\u1ebfn c\u00e1c n\u1ec1n t\u1ea3ng l\u1edbn nh\u01b0 Twitter, GitHub hay StackOverflow.<\/p>\n\n\n\n<p>Redis c\u0169ng cung c\u1ea5p c\u00e1c t\u00f9y ch\u1ecdn l\u01b0u tr\u1eef b\u1ec1n v\u1eefng (<em>persistence<\/em>) \u0111\u1ec3 \u0111\u1ea3m b\u1ea3o d\u1eef li\u1ec7u kh\u00f4ng b\u1ecb m\u1ea5t khi m\u00e1y ch\u1ee7 kh\u1edfi \u0111\u1ed9ng l\u1ea1i. C\u1ee5 th\u1ec3, Redis h\u1ed7 tr\u1ee3 hai c\u01a1 ch\u1ebf ch\u00ednh:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>RDB snapshots<\/strong>: l\u00e0 c\u00e1ch \u0111\u1ecbnh k\u1ef3 ghi l\u1ea1i to\u00e0n b\u1ed9 d\u1eef li\u1ec7u trong b\u1ed9 nh\u1edb xu\u1ed1ng \u0111\u0129a gi\u1ed1ng nh\u01b0 ch\u1ee5p nhanh tr\u1ea1ng th\u00e1i hi\u1ec7n t\u1ea1i c\u1ee7a h\u1ec7 th\u1ed1ng.<\/li>\n\n\n\n<li><strong>AOF (Append Only File)<\/strong>: l\u00e0 ph\u01b0\u01a1ng ph\u00e1p ghi l\u1ea1i t\u1eebng thay \u0111\u1ed5i d\u1eef li\u1ec7u d\u01b0\u1edbi d\u1ea1ng nh\u1eadt k\u00fd (log), gi\u00fap h\u1ec7 th\u1ed1ng c\u00f3 th\u1ec3 kh\u00f4i ph\u1ee5c l\u1ea1i to\u00e0n b\u1ed9 tr\u1ea1ng th\u00e1i b\u1eb1ng c\u00e1ch &#8220;ph\u00e1t l\u1ea1i&#8221; c\u00e1c thao t\u00e1c \u0111\u00e3 th\u1ef1c hi\u1ec7n.<\/li>\n<\/ul>\n\n\n\n<p>M\u1ed9t trong nh\u1eefng \u1ee9ng d\u1ee5ng \u0111i\u1ec3n h\u00ecnh v\u00e0 d\u1ec5 ti\u1ebfp c\u1eadn nh\u1ea5t c\u1ee7a Redis l\u00e0 khi k\u1ebft h\u1ee3p c\u00f9ng Node.js &#8211; n\u1ec1n t\u1ea3ng ph\u1ed5 bi\u1ebfn \u0111\u1ec3 x\u00e2y d\u1ef1ng c\u00e1c \u1ee9ng d\u1ee5ng web hi\u1ec7u su\u1ea5t cao. S\u1ef1 k\u1ebft h\u1ee3p n\u00e0y r\u1ea5t ph\u00f9 h\u1ee3p \u0111\u1ec3:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>T\u0103ng t\u1ed1c \u1ee9ng d\u1ee5ng b\u1eb1ng c\u00e1ch cache c\u00e1c d\u1eef li\u1ec7u th\u01b0\u1eddng d\u00f9ng v\u00e0 k\u1ebft qu\u1ea3 truy v\u1ea5n c\u01a1 s\u1edf d\u1eef li\u1ec7u<\/li>\n\n\n\n<li>L\u01b0u session ng\u01b0\u1eddi d\u00f9ng m\u1ed9t c\u00e1ch hi\u1ec7u qu\u1ea3 trong c\u00e1c \u1ee9ng d\u1ee5ng web, \u0111\u1eb7c bi\u1ec7t ph\u00f9 h\u1ee3p trong c\u00e1c h\u1ec7 th\u1ed1ng s\u1eed d\u1ee5ng ki\u1ebfn tr\u00fac microservices<\/li>\n\n\n\n<li>Giao ti\u1ebfp gi\u1eefa c\u00e1c th\u00e0nh ph\u1ea7n (Pub\/Sub) trong h\u1ec7 th\u1ed1ng th\u1eddi gian th\u1ef1c nh\u01b0 c\u00e1c \u1ee9ng d\u1ee5ng chat, th\u00f4ng b\u00e1o tr\u1ef1c ti\u1ebfp (live notifications) ho\u1eb7c game nhi\u1ec1u ng\u01b0\u1eddi ch\u01a1i.<\/li>\n\n\n\n<li>Qu\u1ea3n l\u00fd h\u00e0ng \u0111\u1ee3i t\u00e1c v\u1ee5 (<em>queues<\/em>) nh\u01b0 g\u1eedi email, x\u1eed l\u00fd n\u1ec1n v\u00e0 l\u00ean l\u1ecbch \u0111\u1ec3 th\u1ef1c hi\u1ec7n m\u1ed9t t\u00e1c v\u1ee5 n\u00e0o \u0111\u00f3 v\u00e0o m\u1ed9t th\u1eddi \u0111i\u1ec3m c\u1ee5 th\u1ec3 trong t\u01b0\u01a1ng lai ho\u1eb7c th\u1ef1c hi\u1ec7n \u0111\u1ecbnh k\u1ef3 theo chu k\u1ef3 \u0111\u00e3 \u0111\u1ecbnh tr\u01b0\u1edbc (<em>job scheduling<\/em>).<\/li>\n\n\n\n<li>Th\u1ef1c hi\u1ec7n gi\u1edbi h\u1ea1n t\u1ea7n su\u1ea5t truy c\u1eadp (<em>rate limiting<\/em>) v\u00e0 \u0111i\u1ec1u ti\u1ebft API (<em>API throttling<\/em>) nh\u1eb1m b\u1ea3o v\u1ec7 h\u1ec7 th\u1ed1ng kh\u1ecfi c\u00e1c h\u00e0nh vi l\u1ea1m d\u1ee5ng ho\u1eb7c qu\u00e1 t\u1ea3i.<\/li>\n\n\n\n<li>X\u00e2y d\u1ef1ng h\u1ec7 th\u1ed1ng x\u1ebfp h\u1ea1ng v\u00e0 b\u1ea3ng \u0111i\u1ec3m (<em>leaderboards<\/em>) b\u1eb1ng c\u00e1ch t\u1eadn d\u1ee5ng c\u1ea5u tr\u00fac d\u1eef li\u1ec7u sorted sets, cho ph\u00e9p s\u1eafp x\u1ebfp v\u00e0 truy v\u1ea5n theo th\u1ee9 h\u1ea1ng m\u1ed9t c\u00e1ch t\u1ed1i \u01b0u.\u00a0<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"cai-dat-va-ket-noi-redis-node-js\"><span class=\"ez-toc-section\" id=\"Cai_dat_va_ket_noi_Redis_Nodejs\"><\/span><strong>C\u00e0i \u0111\u1eb7t v\u00e0 k\u1ebft n\u1ed1i Redis Node.js<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p><strong>B\u01b0\u1edbc 1: C\u00e0i \u0111\u1eb7t Redis client trong Node.js<\/strong><\/p>\n\n\n\n<p>\u0110\u1ec3 l\u00e0m vi\u1ec7c v\u1edbi Redis trong Node.js, b\u1ea1n c\u1ea7n c\u00e0i th\u01b0 vi\u1ec7n ch\u00ednh th\u1ee9c c\u1ee7a Redis qua npm:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>npm install redis<\/code><\/pre>\n\n\n\n<p><strong>B\u01b0\u1edbc 2: K\u1ebft n\u1ed1i \u0111\u1ebfn Redis<\/strong><\/p>\n\n\n\n<p>T\u1ea1o file JavaScript (ho\u1eb7c TypeScript) v\u00e0 k\u1ebft n\u1ed1i Redis nh\u01b0 sau:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>import { createClient } from 'redis';\n\nconst redisClient = createClient();\n\nredisClient.on('error', (err) => console.error('Redis error:', err));\n\nawait redisClient.connect();<\/code><\/pre>\n\n\n\n<p>Trong \u0111\u00f3:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>createClient()<\/code> l\u00e0 h\u00e0m t\u1ea1o k\u1ebft n\u1ed1i \u0111\u1ebfn Redis m\u1eb7c \u0111\u1ecbnh \u1edf localhost:6379.<\/li>\n\n\n\n<li><code>on('error', ...)<\/code> \u0111\u1ec3 x\u1eed l\u00fd n\u1ebfu c\u00f3 l\u1ed7i k\u1ebft n\u1ed1i.<\/li>\n\n\n\n<li><code>connect()<\/code> l\u00e0 h\u00e0m b\u1ea5t \u0111\u1ed3ng b\u1ed9, d\u00f9ng <code>await<\/code> \u0111\u1ec3 \u0111\u1ee3i k\u1ebft n\u1ed1i ho\u00e0n t\u1ea5t.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"cac-thao-tac-du-lieu-trong-redis-nodejs\"><span class=\"ez-toc-section\" id=\"Cac_thao_tac_du_lieu_trong_Redis_Nodejs\"><\/span><strong>C\u00e1c thao t\u00e1c d\u1eef li\u1ec7u trong Redis Nodejs<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"ghi-du-lieu-set\"><strong>Ghi d\u1eef li\u1ec7u (SET)<\/strong><\/h3>\n\n\n\n<p>V\u00ed d\u1ee5 \u0111\u1ec3 l\u01b0u key &#8216;<code>name<\/code>&#8216; v\u1edbi gi\u00e1 tr\u1ecb &#8216;Alice&#8217; ta d\u00f9ng:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>await redisClient.set('name', 'Alice');\n\n\/\/ V\u1edbi Options\nawait redisClient.set('user:1001', JSON.stringify({ name: 'Alice', age: 25 }));<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"doc-du-lieu-get\"><strong>\u0110\u1ecdc d\u1eef li\u1ec7u (GET)<\/strong><\/h3>\n\n\n\n<p>V\u00ed d\u1ee5 \u0111\u1ec3 L\u1ea5y gi\u00e1 tr\u1ecb c\u1ee7a key &#8216;<code>name<\/code>&#8216; ta c\u00f3 \u0111o\u1ea1n code sau:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>const name = await redisClient.get('name');\nconsole.log(name); \/\/ K\u1ebft qu\u1ea3: Alice\n\n\/\/ X\u1eed l\u00fd JSON data\nconst userData = await redisClient.get('user:1001');\nconst user = userData ? JSON.parse(userData) : null;\nconsole.log(user); \/\/ { name: 'Alice', age: 25 }<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"xoa-du-lieu-del\"><strong>Xo\u00e1 d\u1eef li\u1ec7u (DEL)<\/strong><\/h3>\n\n\n\n<p>V\u00ed d\u1ee5 \u0111\u1ec3 xo\u00e1 key &#8216;<code>name<\/code>&#8216; kh\u1ecfi Redis ta d\u00f9ng:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>await redisClient.del('name');\n\n\/\/ X\u00f3a nhi\u1ec1u keys c\u00f9ng l\u00fac\nawait redisClient.del(&#91;'key1', 'key2', 'key3']);\n\n\/\/ Ki\u1ec3m tra key c\u00f3 t\u1ed3n t\u1ea1i kh\u00f4ng\nconst exists = await redisClient.exists('name');\nconsole.log(exists); \/\/ 0 (kh\u00f4ng t\u1ed3n t\u1ea1i) ho\u1eb7c 1 (t\u1ed3n t\u1ea1i)<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"ghi-du-lieu-co-thoi-gian-live-time-to-live\"><strong>Ghi d\u1eef li\u1ec7u c\u00f3 th\u1eddi gian live (Time To Live)<\/strong><\/h3>\n\n\n\n<p>Redis cho ph\u00e9p \u0111\u1eb7t th\u1eddi gian t\u1ef1 \u0111\u1ed9ng x\u00f3a d\u1eef li\u1ec7u, r\u1ea5t h\u1eefu \u00edch khi l\u01b0u cache ho\u1eb7c l\u01b0u c\u00e1c m\u00e3 x\u00e1c th\u1ef1c t\u1ea1m th\u1eddi (v\u00ed d\u1ee5: token \u0111\u0103ng nh\u1eadp, m\u00e3 OTP), gi\u00fap ta kh\u00f4ng c\u1ea7n t\u1ef1 x\u00f3a th\u1ee7 c\u00f4ng v\u00e0 ti\u1ebft ki\u1ec7m b\u1ed9 nh\u1edb c\u0169ng nh\u01b0 gi\u1ea3m nguy c\u01a1 r\u00f2 r\u1ec9 d\u1eef li\u1ec7u (<em>data leakage<\/em>).&nbsp;<\/p>\n\n\n\n<p>V\u00ed d\u1ee5 \u0111\u1ec3 l\u01b0u m\u00e3 OTP &#8216;123456&#8217;, t\u1ef1 \u0111\u1ed9ng x\u00f3a sau 300 gi\u00e2y (5 ph\u00fat) ta d\u00f9ng:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/ C\u00e1ch 1: S\u1eed d\u1ee5ng EX (seconds)\nawait redisClient.set('otp', '123456', { EX: 300 }); \/\/ 5 ph\u00fat\n\n\/\/ C\u00e1ch 2: S\u1eed d\u1ee5ng PX (milliseconds)\nawait redisClient.set('temp_token', 'abc123', { PX: 30000 }); \/\/ 30 gi\u00e2y\n\n\/\/ C\u00e1ch 3: Set TTL sau khi t\u1ea1o key\nawait redisClient.set('session_id', 'xyz789');\nawait redisClient.expire('session_id', 1800); \/\/ 30 ph\u00fat\n\n\/\/ Ki\u1ec3m tra th\u1eddi gian c\u00f2n l\u1ea1i\nconst ttl = await redisClient.ttl('otp');\nconsole.log(`OTP expires in ${ttl} seconds`);<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"cac-vi-du-su-dung-redis-thuc-te-trong-nodejs\"><span class=\"ez-toc-section\" id=\"Cac_vi_du_su_dung_Redis_thuc_te_trong_Nodejs\"><\/span><strong>C\u00e1c v\u00ed d\u1ee5 s\u1eed d\u1ee5ng Redis th\u1ef1c t\u1ebf trong Nodejs<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>C\u00f9ng kh\u00e1m ph\u00e1 nh\u1eefng \u1ee9ng d\u1ee5ng th\u1ef1c t\u1ebf th\u01b0\u1eddng g\u1eb7p nh\u1ea5t khi l\u00e0m vi\u1ec7c v\u1edbi Redis trong m\u00f4i tr\u01b0\u1eddng Node.js:<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"luu-va-truy-xuat-du-lieu-sieu-nhanh\"><strong>L\u01b0u v\u00e0 truy xu\u1ea5t d\u1eef li\u1ec7u si\u00eau nhanh<\/strong><\/h3>\n\n\n\n<p>Redis l\u01b0u d\u1eef li\u1ec7u tr\u1ef1c ti\u1ebfp trong RAM, n\u00ean m\u1ecdi thao t\u00e1c nh\u01b0 <code>GET<\/code> v\u00e0 <code>SET<\/code> \u0111\u1ec1u di\u1ec5n ra g\u1ea7n nh\u01b0 t\u1ee9c th\u00ec. Trong Node.js, ta c\u00f3 th\u1ec3 l\u01b0u m\u1ed9t gi\u00e1 tr\u1ecb nh\u01b0 sau:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>await client.set('username', 'Alice');   \/\/ l\u01b0u t\u00ean ng\u01b0\u1eddi d\u00f9ng\nconst name = await client.get('username');  \/\/ l\u1ea5y l\u1ea1i t\u00ean\nconsole.log(name); \/\/ In ra: Alice<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"ho-tro-nhieu-loai-du-lieu-khac-nhau\"><strong>H\u1ed7 tr\u1ee3 nhi\u1ec1u lo\u1ea1i d\u1eef li\u1ec7u kh\u00e1c nhau<\/strong><\/h3>\n\n\n\n<p>Redis kh\u00f4ng ch\u1ec9 l\u01b0u chu\u1ed7i (string), m\u00e0 c\u00f2n h\u1ed7 tr\u1ee3:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>List<\/strong> (danh s\u00e1ch): \u0111\u1ec3 l\u00e0m h\u00e0ng \u0111\u1ee3i<\/li>\n\n\n\n<li><strong>Hash<\/strong>: gi\u1ed1ng nh\u01b0 object trong JavaScript<\/li>\n\n\n\n<li><strong>Set \/ Sorted Set<\/strong>: l\u01b0u danh s\u00e1ch kh\u00f4ng tr\u00f9ng ho\u1eb7c c\u00f3 th\u1ee9 t\u1ef1\u00a0<\/li>\n\n\n\n<li><strong>Stream<\/strong>: \u0111\u1ec3 x\u1eed l\u00fd d\u1eef li\u1ec7u th\u1eddi gian th\u1ef1c<\/li>\n<\/ul>\n\n\n\n<p>V\u00ed d\u1ee5 \u0111\u1ec3 l\u01b0u danh s\u00e1ch ng\u01b0\u1eddi d\u00f9ng \u0111ang online nh\u01b0 sau:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>await redisClient.rPush(\"onlineUsers\", \"Alice\");\nawait redisClient.rPush(\"onlineUsers\", \"Bob\");<\/code><\/pre>\n\n\n\n<p>Trong \u0111\u00f3:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>rPush<\/code> ngh\u0129a l\u00e0 th\u00eam m\u1ed9t ph\u1ea7n t\u1eed v\u00e0o cu\u1ed1i danh s\u00e1ch.<\/li>\n\n\n\n<li><code>\"onlineUsers\"<\/code> l\u00e0 danh s\u00e1ch ch\u1ee9a c\u00e1c t\u00ean ng\u01b0\u1eddi \u0111ang ho\u1ea1t \u0111\u1ed9ng.<\/li>\n<\/ul>\n\n\n\n<p>V\u00ed d\u1ee5: d\u00f9ng Hash d\u00f9ng \u0111\u1ec3 l\u01b0u \u0111\u1ed1i t\u01b0\u1ee3ng nh\u01b0 object trong JS nh\u01b0 sau:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>await redisClient.hSet('user:1', { name: 'Bob', age: 30 });\nconst user = await redisClient.hGetAll('user:1');<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"pub-sub-gui-va-nhan-thong-diep-giua-cac-phan-trong-he-thong\"><strong>Pub\/Sub &#8211; G\u1eedi v\u00e0 nh\u1eadn th\u00f4ng \u0111i\u1ec7p gi\u1eefa c\u00e1c ph\u1ea7n trong h\u1ec7 th\u1ed1ng<\/strong><\/h3>\n\n\n\n<p>Redis h\u1ed7 tr\u1ee3 c\u01a1 ch\u1ebf Publish\/Subscribe, cho ph\u00e9p c\u00e1c ph\u1ea7n kh\u00e1c nhau c\u1ee7a \u1ee9ng d\u1ee5ng Node.js giao ti\u1ebfp v\u1edbi nhau theo ki\u1ec3u s\u1ef1 ki\u1ec7n. V\u00ed d\u1ee5:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/ File: subscriber.jsimport { createClient } from 'redis';\nconst subscriber = createClient();await subscriber.connect();\n\n\/\/ \u0110\u0103ng k\u00fd nh\u1eadn tin t\u1eeb channelawait subscriber.subscribe(\"chat\", (message, channel) => {\u00a0\u00a0console.log(`Received from ${channel}: ${message}`);\u00a0\u00a0\/\/ X\u1eed l\u00fd tin nh\u1eafn \u1edf \u0111\u00e2y});\nconsole.log('Subscriber listening on \"chat\" channel');\n\n\/\/ File: publisher.jsimport { createClient } from 'redis';\nconst publisher = createClient();await publisher.connect();\n\n\/\/ G\u1eedi tin nh\u1eafnconst subscriberCount = await publisher.publish(\"chat\", \"Hello from User A\");console.log(`Message sent to ${subscriberCount} subscribers`);\n\n\/\/ C\u00f3 th\u1ec3 g\u1eedi structured dataawait publisher.publish(\"chat\", JSON.stringify({\u00a0\u00a0user: 'Alice',\u00a0\u00a0message: 'Hello everyone!',\u00a0\u00a0timestamp: Date.now()}));<\/code><\/pre>\n\n\n\n<p>Trong \u0111\u00f3:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>M\u1ed9t ph\u1ea7n c\u1ee7a \u1ee9ng d\u1ee5ng \u0111\u0103ng k\u00fd nh\u1eadn tin nh\u1eafn t\u1eeb k\u00eanh &#8220;chat&#8221;.<\/li>\n\n\n\n<li>M\u1ed9t ph\u1ea7n kh\u00e1c g\u1eedi tin nh\u1eafn &#8220;Hello from User A&#8221; t\u1edbi k\u00eanh \u0111\u00f3.<\/li>\n\n\n\n<li>Ai \u0111\u0103ng k\u00fd &#8220;chat&#8221; s\u1ebd nh\u1eadn \u0111\u01b0\u1ee3c tin nh\u1eafn ngay l\u1eadp t\u1ee9c.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"ho-tro-luu-tam-cache-de-tang-toc-ung-dung\"><strong>H\u1ed7 tr\u1ee3 l\u01b0u t\u1ea1m (cache) \u0111\u1ec3 t\u0103ng t\u1ed1c \u1ee9ng d\u1ee5ng<\/strong><\/h3>\n\n\n\n<p>Redis \u0111\u01b0\u1ee3c d\u00f9ng nhi\u1ec1u nh\u1ea5t cho vi\u1ec7c l\u01b0u cache &#8211; t\u1ee9c l\u00e0 l\u01b0u t\u1ea1m th\u1eddi nh\u1eefng d\u1eef li\u1ec7u \u0111\u01b0\u1ee3c d\u00f9ng nhi\u1ec1u \u0111\u1ec3 kh\u00f4ng ph\u1ea3i truy v\u1ea5n l\u1ea1i t\u1eeb n\u01a1i ch\u1eadm h\u01a1n (nh\u01b0 c\u01a1 s\u1edf d\u1eef li\u1ec7u ch\u00ednh).&nbsp;<\/p>\n\n\n\n<p>Gi\u1ea3 s\u1eed b\u1ea1n \u0111ang x\u00e2y d\u1ef1ng m\u1ed9t website hi\u1ec3n th\u1ecb th\u1eddi ti\u1ebft theo th\u00e0nh ph\u1ed1. D\u1eef li\u1ec7u \u0111\u01b0\u1ee3c l\u1ea5y t\u1eeb m\u1ed9t API b\u00ean ngo\u00e0i, v\u00ed d\u1ee5 api.weather.com. Tuy nhi\u00ean, vi\u1ec7c g\u1ecdi API m\u1ed7i l\u1ea7n ng\u01b0\u1eddi d\u00f9ng truy c\u1eadp s\u1ebd t\u1ed1n th\u1eddi gian ch\u1edd ph\u1ea3n h\u1ed3i (ch\u1eadm) v\u00e0 d\u1ec5 b\u1ecb gi\u1edbi h\u1ea1n l\u01b0\u1ee3t g\u1ecdi (<em>rate limit<\/em>).<\/p>\n\n\n\n<p><strong>Gi\u1ea3i ph\u00e1p<\/strong>: Ta c\u00f3 th\u1ec3 l\u01b0u t\u1ea1m d\u1eef li\u1ec7u tr\u1ea3 v\u1ec1 t\u1eeb API v\u00e0o Redis, \u0111\u1ec3 c\u00e1c l\u1ea7n sau truy c\u1eadp s\u1ebd l\u1ea5y d\u1eef li\u1ec7u ngay t\u1eeb cache, gi\u00fap nhanh h\u01a1n v\u00e0 kh\u00f4ng c\u1ea7n g\u1ecdi l\u1ea1i API.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>async function getWeather(city) {\n  const cached = await redisClient.get(city);\n  if (cached) {\n    return JSON.parse(cached); \/\/ D\u1eef li\u1ec7u c\u00f3 s\u1eb5n, tr\u1ea3 v\u1ec1 t\u1eeb Redis\n  }\n\n  const res = await fetch(`https:\/\/api.weather.com\/${city}`);\n  const data = await res.json();\n\n  await redisClient.set(city, JSON.stringify(data), { EX: 3600 }); \/\/ L\u01b0u cache 1 gi\u1edd\n  return data;\n}<\/code><\/pre>\n\n\n\n<p>Trong \u0111\u00f3:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>redisClient.get(city)<\/code>: ki\u1ec3m tra xem Redis c\u00f3 l\u01b0u d\u1eef li\u1ec7u th\u1eddi ti\u1ebft cho th\u00e0nh ph\u1ed1 n\u00e0y ch\u01b0a.<\/li>\n\n\n\n<li><code>if (cached)<\/code>: n\u1ebfu c\u00f3 r\u1ed3i, tr\u1ea3 v\u1ec1 lu\u00f4n (kh\u00f4ng c\u1ea7n g\u1ecdi API).<\/li>\n\n\n\n<li><code>fetch(...)<\/code>: g\u1ecdi API n\u1ebfu ch\u01b0a c\u00f3 cache.<\/li>\n\n\n\n<li><code>redisClient.set(..., { EX: 3600 })<\/code>: l\u01b0u d\u1eef li\u1ec7u m\u1edbi v\u00e0o Redis, h\u1ebft h\u1ea1n sau 1 ti\u1ebfng.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"quan-ly-session-dang-nhap-bang-redis\"><strong>Qu\u1ea3n l\u00fd session \u0111\u0103ng nh\u1eadp b\u1eb1ng Redis<\/strong><\/h3>\n\n\n\n<p>Trong \u1ee9ng d\u1ee5ng web d\u00f9ng Node.js v\u00e0 Express, khi ng\u01b0\u1eddi d\u00f9ng \u0111\u0103ng nh\u1eadp, ta c\u1ea7n l\u01b0u th\u00f4ng tin phi\u00ean \u0111\u0103ng nh\u1eadp (<em>session<\/em>). N\u1ebfu ch\u1ec9 l\u01b0u tr\u00ean server, khi server kh\u1edfi \u0111\u1ed9ng l\u1ea1i ho\u1eb7c khi d\u00f9ng nhi\u1ec1u server (<em>load balancing<\/em>), session s\u1ebd b\u1ecb m\u1ea5t.<\/p>\n\n\n\n<p><strong>Gi\u1ea3i ph\u00e1p:<\/strong> L\u01b0u session v\u00e0o Redis &#8211; m\u1ed9t n\u01a1i l\u01b0u tr\u1eef trung gian, nhanh v\u00e0 \u1ed5n \u0111\u1ecbnh, d\u00f9ng \u0111\u01b0\u1ee3c k\u1ec3 c\u1ea3 khi c\u00f3 nhi\u1ec1u server.<\/p>\n\n\n\n<p>Thay v\u00ec l\u01b0u session \u1edf b\u1ed9 nh\u1edb c\u1ee5c b\u1ed9 c\u1ee7a t\u1eebng server (d\u1ec5 m\u1ea5t khi server kh\u1edfi \u0111\u1ed9ng l\u1ea1i ho\u1eb7c kh\u00f4ng chia s\u1ebb \u0111\u01b0\u1ee3c gi\u1eefa c\u00e1c node), vi\u1ec7c d\u00f9ng Redis gi\u00fap duy tr\u00ec tr\u1ea1ng th\u00e1i ng\u01b0\u1eddi d\u00f9ng m\u1ed9t c\u00e1ch nh\u1ea5t qu\u00e1n tr\u00ean to\u00e0n h\u1ec7 th\u1ed1ng.<\/p>\n\n\n\n<p>Redis session store kh\u00f4ng ch\u1ec9 gi\u00fap h\u1ec7 th\u1ed1ng m\u1edf r\u1ed9ng theo chi\u1ec1u ngang (<em>scale horizontally<\/em>) m\u00e0 c\u00f2n \u0111\u1ea3m b\u1ea3o t\u00ednh nh\u1ea5t qu\u00e1n c\u1ee7a phi\u00ean \u0111\u0103ng nh\u1eadp (<em>session consistency<\/em>), \u0111\u1eb7c bi\u1ec7t quan tr\u1ecdng trong c\u00e1c h\u1ec7 th\u1ed1ng ph\u00e2n t\u00e1n ho\u1eb7c s\u1eed d\u1ee5ng ki\u1ebfn tr\u00fac microservices.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>import session from 'express-session';\nimport RedisStore from 'connect-redis';\n\napp.use(\n  session({\n    store: new RedisStore({ client: redisClient }),\n    secret: 'my-secret',\n    resave: false,\n    saveUninitialized: false,\n  })\n);<\/code><\/pre>\n\n\n\n<p>Trong \u0111\u00f3:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>express-session<\/code>: d\u00f9ng \u0111\u1ec3 qu\u1ea3n l\u00fd phi\u00ean \u0111\u0103ng nh\u1eadp.<\/li>\n\n\n\n<li><code>connect-redis<\/code>: gi\u00fap l\u01b0u session v\u00e0o Redis.<\/li>\n\n\n\n<li><code>store: new RedisStore(...)<\/code>: thay v\u00ec l\u01b0u session trong RAM c\u1ee7a server, ta l\u01b0u v\u00e0o Redis.<\/li>\n\n\n\n<li><code>secret<\/code>: chu\u1ed7i m\u00e3 h\u00f3a session.<\/li>\n\n\n\n<li><code>resave<\/code> v\u00e0 <code>saveUninitialized<\/code>: c\u00e1c tu\u1ef3 ch\u1ecdn k\u1ef9 thu\u1eadt \u0111\u1ec3 session ho\u1ea1t \u0111\u1ed9ng \u1ed5n \u0111\u1ecbnh h\u01a1n.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"mot-so-luu-y-khi-su-dung-redis-trong-node-js\"><span class=\"ez-toc-section\" id=\"Mot_so_luu_y_khi_su_dung_Redis_trong_Nodejs\"><\/span><strong>M\u1ed9t s\u1ed1 l\u01b0u \u00fd khi s\u1eed d\u1ee5ng Redis trong Node.js<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Lu\u00f4n x\u1eed l\u00fd l\u1ed7i k\u1ebft n\u1ed1i<\/strong>: Redis l\u00e0 m\u1ed9t d\u1ecbch v\u1ee5 b\u00ean ngo\u00e0i, c\u00f3 th\u1ec3 b\u1ecb ng\u1eaft k\u1ebft n\u1ed1i t\u1ea1m th\u1eddi ho\u1eb7c g\u1eb7p s\u1ef1 c\u1ed1. Do \u0111\u00f3, b\u1ea1n n\u00ean x\u1eed l\u00fd s\u1ef1 ki\u1ec7n l\u1ed7i \u0111\u1ec3 tr\u00e1nh \u1ee9ng d\u1ee5ng b\u1ecb treo.<\/li>\n\n\n\n<li><strong>Tr\u00e1nh d\u00f9ng <\/strong><code>KEYS *<\/code><strong> tr\u00ean m\u00f4i tr\u01b0\u1eddng production:<\/strong> L\u1ec7nh <code>KEYS *<\/code> tr\u1ea3 v\u1ec1 to\u00e0n b\u1ed9 key trong Redis, c\u00f3 th\u1ec3 g\u00e2y qu\u00e1 t\u1ea3i khi d\u1eef li\u1ec7u l\u1edbn. Thay v\u00e0o \u0111\u00f3, h\u00e3y d\u00f9ng <code>SCAN<\/code> \u0111\u1ec3 duy\u1ec7t d\u1eef li\u1ec7u m\u1ed9t c\u00e1ch an to\u00e0n h\u01a1n.<\/li>\n\n\n\n<li><strong>Lu\u00f4n \u0111\u1eb7t th\u1eddi gian h\u1ebft h\u1ea1n (TTL) cho cache<\/strong>: N\u1ebfu b\u1ea1n d\u00f9ng Redis \u0111\u1ec3 cache d\u1eef li\u1ec7u API, session ho\u1eb7c OTP, h\u00e3y \u0111\u1eb7t th\u1eddi gian t\u1ef1 x\u00f3a (EX) \u0111\u1ec3 tr\u00e1nh \u0111\u1ea7y b\u1ed9 nh\u1edb.<\/li>\n\n\n\n<li><strong>Kh\u00f4ng l\u01b0u d\u1eef li\u1ec7u nh\u1ea1y c\u1ea3m d\u01b0\u1edbi d\u1ea1ng plain text<\/strong>: Redis l\u01b0u d\u1eef li\u1ec7u trong RAM, kh\u00f4ng m\u00e3 h\u00f3a m\u1eb7c \u0111\u1ecbnh. N\u1ebfu b\u1ea1n c\u1ea7n l\u01b0u th\u00f4ng tin nh\u1ea1y c\u1ea3m (nh\u01b0 token ho\u1eb7c email), n\u00ean m\u00e3 h\u00f3a (encrypt\/hash) d\u1eef li\u1ec7u tr\u01b0\u1edbc khi l\u01b0u.<\/li>\n\n\n\n<li><strong>\u0110\u00f3ng k\u1ebft n\u1ed1i Redis khi \u1ee9ng d\u1ee5ng t\u1eaft<\/strong>: \u0110\u1ec3 tr\u00e1nh r\u00f2 r\u1ec9 t\u00e0i nguy\u00ean, khi \u1ee9ng d\u1ee5ng Node.js t\u1eaft ta n\u00ean \u0111\u00f3ng k\u1ebft n\u1ed1i Redis.<\/li>\n\n\n\n<li><strong>T\u00e1i s\u1eed d\u1ee5ng k\u1ebft n\u1ed1i, kh\u00f4ng t\u1ea1o l\u1ea1i m\u1ed7i l\u1ea7n<\/strong>: Redis client n\u00ean \u0111\u01b0\u1ee3c kh\u1edfi t\u1ea1o m\u1ed9t l\u1ea7n duy nh\u1ea5t v\u00e0 t\u00e1i s\u1eed d\u1ee5ng trong to\u00e0n b\u1ed9 \u1ee9ng d\u1ee5ng, thay v\u00ec t\u1ea1o m\u1edbi trong m\u1ed7i request. \u0110i\u1ec1u n\u00e0y s\u1ebd gi\u00fap ti\u1ebft ki\u1ec7m t\u00e0i nguy\u00ean v\u00e0 \u1ed5n \u0111\u1ecbnh k\u1ebft n\u1ed1i.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"cau-hoi-thuong-gap-ve-redis-nodejs\"><span class=\"ez-toc-section\" id=\"Cau_hoi_thuong_gap_ve_Redis_Nodejs\"><\/span><strong>C\u00e2u h\u1ecfi th\u01b0\u1eddng g\u1eb7p v\u1ec1 Redis Nodejs<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"co-the-su-dung-redis-lam-session-store-trong-node-js-khong\"><strong>C\u00f3 th\u1ec3 s\u1eed d\u1ee5ng Redis l\u00e0m session store trong Node.js kh\u00f4ng?<\/strong><\/h3>\n\n\n\n<p><strong>C\u00f3.<\/strong> Redis l\u00e0 m\u1ed9t trong nh\u1eefng l\u1ef1a ch\u1ecdn ph\u1ed5 bi\u1ebfn nh\u1ea5t \u0111\u1ec3 l\u01b0u tr\u1eef session trong c\u00e1c \u1ee9ng d\u1ee5ng web Node.js. Nh\u1edd t\u1ed1c \u0111\u1ed9 cao v\u00e0 kh\u1ea3 n\u0103ng l\u01b0u tr\u1eef trong b\u1ed9 nh\u1edb, Redis gi\u00fap qu\u1ea3n l\u00fd phi\u00ean \u0111\u0103ng nh\u1eadp c\u1ee7a ng\u01b0\u1eddi d\u00f9ng m\u1ed9t c\u00e1ch hi\u1ec7u qu\u1ea3, \u0111\u1eb7c bi\u1ec7t khi b\u1ea1n ch\u1ea1y nhi\u1ec1u server (<em>scale horizontally<\/em>).<\/p>\n\n\n\n<p>C\u00f3 th\u1ec3 s\u1eed d\u1ee5ng th\u01b0 vi\u1ec7n nh\u01b0:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>express-session<\/code>: \u0111\u1ec3 qu\u1ea3n l\u00fd session<\/li>\n\n\n\n<li><code>connect-redis<\/code>: \u0111\u1ec3 k\u1ebft n\u1ed1i Redis l\u00e0m n\u01a1i l\u01b0u session<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"redis-npm-co-ho-tro-pub-sub-khong\"><strong>Redis NPM c\u00f3 h\u1ed7 tr\u1ee3 Pub\/Sub kh\u00f4ng?<\/strong><\/h3>\n\n\n\n<p>C\u00f3. G\u00f3i redis ch\u00ednh th\u1ee9c tr\u00ean NPM (hi\u1ec7n t\u1ea1i l\u00e0 <em>redis@4<\/em>) h\u1ed7 tr\u1ee3 \u0111\u1ea7y \u0111\u1ee7 c\u01a1 ch\u1ebf Publish\/Subscribe. B\u1ea1n c\u00f3 th\u1ec3 t\u1ea1o m\u1ed9t k\u1ebft n\u1ed1i ri\u00eang \u0111\u1ec3 subscribe c\u00e1c k\u00eanh v\u00e0 d\u00f9ng l\u1ec7nh publish \u0111\u1ec3 g\u1eedi tin nh\u1eafn gi\u1eefa c\u00e1c ph\u1ea7n c\u1ee7a \u1ee9ng d\u1ee5ng, r\u1ea5t ph\u00f9 h\u1ee3p v\u1edbi c\u00e1c t\u00ednh n\u0103ng nh\u01b0 chat, th\u00f4ng b\u00e1o real-time ho\u1eb7c giao ti\u1ebfp gi\u1eefa microservices.<\/p>\n\n\n\n<p>L\u01b0u \u00fd: Pub\/Sub c\u1ea7n k\u1ebft n\u1ed1i ri\u00eang bi\u1ec7t t\u1eeb phi\u00ean b\u1ea3n 4.x tr\u1edf l\u00ean.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"redis-npm-co-ho-tro-redis-cluster-khong\"><strong>Redis NPM c\u00f3 h\u1ed7 tr\u1ee3 Redis Cluster kh\u00f4ng?<\/strong><\/h3>\n\n\n\n<p>C\u00f3. Th\u01b0 vi\u1ec7n node-redis ch\u00ednh th\u1ee9c h\u1ed7 tr\u1ee3 k\u1ebft n\u1ed1i t\u1edbi Redis Cluster. Redis Cluster l\u00e0 m\u1ed9t ki\u1ebfn tr\u00fac ph\u00e2n t\u00e1n cho ph\u00e9p h\u1ec7 th\u1ed1ng m\u1edf r\u1ed9ng theo chi\u1ec1u ngang (<em>horizontal scaling<\/em>) v\u00e0 \u0111\u1ea3m b\u1ea3o t\u00ednh s\u1eb5n s\u00e0ng cao. Khi s\u1eed d\u1ee5ng, b\u1ea1n ch\u1ec9 c\u1ea7n cung c\u1ea5p danh s\u00e1ch c\u00e1c node trong cluster, Redis s\u1ebd t\u1ef1 x\u1eed l\u00fd \u0111\u1ecbnh tuy\u1ebfn v\u00e0 chuy\u1ec3n ti\u1ebfp key \u0111\u1ebfn node ph\u00f9 h\u1ee3p.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"tong-ket-redis-nodejs\"><span class=\"ez-toc-section\" id=\"Tong_ket_Redis_Nodejs\"><\/span><strong>T\u1ed5ng k\u1ebft Redis Nodejs<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>Redis l\u00e0 c\u00f4ng c\u1ee5 m\u1ea1nh m\u1ebd nh\u01b0ng kh\u00f4ng h\u1ec1 ph\u1ee9c t\u1ea1p khi d\u00f9ng v\u1edbi Node.js. T\u1eeb vi\u1ec7c l\u01b0u key-value \u0111\u01a1n gi\u1ea3n, \u0111\u1ebfn qu\u1ea3n l\u00fd session, cache hay Pub\/Sub ta ho\u00e0n to\u00e0n c\u00f3 th\u1ec3 th\u1ef1c hi\u1ec7n d\u1ec5 d\u00e0ng ch\u1ec9 v\u1edbi v\u00e0i d\u00f2ng code. ITviec hy v\u1ecdng b\u00e0i vi\u1ebft n\u00e0y \u0111\u00e3 cung c\u1ea5p cho b\u1ea1n nh\u1eefng ki\u1ebfn th\u1ee9c h\u1eefu \u00fd gi\u00fap b\u1ea1n hi\u1ec3u r\u00f5 h\u01a1n v\u1ec1 c\u00e1ch s\u1eed d\u1ee5ng Redis Node.js.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Khi k\u1ebft h\u1ee3p gi\u1eefa Redis Nodejs, ta kh\u00f4ng ch\u1ec9 t\u0103ng t\u1ed1c \u0111\u1ed9 ph\u1ea3n h\u1ed3i c\u1ee7a \u1ee9ng d\u1ee5ng m\u00e0 c\u00f2n gi\u1ea3m \u0111\u00e1ng k\u1ec3 \u00e1p l\u1ef1c l\u00ean API v\u00e0 c\u01a1 s\u1edf d\u1eef li\u1ec7u. S\u1ef1 k\u1ebft h\u1ee3p n\u00e0y l\u00e0 s\u1eed d\u1ee5ng Redis nh\u01b0 m\u1ed9t l\u1edbp cache trung gian: thay v\u00ec g\u1ecdi API nhi\u1ec1u l\u1ea7n, ta ch\u1ec9 c\u1ea7n g\u1ecdi [&hellip;]<\/p>\n","protected":false},"author":209,"featured_media":89040,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_gspb_post_css":"","footnotes":""},"categories":[109],"tags":[],"class_list":["post-89036","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-chuyen-mon-it"],"blocksy_meta":[],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v26.8 (Yoast SEO v27.7) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Redis Nodejs: C\u00e1ch s\u1eed d\u1ee5ng Redis trong Nodejs chi ti\u1ebft A-Z - ITviec Blog<\/title>\n<meta name=\"description\" content=\"T\u00ecm hi\u1ec3u Redis Nodejs l\u00e0 g\u00ec, c\u00e1ch s\u1eed d\u1ee5ng Redis trong Node.js t\u1eeb c\u00e0i \u0111\u1eb7t, thao t\u00e1c d\u1eef li\u1ec7u, \u0111\u1ebfn \u1ee9ng d\u1ee5ng th\u1ef1c t\u1ebf nh\u01b0 cache, session, Pub\/Sub.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/itviec.com\/blog\/huong-dan-trien-khai-redis-nodejs\/\" \/>\n<meta property=\"og:locale\" content=\"vi_VN\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Redis Nodejs: C\u00e1ch s\u1eed d\u1ee5ng Redis trong Nodejs chi ti\u1ebft A-Z\" \/>\n<meta property=\"og:description\" content=\"Khi k\u1ebft h\u1ee3p gi\u1eefa Redis Nodejs, ta kh\u00f4ng ch\u1ec9 t\u0103ng t\u1ed1c \u0111\u1ed9 ph\u1ea3n h\u1ed3i c\u1ee7a \u1ee9ng d\u1ee5ng m\u00e0 c\u00f2n gi\u1ea3m \u0111\u00e1ng k\u1ec3 \u00e1p l\u1ef1c l\u00ean API v\u00e0 c\u01a1 s\u1edf d\u1eef li\u1ec7u. S\u1ef1 k\u1ebft h\u1ee3p n\u00e0y l\u00e0 s\u1eed\" \/>\n<meta property=\"og:url\" content=\"https:\/\/itviec.com\/blog\/huong-dan-trien-khai-redis-nodejs\/\" \/>\n<meta property=\"og:site_name\" content=\"ITviec Blog\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/ITviec\" \/>\n<meta property=\"article:published_time\" content=\"2025-07-06T15:44:51+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-07-06T15:44:54+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/itviec.com\/blog\/wp-content\/uploads\/2025\/07\/redis-nodejs-scaled.png\" \/>\n\t<meta property=\"og:image:width\" content=\"2560\" \/>\n\t<meta property=\"og:image:height\" content=\"1347\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"M\u1ef9 Duy\u00ean\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@ITviec\" \/>\n<meta name=\"twitter:site\" content=\"@ITviec\" \/>\n<meta name=\"twitter:label1\" content=\"\u0110\u01b0\u1ee3c vi\u1ebft b\u1edfi\" \/>\n\t<meta name=\"twitter:data1\" content=\"M\u1ef9 Duy\u00ean\" \/>\n\t<meta name=\"twitter:label2\" content=\"\u01af\u1edbc t\u00ednh th\u1eddi gian \u0111\u1ecdc\" \/>\n\t<meta name=\"twitter:data2\" content=\"12 ph\u00fat\" \/>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Redis Nodejs: C\u00e1ch s\u1eed d\u1ee5ng Redis trong Nodejs chi ti\u1ebft A-Z - ITviec Blog","description":"T\u00ecm hi\u1ec3u Redis Nodejs l\u00e0 g\u00ec, c\u00e1ch s\u1eed d\u1ee5ng Redis trong Node.js t\u1eeb c\u00e0i \u0111\u1eb7t, thao t\u00e1c d\u1eef li\u1ec7u, \u0111\u1ebfn \u1ee9ng d\u1ee5ng th\u1ef1c t\u1ebf nh\u01b0 cache, session, Pub\/Sub.","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:\/\/itviec.com\/blog\/huong-dan-trien-khai-redis-nodejs\/","og_locale":"vi_VN","og_type":"article","og_title":"Redis Nodejs: C\u00e1ch s\u1eed d\u1ee5ng Redis trong Nodejs chi ti\u1ebft A-Z","og_description":"Khi k\u1ebft h\u1ee3p gi\u1eefa Redis Nodejs, ta kh\u00f4ng ch\u1ec9 t\u0103ng t\u1ed1c \u0111\u1ed9 ph\u1ea3n h\u1ed3i c\u1ee7a \u1ee9ng d\u1ee5ng m\u00e0 c\u00f2n gi\u1ea3m \u0111\u00e1ng k\u1ec3 \u00e1p l\u1ef1c l\u00ean API v\u00e0 c\u01a1 s\u1edf d\u1eef li\u1ec7u. S\u1ef1 k\u1ebft h\u1ee3p n\u00e0y l\u00e0 s\u1eed","og_url":"https:\/\/itviec.com\/blog\/huong-dan-trien-khai-redis-nodejs\/","og_site_name":"ITviec Blog","article_publisher":"https:\/\/www.facebook.com\/ITviec","article_published_time":"2025-07-06T15:44:51+00:00","article_modified_time":"2025-07-06T15:44:54+00:00","og_image":[{"width":2560,"height":1347,"url":"https:\/\/itviec.com\/blog\/wp-content\/uploads\/2025\/07\/redis-nodejs-scaled.png","type":"image\/png"}],"author":"M\u1ef9 Duy\u00ean","twitter_card":"summary_large_image","twitter_creator":"@ITviec","twitter_site":"@ITviec","twitter_misc":{"\u0110\u01b0\u1ee3c vi\u1ebft b\u1edfi":"M\u1ef9 Duy\u00ean","\u01af\u1edbc t\u00ednh th\u1eddi gian \u0111\u1ecdc":"12 ph\u00fat"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/itviec.com\/blog\/huong-dan-trien-khai-redis-nodejs\/#article","isPartOf":{"@id":"https:\/\/itviec.com\/blog\/huong-dan-trien-khai-redis-nodejs\/"},"author":{"name":"M\u1ef9 Duy\u00ean","@id":"https:\/\/itviec.com\/blog\/#\/schema\/person\/73733c0725c7e39e696a896bd1abe2d7"},"headline":"Redis Nodejs: C\u00e1ch s\u1eed d\u1ee5ng Redis trong Nodejs chi ti\u1ebft A-Z","datePublished":"2025-07-06T15:44:51+00:00","dateModified":"2025-07-06T15:44:54+00:00","mainEntityOfPage":{"@id":"https:\/\/itviec.com\/blog\/huong-dan-trien-khai-redis-nodejs\/"},"wordCount":3158,"publisher":{"@id":"https:\/\/itviec.com\/blog\/#organization"},"image":{"@id":"https:\/\/itviec.com\/blog\/huong-dan-trien-khai-redis-nodejs\/#primaryimage"},"thumbnailUrl":"https:\/\/itviec.com\/blog\/wp-content\/uploads\/2025\/07\/redis-nodejs-scaled.png","articleSection":["Chuy\u00ean m\u00f4n IT"],"inLanguage":"vi"},{"@type":"WebPage","@id":"https:\/\/itviec.com\/blog\/huong-dan-trien-khai-redis-nodejs\/","url":"https:\/\/itviec.com\/blog\/huong-dan-trien-khai-redis-nodejs\/","name":"Redis Nodejs: C\u00e1ch s\u1eed d\u1ee5ng Redis trong Nodejs chi ti\u1ebft A-Z - ITviec Blog","isPartOf":{"@id":"https:\/\/itviec.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/itviec.com\/blog\/huong-dan-trien-khai-redis-nodejs\/#primaryimage"},"image":{"@id":"https:\/\/itviec.com\/blog\/huong-dan-trien-khai-redis-nodejs\/#primaryimage"},"thumbnailUrl":"https:\/\/itviec.com\/blog\/wp-content\/uploads\/2025\/07\/redis-nodejs-scaled.png","datePublished":"2025-07-06T15:44:51+00:00","dateModified":"2025-07-06T15:44:54+00:00","description":"T\u00ecm hi\u1ec3u Redis Nodejs l\u00e0 g\u00ec, c\u00e1ch s\u1eed d\u1ee5ng Redis trong Node.js t\u1eeb c\u00e0i \u0111\u1eb7t, thao t\u00e1c d\u1eef li\u1ec7u, \u0111\u1ebfn \u1ee9ng d\u1ee5ng th\u1ef1c t\u1ebf nh\u01b0 cache, session, Pub\/Sub.","breadcrumb":{"@id":"https:\/\/itviec.com\/blog\/huong-dan-trien-khai-redis-nodejs\/#breadcrumb"},"inLanguage":"vi","potentialAction":[{"@type":"ReadAction","target":["https:\/\/itviec.com\/blog\/huong-dan-trien-khai-redis-nodejs\/"]}]},{"@type":"ImageObject","inLanguage":"vi","@id":"https:\/\/itviec.com\/blog\/huong-dan-trien-khai-redis-nodejs\/#primaryimage","url":"https:\/\/itviec.com\/blog\/wp-content\/uploads\/2025\/07\/redis-nodejs-scaled.png","contentUrl":"https:\/\/itviec.com\/blog\/wp-content\/uploads\/2025\/07\/redis-nodejs-scaled.png","width":800,"height":421,"caption":"redis nodejs - itviec blog"},{"@type":"BreadcrumbList","@id":"https:\/\/itviec.com\/blog\/huong-dan-trien-khai-redis-nodejs\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Chuy\u00ean m\u00f4n IT","item":"https:\/\/itviec.com\/blog\/chuyen-mon-it\/"},{"@type":"ListItem","position":2,"name":"Redis Nodejs: C\u00e1ch s\u1eed d\u1ee5ng Redis trong Nodejs chi ti\u1ebft A-Z"}]},{"@type":"WebSite","@id":"https:\/\/itviec.com\/blog\/#website","url":"https:\/\/itviec.com\/blog\/","name":"ITviec Blog","description":"IT Jobs &amp; People in Vietnam","publisher":{"@id":"https:\/\/itviec.com\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/itviec.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"vi"},{"@type":"Organization","@id":"https:\/\/itviec.com\/blog\/#organization","name":"ITviec","url":"https:\/\/itviec.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"vi","@id":"https:\/\/itviec.com\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/itviec.com\/blog\/wp-content\/uploads\/2018\/12\/itviec-black-square-facebook.png","contentUrl":"https:\/\/itviec.com\/blog\/wp-content\/uploads\/2018\/12\/itviec-black-square-facebook.png","width":1800,"height":1800,"caption":"ITviec"},"image":{"@id":"https:\/\/itviec.com\/blog\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/ITviec","https:\/\/x.com\/ITviec","https:\/\/www.linkedin.com\/company\/itviec","https:\/\/www.youtube.com\/channel\/UCYthAQ3bcGr57M_ag5gHDvQ"]},{"@type":"Person","@id":"https:\/\/itviec.com\/blog\/#\/schema\/person\/73733c0725c7e39e696a896bd1abe2d7","name":"M\u1ef9 Duy\u00ean","image":{"@type":"ImageObject","inLanguage":"vi","@id":"https:\/\/itviec.com\/blog\/wp-content\/uploads\/2024\/03\/Author_Duyen-Tran-120x120.jpg","url":"https:\/\/itviec.com\/blog\/wp-content\/uploads\/2024\/03\/Author_Duyen-Tran-120x120.jpg","contentUrl":"https:\/\/itviec.com\/blog\/wp-content\/uploads\/2024\/03\/Author_Duyen-Tran-120x120.jpg","caption":"M\u1ef9 Duy\u00ean"},"url":"https:\/\/itviec.com\/blog\/author\/my-duyen\/"}]}},"_links":{"self":[{"href":"https:\/\/itviec.com\/blog\/wp-json\/wp\/v2\/posts\/89036","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/itviec.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/itviec.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/itviec.com\/blog\/wp-json\/wp\/v2\/users\/209"}],"replies":[{"embeddable":true,"href":"https:\/\/itviec.com\/blog\/wp-json\/wp\/v2\/comments?post=89036"}],"version-history":[{"count":2,"href":"https:\/\/itviec.com\/blog\/wp-json\/wp\/v2\/posts\/89036\/revisions"}],"predecessor-version":[{"id":89041,"href":"https:\/\/itviec.com\/blog\/wp-json\/wp\/v2\/posts\/89036\/revisions\/89041"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/itviec.com\/blog\/wp-json\/wp\/v2\/media\/89040"}],"wp:attachment":[{"href":"https:\/\/itviec.com\/blog\/wp-json\/wp\/v2\/media?parent=89036"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/itviec.com\/blog\/wp-json\/wp\/v2\/categories?post=89036"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/itviec.com\/blog\/wp-json\/wp\/v2\/tags?post=89036"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}