ĐẠI HỌC QUỐC GIA THÀNH PHỐ HỒ CHÍ MINH
TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN
----------
BÁO CÁO THỰC TẬP DOANH NGHIỆP
CÔNG TY CỔ PHẦN ĐẦU TƯ
THẾ GIỚI DI ĐỘNG (MWG)
Sinh viên thực hiện
:
Phan Đức Cường
Mã số sinh viên
:
18520547
Lớp
:
SE501.M21
Thành phố Hồ Chí Minh, tháng 6 năm 2022
LỜI CẢM ƠN
Lời đầu tiên em xin gửi lời cảm ơn chân thành nhất đến quý Thầy, Cô trường
Đại học Công nghệ Thông tin – ĐHQG TPHCM. Nhờ những bài giảng, kinh nghiệm
quý báu mà thầy cô đã truyền đạt, em mới có đủ kiến thức để bước vào kỳ thực tập.
Tiếp theo, em xin gửi lời cảm ơn sâu sắc đến ban lãnh đạo Công ty Cổ phần Đầu
tư Thế Giới Di Động (MWG) đã tạo cơ hội cho em thực tập tại công ty để em có thể
học hỏi, trải nghiệm môi trường làm việc thực tế. Đặc biệt, em xin cảm ơn các anh chị
thuộc bộ phận Ứng Dụng Bán TGDĐ đã tận tình hướng dẫn, chỉ bảo để em có thêm
kinh nghiệm tham gia phát triển sản phẩm thực tế phục vụ người dùng.
Do thời gian thực tập có hạn cùng với kiến thức và kinh nghiệm còn ít ỏi của
sinh viên nên bài báo cáo này sẽ không tránh khỏi những thiếu sót. Vậy nên em rất
mong nhận được những ý kiến đóng góp quý báu của thầy, cô để em có thể hoàn thiện,
bổ sung thêm những kiến thức còn thiếu của mình.
Cuối cùng, em xin kính chúc quý Thầy, Cô sức khoẻ dồi dào để có thể thực hiện
sứ mạng trồng người, đào tạo ra nguồn nhân lực công nghệ thông tin chất lượng cao,
nhằm đáp ứng nhu cầu của thị trường lao động và phục vụ cộng đồng.
Em xin chân thành cảm ơn!
Thành phố Hồ Chí Minh, ngày 18 tháng 06 năm 2022
Sinh viên thực hiện
Phan Đức Cường
NHẬN XÉT CỦA KHOA
..........................................................................................................................................
..........................................................................................................................................
..........................................................................................................................................
..........................................................................................................................................
..........................................................................................................................................
..........................................................................................................................................
..........................................................................................................................................
..........................................................................................................................................
..........................................................................................................................................
..........................................................................................................................................
..........................................................................................................................................
..........................................................................................................................................
..........................................................................................................................................
..........................................................................................................................................
..........................................................................................................................................
..........................................................................................................................................
..........................................................................................................................................
..........................................................................................................................................
..........................................................................................................................................
..........................................................................................................................................
..........................................................................................................................................
..........................................................................................................................................
..........................................................................................................................................
..........................................................................................................................................
..........................................................................................................................................
..........................................................................................................................................
..........................................................................................................................................
..........................................................................................................................................
..........................................................................................................................................
MỤC LỤC
CHƯƠNG 1 – GIỚI THIỆU CÔNG TY THỰC TẬP ................................................... 1
1.1. Tổng quan về công ty .......................................................................................... 1
1.2. Lĩnh vực kinh doanh ............................................................................................ 1
1.3. Vị thế công ty ...................................................................................................... 2
1.4. Triển vọng công ty ............................................................................................... 2
CHƯƠNG 2 – KIẾN THỨC ĐƯỢC ĐÀO TẠO TRONG KỲ THỰC TẬP ................ 3
2.1. Tổng quan về Coding style .................................................................................. 3
2.1.1. Lợi ích của Coding style ............................................................................... 3
2.1.2. Coding style cho Java/C# ............................................................................. 3
2.1.3. Coding style cho JavaScript ......................................................................... 3
2.2. Tổng quan về React Native ................................................................................. 4
2.2.1. Giới thiệu ...................................................................................................... 4
2.2.2. Cách hoạt động ............................................................................................. 4
2.2.3. Ưu nhược điểm ............................................................................................. 5
2.2.4. Điểm khác biệt giữa React Native và ReactJS ............................................. 6
2.2.5. Công cụ phát triển React Native ................................................................... 6
2.3. Tổng quan về .NET Core ..................................................................................... 6
2.3.1. Giới thiệu ...................................................................................................... 6
2.3.2. Khả năng sử dụng ......................................................................................... 7
2.3.3. Thành phần ................................................................................................... 8
2.3.4. Phân biệt .NET Framework, .NET Core và Mono ....................................... 8
2.3.5. Trường hợp sử dụng ..................................................................................... 9
2.4. Tổng quan về Redis Cache .................................................................................. 9
2.4.1. Đặt vấn đề ..................................................................................................... 9
2.4.2. Giới thiệu Redis .......................................................................................... 10
2.4.3. So sánh Redis và Memcached .................................................................... 11
2.4.4. Lợi ích ......................................................................................................... 12
2.3.5. Một số ứng dụng ......................................................................................... 13
2.3.6. Trường hợp sử dụng ................................................................................... 14
CHƯƠNG 3 – TÓM TẮT QUÁ TRÌNH THỰC TẬP ................................................ 15
3.1. Công việc mỗi tuần ............................................................................................ 15
3.1.1. Lịch thực tập ............................................................................................... 15
3.1.2. Bảng chi tiết công việc mỗi tuần ................................................................ 15
3.2. Các công việc đã thực hiện ................................................................................ 17
3.2.1. Quá trình giao công việc............................................................................. 17
3.2.2. Nhiệm vụ được giao ................................................................................... 18
CHƯƠNG 4 – ĐÁNH GIÁ VÀ NHẬN XÉT .............................................................. 22
4.1. Kết quả đạt được ................................................................................................ 22
4.2. Hạn chế .............................................................................................................. 22
4.3. Định hướng trong tương lai ............................................................................... 22
TÀI LIỆU THAM KHẢO ............................................................................................ 23
DANH MỤC HÌNH ẢNH
Hình 1.1 - Logo Công ty Cổ phần Thế Giới Di Động .................................................... 1
Hình 2.1 - React Native .................................................................................................. 4
Hình 2.3 - Thành phần trong .NET ................................................................................. 8
Hình 2.4 - Kiến trúc Redis Cache ................................................................................. 10
Hình 2.5 - So sánh tốc độ Redis và Memcache ............................................................ 11
Hình 3.1 - Giao diện các loại chương trình khuyến mãi trên POS ............................... 19
Hình 3.2 - Biên nhận thanh toán kiêm phiếu giao hàng ............................................... 20
CHƯƠNG 1 – GIỚI THIỆU CÔNG TY THỰC TẬP
1.1. Tổng quan về công ty
Công ty Cổ phần Đầu tư Thế Giới Di Động (MWG) được thành lập từ tháng
03/2004, với tiền thân là Công ty TNHH Thế Giới Di Động. Công ty quản lý vận hành
các chuỗi cửa hàng bán lẻ Thế Giới Di Động, Điện Máy Xanh, Bách Hoá Xanh, nhà
thuốc An Khang với mạng lưới 5.306 cửa hàng trên toàn quốc. Chuỗi của hàng Thế
Giới Di Động được thành lập từ 2004 là chuỗi bán lẻ thiết bị di động có thị phần số 1
Việt Nam với hơn 970 cửa hàng. Điện Máy Xanh ra đời cuối 2010, là chuỗi bán lẻ các
sản phẩm điện tử tiêu dùng (điện tử, điện lạnh và gia dụng) có thị phần số 1 Việt Nam
với hơn 1.992 cửa hàng. Bách Hóa Xanh hoàn tất giai đoạn thử nghiệm vào cuối năm
2016, là chuỗi cửa hàng chuyên bán lẻ thực phẩm tươi sống (thịt cá, rau củ, trái cây…)
và nhu yếu phẩm với hơn 2.106 cửa hàng. MWG niêm yết và giao dịch trên Sở Giao
dịch Chứng khoán Thành phố Hồ Chí Minh (HOSE) từ tháng 07/2014.
Hình 1.1 - Logo Công ty Cổ phần Thế Giới Di Động
1.2. Lĩnh vực kinh doanh
Kinh doanh thiết bị và linh kiện điện tử viễn thông;
Kinh doanh thiết bị điện máy;
Kinh doanh máy vi tính, thiếu bị ngoại vi và phần mềm;
Kinh doanh bán lẻ thực phẩm, hàng tiêu dùng;
Sản xuất linh kiện điện tử;
Sản xuất thiết bị truyền thông.
1
1.3. Vị thế công ty
MWG sở hữu, vận hành hệ thống bán lẻ với quy mô 5.306 cửa hàng
(2021). Trong đó, chuỗi Thế giới Di động có 970 siêu thị trên toàn
quốc; chuỗi Điện máy xanh có 1.992 siêu thị trên toàn quốc, trong đó có 800 cửa
hàng mô hình supermini; chuỗi Bách Hóa Xanh có 2.106 cửa hàng tại Tp Hồ Chí
Minh và 24 tỉnh thành Nam Bộ, Duyên hải Nam Trung Bộ; chuỗi nhà thuốc An
Khang có 178 nhà thuốc tại 25 tỉnh thành khu vực phía Nam và Đồng bằng sông
Cửu Long; chuỗi Bluetronics có 18 của hàng tại Campuchia.
Năm 2021, MWG giữ vững vị thế nhà bán lẻ số 1 Việt Nam, là công ty có doanh
số lớn nhất trong tổng giá trị thị trường bán lẻ hàng hóa trực tuyến tại Việt Nam.
Là công ty Việt Nam duy nhất góp mặt trong Top 100 nhà bán lẻ hàng đầu Châu
Á – Thái Bình Dương (Top 100 Retailers in Asia – Pacific).
Thế Giới Di Động và Điện Máy Xanh hiện là 2 đơn vị hiện đang giữ vị thế số 1
về bán lẻ thiết bị công nghệ và điện tử tiêu dùng tại Việt Nam;
MWG tiếp tục góp mặt trong Top 10 Doanh nghiệp lớn nhất Việt Nam theo bảng
xếp hạng VNR500.
1.4. Triển vọng công ty
Hơn 98,5 triệu dân với cơ cấu dân số trẻ cùng với tỷ lệ dân số thành thị hơn
37,1% và tiếp tục tăng trưởng là động lực gia tăng gia trị thị trường bán lẻ ở Việt
Nam.
40% thị phần điện máy tại Việt Nam vẫn đang thuộc về các cửa hàng nhỏ lẻ, do
đó đây là cơ hội cho MWG tiếp tục gia tăng thị phần trong các năm tới bằng cách
nhận rộng mô hình Điện Máy Xanh Supermini.
Thị trường bán lẻ truyền thống vẫn chiếm khoảng 88,6% tổng giá trị bán lẻ thực
phẩm và FMCGs tại Việt Nam và là cơ hội cho các doanh nghiệp mô hình bán
lẻ hiện đại sớm gia nhập thị trường như Bách Hóa Xanh tiếp tục gia tăng thị phần
trong thời gian tới.
Tỷ lệ sử dụng Internet và các thiết bị di động tại Việt Nam đã ở mức cao, cùng
với sự phát triển mạnh mẽ của các công cụ thanh toán online là cơ sở để MWG
tiếp tục phát triển thị trường bán lẻ online nhờ tận dụng mô hình đa kênh.
2
CHƯƠNG 2 – KIẾN THỨC ĐƯỢC ĐÀO TẠO TRONG KỲ
THỰC TẬP
2.1. Tổng quan về Coding style
2.1.1. Lợi ích của Coding style
‒ Giúp các lập trình viên ít mắc lỗi hơn khi cùng phát triển trong một môi trường.
‒ Code đẹp và theo chuẩn chung cho tất cả mọi người nên dễ dàng hiểu được ý tưởng
của nhau.
‒ Người mới tiếp cận sẽ dễ hiểu code hơn, dễ đọc code hơn.
‒ Bảo trì code dễ dàng hơn sau thời gian dài quay lại.
2.1.2. Coding style cho Java/C#
‒ Dùng camelCase để đặt tên cho các biến cục bộ, các field và thuộc tính internal,
protected, private kèm kiểu dữ liệu ở đầu tên (ví dụ: private int intSaleOrderID,
protected string strErrorMessage).
‒ Dùng PascalCase để đặt tên cho các class, method, enumeration, public field, public
properties, namespace (ví dụ: public int SaleOrderID, public string ErrorMessage).
‒ Các hằng số cần được đặt tên viết hoa toàn bộ (Ví dụ: const MAX_DAYS = 100).
Các giá trị gắn cứng trong code đều phải được định nghĩa ở dạng hằng số và nếu có
nhiều giá trị và các giá trị có ý nghĩa nào đó thì cần định nghĩa thành enum để quản
lý ý nghĩa của các giá trị.
2.1.3. Coding style cho JavaScript
‒ Sử dụng camelCase cho tên biến và tên hàm. Đặt tên ngắn gọn dễ hiễu, sử dụng
động từ để bắt đầu tên 1 hàm. Thêm các prefix get, set giúp người đọc biết hàm nào
là return, hàm nào là change.
‒ Sử dụng PascalCase cho tên class và dùng danh từ để đặt tên class.
‒ Sử dụng khoảng trắng để code thoáng hơn. Luôn có 1 khoảng trắng sau mỗi
keyword, tên function, dấu phẩy.
‒ Đặt dấu { ở cuối dòng lệnh đầu tiên. Đặt dấu } trên một dòng mới và không có
khoảng trắng ở đầu.
‒ Khai báo mỗi dòng 1 biến để tường minh.
3
‒ Để dễ đọc, tránh độ dài một dòng dài hơn 80 ký tự.
‒ Dùng dấu nháy đơn cho chuỗi. Chấm phẩy đầy đủ sau các câu lệnh (JavaScript
không bắt buộc nhưng ta nên thêm vào để code rõ ràng).
2.2. Tổng quan về React Native
2.2.1. Giới thiệu
Được phát triển bởi Facebook, React Native là một framework hướng đến phát
triển ứng dụng di động đa nền tảng. Với sự trợ giúp của React Native, lập trình viên
(developer) có thể sử dụng JavaScript để tạo ra mobile apps (ứng dụng di động) hỗ trợ
cho cả nền tảng Android và iOS. Instagram, Facebook, Skype,… là những ứng dụng
nổi bật sử dụng React Native.
Hình 2.1 - React Native
2.2.2. Cách hoạt động
React Native hoạt động được nhờ tích hợp 2 thread là Main Thread và JS Thread
cho ứng dụng di động. Trong đó:
Main Thread: cập nhật giao diện người dùng và xử lý tương tác người dùng.
JS Thread: thực thi và xử lý code JavaScript.
Hai luồng Main Thread và JS Thread này hoạt động độc lập với nhau. Hai Thread
sẽ tương tác với nhau nhờ một Bridge (cầu nối). Chiếc cầu này sẽ chuyển đổi dữ liệu
qua lại giữa các Thread.
4
2.2.3. Ưu nhược điểm
2.2.3.1. Ưu điểm
Có thể tái sử dụng code
React Native cho phép các developer có thể tái sử dụng code trong khi phát triển
các ứng dụng đa nền tảng. Đặc biệt, developer có thể tái sử dụng hầu như 80-90% các
đoạn code thay vì phải viết và tạo các ứng dụng riêng biệt cho các nền tảng khác
nhau. Ưu điểm này giúp người dùng:
Tiết kiệm thời gian và giảm chi phí phát triển của một ứng dụng.
Tận dụng nguồn nhân lực tốt hơn
Duy trì ít code hơn, ít bugs hơn
Các tính năng trong cả 2 nền tảng cũng tương tự nhau.
Cộng đồng người dùng lớn
React Native được đánh giá là một trong những Framework được yêu thích nhất
(khảo sát của stack overflow vào năm 2019). Nhờ cộng đồng người dùng rất lớn trên
toàn thế giới, chúng ta có thể tìm sự hỗ trợ nếu gặp phải bugs.
Tính ổn định và tối ưu
Được phát triển bởi Facebook, React Native có hiệu năng ổn định khá cao.
Code React Native giúp đơn giản hóa quá trình xử lý dữ liệu.
Đội ngũ phát triển ứng dụng không quá lớn.
Xây dựng ứng dụng ít native code nhất cho nhiều hệ điều hành khác nhau.
Trải nghiệm người dùng tốt hơn khi so sánh với ứng dụng Hybrid.
2.2.3.2. Nhược điểm
Yêu cầu Native code.
Hiệu năng kém hơn so với Native App.
Bảo mật chưa thật sự tốt do dùng JavaScript. Do sử dụng JavaScript, người dùng
cũng sẽ bị ảnh hưởng bởi những đặc điểm của JavaScript: dễ làm dễ sai, dẫn đến
khó duy trì về sau.
Quản lý bộ nhớ.
Tùy biến chưa thật sự tốt ở một số module.
Không thích hợp cho các ứng dụng cần năng lực tính toán cao (hash, crypto, etc).
5
2.2.4. Điểm khác biệt giữa React Native và ReactJS
Thiết lập và đóng gói (setup and bundling): Thiết lập và vận hành React
Native khá nhanh chóng vì có sẵn tất cả những module cần thiết. Trong khi đó,
bạn cần phải xác định các module cần thiết cho ứng dụng của mình khi
dùng ReactJS.
DOM và Styling: React Native không dùng HTML để render app mà cung cấp
các component để thay thế. Component React Native sẽ map các UI iOS hoặc
Android được render trên ứng dụng.
Animations và Gestures: Thay vì CSS animation, bạn sẽ phải sử dụng
JavaScript để tạo các Component động trong React Native.
Điều hướng (Navigation): Navigator trong React Native cung cấp tất cả những
gì mà bạn cần để thực hiện việc chuyển đổi giữa các Scene trong ứng dụng.
Nền tảng code riêng (Platform specific code): React Native có khả năng phát
hiện và nạp đúng code cho nền tảng được hỗ trợ.
2.2.5. Công cụ phát triển React Native
Các nhà phát triển có thể sử dụng những công cụ hoàn toàn miễn phí như sau:
Hot Reloading
Chrome Dev Tools để kiểm tra yêu cầu mạng, hiển thị bản ghi giao diện và dừng
mã trên các trình gỡ lỗi
Redux DevTools để kiểm tra trạng thái của store Redux
2.3. Tổng quan về .NET Core
2.3.1. Giới thiệu
.NET Core là một framework được Microsoft phát triển. Đây là một nền tảng
phát triển đa mục đích. .Net Core là nền tảng chéo (hỗ trợ Windows, macOS và Linux)
và có thể được sử dụng để xây dựng các ứng dụng thiết bị, đám mây và IoT.
.NET Core hỗ trợ các ngôn ngữ như: C# và F# (và C++/CLI kể từ 3.1; chỉ được
bật trên Windows) và nó còn hỗ trợ một phần của Visual Basic .NET.
Cụ thể:
C#: Là loại ngôn ngữ lập trình phát triển theo hướng đối tượng và mục đích.
6
F# : Là loại ngôn ngữ lập trình cho chức năng đa nền tảng, mã nguồn mở. Nó
cũng thường bao gồm lập trình cho hướng đối tượng và mệnh lệnh.
Visual Basic: Là ngôn ngữ lập trình có cú pháp đơn giản giúp xây dựng cho các
ứng dụng hướng tới đối tượng an toàn.
Những công cụ (gọi tắt là IDE) để lập trình với .NET core:
Visual Studio
Visual Studio Code
Sublime Text
Vim
Các phiên bản .NET Core được ra đời từ năm 2016 đã phát triển rất đều đặn và
nhận được những sự tiếp đón từ phía cộng đồng lập trình viên. Trong đó bản được đánh
giá là ổn định và được ưa chuộng nhất chính là 3.1.2.
2.3.2. Khả năng sử dụng
ASP.NET đã xuất hiện cách đây 15 năm trước. Nó là một phần của .NET
Framework. Nó đã có hàng triệu lập trình viên đã sử dụng để xây dựng những ứng dụng
web. Và Microsoft đã phát triển thêm nhiều tính năng mới qua từng năm.
ASP.NET Core có một số thay đổi lớn. Từ việc học hỏi các framework module
hóa khác. ASP.NET Core không còn dựa trên System.Web.dll nữa. Mà được dựa trên
một tập hợp các gói, các module hay cũng được gọi là các Nuget packages.
Với ASP.NET Core bạn có thể:
HTTP request được tối ưu nhẹ hơn.
Hợp nhất xây dựng web UI và web APIs.
Tích hợp những client-side frameworks hiện đại và có những luồng phát triển.
Hệ thống cấu hình dựa trên môi trường đám mây thật sự.
Dependency injection được xây dựng sẵn.
Có thể host trên IIS hoặc self-host trong process của riêng bạn.
Được xây dựng trên .NET Core, hỗ trợ thực sự app versioning.
Những công cụ mới để đơn giản hóa quá trình phát triển web tối ưu.
Xây dựng và chạy đa nền tảng(Windows, Mac và Linux).
Mã nguồn mở và tập trung vào cộng đồng.
7
2.3.3. Thành phần
.NET Core bao gồm các nền tảng: .NET Compiler Roslyn, .NET Core
framework CoreFX, .NET Core runtime CoreCLR, và ASP.NET Core.
Cấu trúc của.Net Core chi tiết
CoreFX: Nó được xem là nền tảng thư viện dành cho .NET Core.
CoreCLR: Đây là công cụ thực thi .Net trong .Net Core. Nó hỗ trợ thực hiện một
số chức năng như thu gom và biên dịch rác thành mã máy.
.Net Core runtime: Sẽ cung cấp một kiểu hệ thống, tải lắp ráp, trình thu gom rác
và các dịch vụ cơ bản khác.
Net Core runtime: Cung cấp framework để việc xây dựng các ứng dụng hiện đại
tối ưu, dựa trên đám mây, ứng dụng web, kết nối internet,…
.Net Core SDK và trình biên dịch ngôn ngữ (Roslyn và F#): giúp cho phép phát
triển .Net Core
Lệnh dotnet: Lệnh dùng cho việc khởi chạy ứng dụng .NET Core và các lệnh
CLI.
Hình 2.3 - Thành phần trong .NET
2.3.4. Phân biệt .NET Framework, .NET Core và Mono
Với người mới làm quen với .NET hay kể cả một số người đã làm việc với .NET
lâu năm. Những thuật ngữ, khái niệm như .NET Framework, Mono hay .NET core vẫn
hay gây ra nhầm lẫn. Về cơ bản thì .NET Framework, .NET core và Mono là ba phiên
8
bản .NET khác nhau (có nghĩa là mỗi phiên bản có Runtime, Libraries và Toolings
riêng). Dưới đây là sự khác biệt giữa ba phiên bản đó:
.NET Framework: Được Microsoft đưa ra chính thức từ năm 2002. .NET
Framework chỉ hoạt động trên hệ điều hành Windows. Những nền tảng như:
WPF, Winforms, ASP.NET(1-4) hoạt động dựa trên .NET Framework.
Mono là phiên bản cộng đồng giúp mang .NET đến những nền tảng ngoài
Windows. Mono được phát triển để xây dựng những ứng dụng với giao diện
người dùng và được sử dụng rất rộng rãi như: Unity Game, Xamarin…
.NET core: Đến năm 2013, Microsoft định hướng đa nền tảng và phát triển .NET
core. .NET core hiện được sử dụng trong các ứng dụng Universal Windows
platform và ASP.NET Core.
2.3.5. Trường hợp sử dụng
Chúng ta nên lựa chọn .NET Core nếu như:
Đang muốn xây dựng ứng dụng của mình chạy đa nền tảng: Windows, Linux và
MacOS.
Có sẵn các tinh thần học hỏi, không sợ sai bởi vì .NET Core vẫn chưa có thể
hoàn thiện.
Phát triển ứng dụng theo kiểu Microservices:Xây dựng các ứng dụng phức tạp
dựa theo module với khả năng tách rời và với mỗi module có thể sử dụng các
công nghệ khác nhau. Hiện nay .Net Core chính là một trong những lựa chọn
chính xác nhất.
Nếu hệ thống của bạn cần hiệu năng và khả năng mở rộng tốt nhất cho dù có
nhiều người dùng thì .NET Core và ASP.NET Core sẽ vẫn là trợ thủ sáng giá
nhất chúng ta nên lựa chọn.
2.4. Tổng quan về Redis Cache
2.4.1. Đặt vấn đề
Thông thường, cứ mỗi request từ phía client thì database sẽ trả kết quả về cho
client. Cho tới khi số lượng request giống nhau tăng lên đáng kể sẽ khiến cho CPU và
Hard Disk phải thực hiện lặp đi lặp lại công việc lấy dữ liệu ấy. Để giải quyết vấn đề
trên thì Caching đã làm tốt nhiệm vụ của nó bằng việc giúp server ghi nhớ kết quả của
9
cả quá trình tính toán, để trả về cho những lần request tương tự từ client trong tương lai.
Và Redis được biết đến là một công cụ hỗ trợ server giải quyết bài toán Caching này.
2.4.2. Giới thiệu Redis
Hình 2.4 - Kiến trúc Redis Cache
Redis là tên viết tắt của Remote Dictionary Server (Máy chủ từ điển từ xa), là
kho dữ liệu key-value, trong bộ nhớ, mã nguồn mở và có tốc độ truy cập nhanh để dùng
làm cơ sở dữ liệu, cache, message broker và queue. Redis có thể được sử dụng như một
database được lưu trữ trong ram để tăng tốc độ xử lí.
Redis hiện cung cấp thời gian phản hồi ở tốc độ chưa đến một mili giây, vì Redis
cho phép bạn lưu trữ trên RAM của mình nhanh hơn so với khi lưu trữ trên các ổ cứng,
khoảng 150.000 lần so với truy cập ổ HDD và nhanh hơn 500 lần so với truy cập SSD.
Thông thường khi ta sử dụng cơ sở dữ liệu thì vẫn lưu trữ trên ổ đĩa cứng. Ví dụ khi
query một cơ sở dữ liệu để đọc 10.000 bản ghi. Nếu dữ liệu được lưu trữ trên đĩa, thì nó
sẽ mất trung bình 30 giây, trong khi chỉ mất khoảng 0,0002 giây để đọc từ RAM, đó
chính là lí do mà Redis dùng RAM để lưu trữ. Redis thường được tạo trên một máy chủ
riêng hoặc set giới hạn bộ nhớ nhất định được sử dụng trên máy chủ dùng chung cho nên
sẽ không bị tình trạng thiếu RAM khi chạy đồn thời các ứng dụng khác.
Tuy nhiên, khi lưu trữ trên RAM thì nhanh thật nhưng lại gặp 1 vấn đề là bị mất
điện thì dữ liệu cũng mất tiêu. Để ngăn chặn việc mất dữ liệu xảy ra, có một mô-đun
được tích hợp sẵn để ghi trạng thái trong bộ nhớ vào file trên đĩa trong những trường
10
hợp nhất định. Các file này được tải lại khi khởi động lại redis. Vì vậy, dữ liệu sẽ không
bị mất. Ngoài ra, để tăng tính sẵn sàng và khả năng chịu lỗi của hệ thống. Redis có thể
cấu hình theo dạng Cluster với kỹ thuật Master-Slave giúp hệ thống Redis luôn sẵn sàng
đáp ứng sao lưu dữ liệu trên đĩa cứng và phục hồi dữ liệu khi gặp sự cố.
2.4.3. So sánh Redis và Memcached
Redis và Memcached đều nhanh và mạnh, đều lưu trữ dữ liệu trong bộ nhớ RAM
và rất hữu ích. Cả redis và memcached đều lưu trữ các kết quả dữ liệu giúp tăng tốc ứng
dụng cho người dùng.
Memcached lưu tất cả dữ liệu trên RAM, chỉ có dữ liệu dạng key/value.
Memcached là tầng cache nên không có tính persistent, rất khó backup dữ liệu, vì thế dữ
liệu rất dễ mất. Khi xảy ra tình trạng mất dữ liệu, memcached sẽ đẩy những key cũ hoặc
ít dùng ra trước. Memcached đa luồng nên memcached có khả năng sử dụng nhiều lõi
xử lý, có nghĩa là người dùng có thể xử lý nhiều hoạt động hơn bằng việc gia tăng công
suất tính toán.
Có thể thấy, Redis phần nào có những ưu điểm như memcached nhưng có sự cải
tiến rõ rệt và tăng khả năng lưu trữ, xử lý khi xảy ra sự cố.
Khi số lượng clients tăng thì tốc độ của Redis tỏ ra nhanh hơn:
Hình 2.5 - So sánh tốc độ Redis và Memcache
11
2.4.4. Lợi ích
In-Memory Data Store
Toàn bộ dữ liệu Redis nằm trong bộ nhớ chính của máy chủ, khác với các cơ sở
dữ liệu thường lưu phần lớn dữ liệu trên ổ đĩa hoặc ổ SSD. So với cơ sở dữ liệu trên ổ
đĩa truyền thống trong đó phần lớn các tác vụ đều yêu cầu truy cập lặp lại tới ổ đĩa, còn
Redis thì chỉ việc lấy ra kết quả đã tính toán. Do đó hiệu suất nhanh thấy rõ rệt với các
tác vụ đọc hoặc ghi thông thường mất chưa đầy một mili giây và hỗ trợ hàng triệu tác vụ
mỗi giây.
Cấu trúc dữ liệu linh hoạt
Khác với những kho dữ liệu key-value đơn giản có cấu trúc dữ liệu giới hạn,
Redis có nhiều cấu trúc dữ liệu khác nhau nên đáp ứng được nhu cầu ứng dụng của bạn.
Kiểu dữ liệu Redis gồm có:
String – văn bản hoặc dữ liệu nhị phân có kích thước lên tới 512MB
List – một tập hợp các chuỗi được sắp xếp theo thứ tự như khi được thêm vào
Set – một tập hợp chưa được sắp xếp các chuỗi, có khả năng giao cắt, liên kết và
khác với các kiểu tập khác
Sorted Set – Tập được sắp xếp theo giá trị
Hash – một cấu trúc dữ liệu dùng để lưu trữ danh sách các trường và giá trị
Bitmap – một kiểu dữ liệu cho phép thực hiện các tác vụ quy mô bit
HyperLogLogs – một cấu trúc dữ liệu xác suất để ước tính các thành phần duy
nhất trong một tập dữ liệu
Đơn giản và dễ sử dụng
Redis đơn giản hóa code của bạn bằng cách cho phép bạn viết ít dòng code hơn
để lưu trữ, truy cập và sử dụng dữ liệu trong các ứng dụng của mình. Ví dụ: nếu ứng
dụng của bạn có dữ liệu được lưu dạng hashmap và bạn muốn lưu trữ dữ liệu đó trong
DB thì bạn chỉ cần sử dụng cấu trúc dữ liệu hashes để lưu chúng. Thao tác tương tự trên
DB không có cấu trúc dữ liệu hashes sẽ yêu cầu nhiều dòng code để chuyển đổi từ định
12
dạng này sang định dạng khác. Với mỗi kiểu dữ liệu thì Redis thêm nhiều tùy chọn để
thao tác và tương tác với dữ liệu của bạn.
Replication - Persistence
Redis sử dụng kiến trúc primary-replica và hỗ trợ sao chép không đồng bộ, dữ
liệu có thể được sao chép sang nhiều máy chủ khác nhau. Điều này giúp hiệu suất đọc
được cải thiện (vì các yêu cầu có thể được phân chia giữa các máy chủ) và phục hồi
nhanh hơn khi máy chủ chính gặp sự cố ngừng hoạt động. Để duy trì, Redis hỗ trợ sao
lưu point-in-time backups (sao chép dữ liệu Redis vào đĩa).
Độ khả dụng cao và quy mô linh hoạt
Redis có kiến trúc primary-replica theo cấu trúc liên kết dạng một nút chính hoặc
cụm. Kiến trúc này cho phép bạn xây dựng những giải pháp có độ khả dụng cao, đảm
bảo hiệu suất ổn định và tin cậy. Khi cần điều chỉnh kích thước cụm, bạn có nhiều tùy
chọn khác nhau để thay đổi quy mô theo chiều dọc và thay đổi quy mô theo chiều ngang.
Việc này cho phép tăng cụm theo nhu cầu của bạn.
Khả năng mở rộng
Redis là dự án mã nguồn mở đã có cộng đồng lớn tin dùng. Không có giới hạn về
nhà cung cấp hoặc công nghệ vì Redis được có tính tiêu chuẩn mở, hỗ trợ các định dạng
dữ liệu mở và có tập hợp máy khách phong phú.
2.3.5. Một số ứng dụng
Caching
Redis là một lựa chọn tuyệt vời để triển khai in-memory cache để giảm độ trễ truy
cập dữ liệu, tăng thông lượng và giảm tải khỏi cơ sở dữ liệu quan hệ hoặc NoSQL trong
ứng dụng của bạn. Redis có thể phục vụ các dữ liệu được yêu cầu thường xuyên ở thời
gian phản hồi dưới một mili giây. Và cho phép bạn dễ dàng mở rộng quy mô cho các tải
cao hơn mà không cần tăng phụ trợ tốn kém. Persistent session caching, web page
caching và caching của các đối tượng được sử dụng thường xuyên như hình ảnh, tệp và
siêu dữ liệu là các ví dụ phổ biến về caching với Redis.
Session Store
Redis như một kho lưu trữ dữ liệu trong bộ nhớ với tính sẵn sàng cao và bền bỉ là
lựa chọn phổ biến của các nhà phát triển ứng dụng để lưu trữ và quản lý dữ liệu session
13
cho các ứng dụng của mình. Redis cung cấp độ trễ dưới một phần nghìn giây và khả
năng phục hồi cần thiết để quản lý dữ liệu session như hồ sơ người dùng, thông tin đăng
nhập, trạng thái phiên và cá nhân hóa cụ thể của người dùng.
Real-time Analytics
Redis có thể được sử dụng với các giải pháp streaming như Apache Kafka và
Amazon Kinesis như một in-memory data store để nhập, xử lý và phân tích dữ liệu realtime với độ trễ nhỏ hơn một mili giây. Redis là một lựa chọn lý tưởng cho các hệ thống
real-time analytics như truyền thông xã hội, quảng cáo và IoT,...
2.3.6. Trường hợp sử dụng
Vì Redis nên nó chủ yếu được sử dụng cho mục đích lưu vào bộ nhớ đệm. Đây
là thế mạnh lớn nhất của Redis vì nó cung cấp nhiều loại dữ liệu khác nhau với cấu trúc
từ điên (key-value) của nó.
Full Page Cache (FPC)
Điều đó có nghĩa là, chúng ta có thể sử dụng Redis để lưu vào bộ đệm đầy đủ
các trang có lưu lượng truy cập cao và nội dung tĩnh. Nếu bản thân trang có xu hướng
thay đổi hoặc nội dung được tạo động, thì nó không nên được lưu vào bộ nhớ cache
trong mọi trường hợp bất kể đó là Redis hay Memcached. Nếu trang chủ yếu chứa nội
dung tĩnh hoặc nội dung được làm mới sau mỗi x khoảng thời gian, thì chúng ta có thể
lưu vào bộ nhớ cache của trang đó và nó sẽ được phục vụ ngay lập tức!
Session Cache
Ngoài cache file tĩnh, Redis còn có thể dùng để lưu session (phiên đăng nhập).
Không giống như Memcached không có tính bền bỉ (Persistence), Redis có cho phép
lưu trữ session. Xử lý các phiên bằng Redis giúp tăng trải nghiệm người dùng khi tương
tác với trang web.
Tính năng Persistence rất quan trọng để lưu trữ các phiên, để tránh mất dữ liệu
trong các phần quan trọng của tương tác với người dùng. Ví dụ: xử lý thanh toán, thêm
một mặt hàng vào giỏ hàng hoặc yêu cầu bất kỳ hành động nào với tư cách là người
dùng đã xác thực.
14
- Xem thêm -