Tôi cần tăng tốc ứng dụng của mình (viết bằng PHP, dịch vụ GET đơn giản) và tôi quyết định chuyển nó từ phương pháp RDBMS sang Redis. Sau khi dành một tuần để nghiên cứu cách thực hiện việc này và cân nhắc rằng tôi có rất nhiều bảng và nhiều trường trong cơ sở dữ liệu quan hệ của mình, tôi đã tạo một cấu trúc như thế này trong redis:{nameOfTable:clientID:itemID}
,例如
SET clientSubjects:1:1 bigJSONStringHere1
SET clientSubjects:1:2 bigJSONStringHere2
SET clientSubjects:1:3 bigJSONStringHere3
SET clientSubjects:2:1 bigJSONStringHere4
SET clientSubjects:2:2 bigJSONStringHere5
SET clientSubjects:2:3 bigJSONStringHere6
等等
Tôi có khoảng 20 triệu khách hàng, mỗi khách hàng có khoảng 4-10 chủ đề, tức là khoảng 150 triệu key. Để tìm chủ đề cho tất cả khách hàng, mỗi khi nhận được yêu cầu từ một khách hàng nào đó tôi phải sử dụng QUÉT
. Tôi gặp phải một vấn đề, khi tải xong tất cả máy khách vào Redis, lệnh
Quét 0 kết quả trùng khớp clientSubjects:{someID}:* đếm 100
trở lại:
1) "7241728"
2) (danh sách hoặc bộ trống)
Sau đó... quyết định của tôi là tìm tổng số khóa trong kho lưu trữ redis và sử dụng nó làm ĐẾM
参数。
Điều này trông giống như:
không gian phím cục bộ = redis.call("thông tin", "không gian phím")
Keys cục bộCount = keyspace:match("keys=(%d+),")
local result = redis.call("SCAN", 0, "match", "clientSubjects:" .. ARGV[1] .. ":*", "count", KeysCount) --ARGV có nghĩa là tôi chuyển clientID cho tập lệnh lua
Vì vậy, mọi thứ đều hoạt động tốt ngoại trừ việc mất khoảng 3 giây để thực thi! Nhưng tôi cần khoảng một phần nghìn giây... Tôi có thể làm gì?
Nếu bạn có 20 triệu bản ghi, bạn sẽ cần rất nhiều bộ nhớ để lưu trữ tất cả cấu trúc dữ liệu và các phương thức truy vấn khác nhau.
Ví dụ: để tìm chủ đề cho tất cả khách hàng, tôi sẽ có một tệp có tên chủ đề khách hàng:{clientID}
Một bộ sưu tập hoặc danh sách chứa giá trị của ID chủ đề.
Bạn nên có các cấu trúc dữ liệu khác nhau để phù hợp với các truy vấn khác nhau của mình và tránh sử dụng những thứ như QUÉT vì điều này chưa tối ưu.
Theo tôi, cơ sở dữ liệu quan hệ với một số chỉ mục được đặt đúng vị trí sẽ phù hợp hơn cho tình huống này, nó sẽ giúp bạn tiết kiệm rất nhiều thời gian và tiền bạc vì các chỉ mục thường được lưu trong bộ nhớ và có thể được khôi phục trở lại đĩa.
Hãy nhớ rằng Redis yêu cầu bạn lưu trữ tất cả dữ liệu trong bộ nhớ, vì vậy việc này sẽ trở nên tốn kém hơn khi bạn thêm nhiều cấu trúc dữ liệu hơn để giải quyết các loại truy vấn khác nhau.
Tôi là một lập trình viên xuất sắc, rất giỏi!