Redis: giải quyết bài toán lưu trữ dữ liệu
Bài đăng này đã không được cập nhật trong 3 năm
Abstract: Redis là một hệ thống hỗ trợ lưu trữ dữ liệu và được lưu trữ trên ram để truy suất một cách nhanh chóng, nó hỗ trợ việc truy suất dữ liệu và một cách nhanh chóng. Và hiện nay, redis đã được dùng khá phổ biến, nên tài liệu về giới và cài đặt của nó khá nhiều trên mang, do đó, trong bài này, mình sẽ chỉ giới thiệu về bài toán mình đã làm và cách giải quyết nói.
1. Bài toán đặt ra
Trong một hệ thống quản lý nhân sự, cụ thể là quản lý về thanh viên trong các dự án của công ty. Mỗi một nhân viên sẽ được phân công ít nhất 1 dự án, và nhân viên đó có thể tham gia nhiều dự án trong cùng 1 thời điểm. Một điểm lưu ý ở đây là mỗi nhân viên thuộc dự án này có khoảng thời gian bắt đầu và thời gian kết thúc dự đoán. Nhiệm vụ được đưa ra là hãy hiển thị thông tin của nhân viên với số hàng là ít nhất. Ví dụ, như trong hình.
Như trong hình trên, chúng ta cần đến 4 ô để biểu diễn các thông tin cần thiết, trong khi chung ta cần và mong muốn số hàng là ít nhất, ví dụ như:
Và để truy suất cho đơn giả, tôi đã thực hiện lưu trữ bằng redis. Bài toán được đặt ra là làm sao để truy vấn từ redis và cần có 1 cấu để frontend chỉ cần gọi đến nó và hiển thị ra dễ dàng nhất.
2. Giải quyết bài toán
Từ yêu cầu đặt ra, để giải việc hiển thị ở dưới frontend 1 cách dễ dàng, chúng tôi đề xuất giải pháp sử dụng mảng để lưu trữ từng hàng của nhân viên. Bởi vì redis lưu trữ dưới dạng key value, và key là 1 string, value có thể là 1 hash, hoặc 1 mảng, hoặc đơn giản, nó là string hoặc number. Tuy nhiên, kiến trúc như thế nào để lưu lưu trữ hiệu quả cũng như giải pháp nào để sắp xếp thứ tự 1 các mảng 1 cách tiết kiệm, bên cạnh đó, khi thay đổi thời gian, khi xóa hoặc thêm thì chúng ta phải làm thế nào?
Từ các vấn đề trên, mình đề xuất như sau:
a. Giải pháp về lưu trữ
-
Mình sử dụng id của nhân viên là key. Mỗi value của key này là 1 mảng, mỗi mảng sẽ chứa 1 hoặc nhiều project, tùy thuộc vào khoảng thời gian của nhân viên trong dự án đó. Quy ước, với giá trị null sẽ tương ứng với vô cùng. Cấu trúc dưới đây là 1 ví dụ.
"employee_id": {[project1(tháng 1 - 4), project2(tháng 5 - 6)], [project3(tháng 2 - 5), project4(tháng 6 - nil)]};
-
Số lượng mỗi mảng của nhân viên là không giống nhau.
b. Giải pháp về thêm dữ liệu.
-
Với trường hợp sắp xếp dữ liệu từ ban đầu, mình quy chung với phần thêm dữ liệu này là 1, mình coi việc sắp xếp dữ liệu là trường hợp thêm lần lượt từng record vào một bộ dữ liệu được khởi tạo ban đầu là rông.
-
Khi thêm dữ liệu, mình thực hiện như mô hình sau:
- Vậy làm thế nào đê tìm được 1 hàng phù hợp? Mình đơn giản chỉ sử dụng khoảng thời gian của nhân viên trong prject, nếu 2 khoảng thời gian này không giao nhau, thì đó chính là hàng phù hợp
c. Giải pháp khi thay đổi khoảng thời gian.
- Với trường hợp tăng khoảng thời gian, ta kiểm tra khoảng thời gian của project đó có giao với khoảng thời gian của project khác khi trên cùng 1 dòng hay không? Nếu bị giao, ta chỉ cần tách nó ra 1 hàng khác.
- Với trường hợp giảm khoảng thời gian, nếu là một project 1 mình 1 hàng, ta tìm hàng phù hợp với project này, và chuyển project này đến hàng phù hợp với nó. Nếu project này tồn tại lớn hơn 2 project trên 1 hàng, ta sẽ tìm các hàng có 1 project, xem hàng nào phù hợp với hàng ta vừa thay đổi hay không? Nếu có, chuyển project này đến hàng chúng ta đang thao tác.
d. Giải pháp khi xóa 1 project.
- Với trường hợp này, ta đơn giản chỉ là xóa project ra khỏi hàng đó, và thưc hiện tương tự như trên, ta tìm hàng đơn nào phù hợp để chuyển hàng đó đến vị trị đang thao tác.
Kết luận: Trên đây là cách giải quyết của mình với bài toán lưu trữ dữ liệu như được trình bay trong phần 1. Trong bài viết tiếp theo, mình sẽ trình bày về bài toán cập nhập thông tin của từng project trong bộ dữ liệu sử dụng redis này.
Cảm ơn các bạn đã theo dõi.!
All rights reserved