Tình trạng của tôi là tôi hiện đang lưu trữ một hệ thống phân cấp trong cơ sở dữ liệu SQL nhanh chóng tiếp cận 15000 nút (5000 cạnh). Phân cấp này xác định mô hình bảo mật của tôi dựa trên vị trí của người dùng trong cây, cấp quyền truy cập cho các mục bên dưới. Vì vậy, khi một người dùng yêu cầu một danh sách tất cả các mục được bảo mật, tôi đang sử dụng CTE để recurse nó trong db (và flatten tất cả các mục), được bắt đầu để hiển thị tuổi của nó (chậm).Làm thế nào để lưu trữ và đọc lại một hệ thống phân cấp từ bộ nhớ đệm
Hệ thống phân cấp không thay đổi thường xuyên vì vậy tôi đã cố chuyển nó vào RAM (redis). Lưu ý rằng tôi có nhiều hệ thống con cần điều này cho các cuộc gọi bảo mật và giao diện người dùng để xây dựng cây cho các hoạt động CRUD.
nỗ lực đầu tiên
nỗ lực đầu tiên của tôi là để lưu trữ các mối quan hệ như một cặp giá trị key (đây là cách nó được lưu trữ trong cơ sở dữ liệu)
E / \ F G /\ /\ H I J K mapped to: E - [F, G] F - [H, I] G - [J, K]
Vì vậy, khi tôi muốn E và tất cả những người quá cố của nó, tôi đệ quy lấy con và con của họ bằng cách sử dụng các phím, và nó cho phép tôi bắt đầu ở bất kỳ nút nào để di chuyển xuống. Giải pháp này đã tăng tốc độ tốt nhưng với 15.000 nút, khoảng 5000 lần truy cập bộ nhớ cache để xây dựng lại cây của tôi theo mã (kịch bản trường hợp tồi tệ hơn ... bắt đầu từ hiệu suất E. dựa trên vị trí nút bắt đầu, dẫn đến siêu người dùng nhìn thấy hiệu suất tồi tệ nhất). Điều này vẫn còn khá nhanh nhưng dường như trò chuyện. Tôi thích thực tế là tôi có thể loại bỏ một nút bất cứ lúc nào bằng cách popping nó ra khỏi danh sách phím mà không cần xây dựng lại toàn bộ bộ nhớ cache của tôi. Điều này cũng chiếu sáng nhanh để xây dựng một cây theo yêu cầu một cách trực quan trên giao diện người dùng.
Nỗ lực thứ hai
Idea khác của tôi là để có những cấp bậc từ cơ sở dữ liệu, xây dựng cây và lưu trữ trong RAM (redis) sau đó kéo toàn bộ điều ra khỏi bộ nhớ (đó là khoảng 2 Kích thước MB, được tuần tự hóa). Điều này đã cho tôi một cuộc gọi duy nhất (không phải là trò chuyện) thành redis để kéo toàn bộ cây ra, định vị nút cha của người dùng và xuống để nhận tất cả các mục con. Các cuộc gọi này thường xuyên và giảm xuống 2 MB ở lớp mạng có vẻ lớn. Điều này cũng có nghĩa là tôi không thể dễ dàng thêm/xóa và mục mà không kéo xuống cây và chỉnh sửa và đẩy tất cả trở lại. Ngoài ra trên cây cầu xây dựng thông qua HTTP có nghĩa là mỗi yêu cầu đã phải giảm 2MB để chỉ nhận được con trực tiếp (rất nhỏ bằng cách sử dụng giải pháp đầu tiên).
Vì vậy, giải pháp nào bạn nghĩ là một cách tiếp cận tốt hơn (dài hạn khi tiếp tục phát triển). Cả hai đều nhanh hơn một cách rõ ràng và lấy một số tải ra khỏi cơ sở dữ liệu. Hay là cách tốt hơn để thực hiện điều này mà tôi chưa từng nghĩ đến?
Cảm ơn
Bạn giải quyết vấn đề này như thế nào? – vishal