Câu trả lời:
Redis và MongoDB có thể được sử dụng cùng nhau sẽ cho kết quả tốt. Một công ty nổi tiếng với việc chạy MongoDB và Redis (cùng với MySQL và Sphinx) là Craiglist. Xem bản trình bày này từ Jeremy Zawodny.
MongoDB rất thú vị vì dữ liệu được định hướng, liên tục, được lập chỉ mục theo nhiều cách khác nhau. Redis thú vị hơn đối với dữ liệu dễ bay hơi hoặc dữ liệu bán liên tục nhạy cảm với độ trễ.
Dưới đây là một vài ví dụ về cách sử dụng cụ thể của Redis trên MongoDB.
MongoDB trước 2.2 chưa có cơ chế hết hạn. Bộ sưu tập có giới hạn thực sự không thể được sử dụng để triển khai một TTL thực. Redis có cơ chế hết hạn dựa trên TTL, giúp thuận tiện cho việc lưu trữ dữ liệu biến động. Ví dụ: phiên người dùng thường được lưu trữ trong Redis, trong khi dữ liệu người dùng sẽ được lưu trữ và lập chỉ mục trong MongoDB. Lưu ý rằng MongoDB 2.2 đã giới thiệu cơ chế hết hạn có độ chính xác thấp ở cấp độ thu thập (ví dụ: được sử dụng để xóa dữ liệu).
Redis cung cấp một kiểu dữ liệu tập hợp thuận tiện và các hoạt động liên quan của nó (kết hợp, giao điểm, sự khác biệt trên nhiều tập hợp, v.v.). Khá dễ dàng để triển khai một công cụ tìm kiếm hoặc gắn thẻ theo khía cạnh cơ bản trên tính năng này, đây là một bổ sung thú vị cho khả năng lập chỉ mục truyền thống hơn của MongoDB.
Redis hỗ trợ các hoạt động chặn pop hiệu quả trên danh sách. Điều này có thể được sử dụng để triển khai hệ thống xếp hàng phân tán đặc biệt. Nó linh hoạt hơn IMO con trỏ có thể điều chỉnh của MongoDB, vì một ứng dụng phụ trợ có thể lắng nghe một số hàng đợi với thời gian chờ, chuyển các mục sang hàng đợi khác một cách nguyên tử, v.v. Nếu ứng dụng yêu cầu một số hàng đợi, bạn nên lưu trữ hàng đợi trong Redis và giữ dữ liệu chức năng liên tục trong MongoDB.
Redis cũng cung cấp cơ chế quán rượu / phụ. Trong một ứng dụng phân tán, một hệ thống lan truyền sự kiện có thể hữu ích. Đây lại là một trường hợp sử dụng tuyệt vời cho Redis, trong khi dữ liệu liên tục được giữ trong MongoDB.
Vì việc thiết kế mô hình dữ liệu với MongoDB dễ dàng hơn nhiều so với Redis (Redis ở mức thấp hơn), thật thú vị khi được hưởng lợi từ tính linh hoạt của MongoDB đối với dữ liệu liên tục chính và từ các tính năng bổ sung do Redis cung cấp (độ trễ thấp , mục hết hạn, hàng đợi, pub / sub, khối nguyên tử, v.v.). Nó thực sự là một sự kết hợp tốt.
Xin lưu ý rằng bạn không bao giờ được chạy máy chủ Redis và MongoDB trên cùng một máy. Bộ nhớ MongoDB được thiết kế để hoán đổi, Redis thì không. Nếu MongoDB kích hoạt một số hoạt động hoán đổi, hiệu suất của Redis sẽ rất thảm. Chúng nên được cách ly trên các nút khác nhau.
Rõ ràng là có xa khác biệt hơn này, nhưng đối với một cái nhìn tổng quan rất cao:
Đối với các trường hợp sử dụng:
Về mặt kỹ thuật:
Có một số chồng chéo, nhưng nó là cực kỳ phổ biến để sử dụng cả hai. Đây là lý do tại sao:
Redis có thể được sử dụng để thay thế cho một kho dữ liệu truyền thống, nhưng nó thường được sử dụng nhất với một kho dữ liệu "dài" bình thường khác, như Mongo, Postgresql, MySQL, v.v.
Redis hoạt động xuất sắc với MongoDB như một máy chủ bộ nhớ đệm. Đây là những gì xảy ra.
Bất cứ khi nào mongoose đưa ra một truy vấn bộ nhớ cache, trước tiên nó sẽ chuyển đến máy chủ bộ nhớ cache.
Máy chủ bộ nhớ cache sẽ kiểm tra xem liệu truy vấn chính xác đó đã từng được đưa ra trước đây chưa.
Nếu nó không có thì máy chủ bộ nhớ cache sẽ nhận truy vấn, gửi nó đến mongodb và Mongo sẽ thực hiện truy vấn.
Sau đó chúng ta sẽ lấy kết quả của câu truy vấn đó, nó quay trở lại máy chủ cache, máy chủ cache sẽ tự lưu trữ kết quả của câu truy vấn đó.
Nó sẽ cho biết bất cứ lúc nào tôi thực hiện truy vấn đó, tôi nhận được phản hồi này và vì vậy nó sẽ duy trì một bản ghi giữa các truy vấn được đưa ra và các phản hồi quay lại từ những truy vấn đó.
Máy chủ bộ nhớ cache sẽ nhận phản hồi và gửi lại mongoose, mongoose sẽ cung cấp cho nó để thể hiện và cuối cùng nó sẽ kết thúc bên trong ứng dụng.
Bất cứ khi nào cùng một truy vấn chính xác được đưa ra lại, mongoose sẽ gửi cùng một truy vấn đến máy chủ bộ đệm, nhưng nếu máy chủ bộ đệm thấy rằng truy vấn này đã được đưa ra trước đó, nó sẽ không gửi truy vấn lên mongodb, thay vào đó nó sẽ nhận phản hồi tới truy vấn mà nó nhận được lần cuối và ngay lập tức gửi nó trở lại mongoose. Không có chỉ mục nào ở đây, không quét toàn bộ bảng, không có gì.
Chúng tôi đang thực hiện một tra cứu đơn giản để biết truy vấn này đã được thực thi chưa? Đúng? Được rồi, nhận yêu cầu và gửi lại ngay lập tức và không gửi bất cứ thứ gì cho mongo.
Chúng tôi có máy chủ mongoose, máy chủ bộ nhớ cache (Redis) và Mongodb.
Trên máy chủ bộ nhớ cache có thể có một kho dữ liệu với loại giá trị khóa là nơi lưu trữ dữ liệu, trong đó tất cả các khóa là một số loại truy vấn được phát hành trước đó và giá trị là kết quả của truy vấn đó.
Vì vậy, có thể chúng tôi đang tìm kiếm một loạt các bài đăng blog của _id.
Vì vậy, có thể các chìa khóa ở đây là _id của các bản ghi mà chúng ta đã tra cứu trước đây.
Vì vậy, hãy tưởng tượng rằng mongoose đưa ra một truy vấn mới trong đó nó cố gắng tìm một bài đăng blog có _id là 123, truy vấn chảy vào máy chủ bộ nhớ cache, máy chủ bộ nhớ cache sẽ kiểm tra xem nó có kết quả cho bất kỳ truy vấn nào đang tìm kiếm một _id không trong tổng số 123.
Nếu nó không tồn tại trong máy chủ bộ nhớ cache, truy vấn này sẽ được thực hiện và gửi đến cá thể mongodb. Mongodb sẽ thực hiện truy vấn, nhận phản hồi và gửi lại.
Kết quả này được gửi trở lại máy chủ bộ nhớ cache, máy chủ lấy kết quả đó và ngay lập tức gửi nó trở lại mongoose để chúng tôi nhận được phản hồi nhanh nhất có thể.
Ngay sau đó, máy chủ bộ nhớ cache cũng sẽ nhận truy vấn được phát hành và thêm truy vấn đó vào bộ sưu tập các truy vấn đã được phát hành của nó và lấy kết quả của truy vấn và lưu trữ nó ngay với truy vấn.
Vì vậy, chúng ta có thể tưởng tượng rằng trong tương lai chúng ta lại đưa ra cùng một truy vấn, nó truy cập vào máy chủ bộ nhớ cache, nó xem xét tất cả các khóa mà nó có và nói ồ tôi đã tìm thấy bài đăng blog đó, nó không liên lạc được với mongo, nó chỉ mất kết quả của truy vấn và gửi trực tiếp đến mongoose.
Chúng tôi không thực hiện logic truy vấn phức tạp, không có chỉ mục, không có gì tương tự. Nó càng nhanh càng tốt. Nó là một tra cứu giá trị khóa đơn giản.
Đó là tổng quan về cách máy chủ bộ nhớ cache (Redis) hoạt động với MongoDB.
Bây giờ có những mối quan tâm khác. Chúng ta có phải lưu trữ dữ liệu mãi mãi không? Làm thế nào để chúng tôi cập nhật hồ sơ?
Chúng tôi không muốn luôn luôn lưu trữ dữ liệu trong bộ nhớ cache và đọc từ bộ nhớ cache.
Máy chủ bộ đệm không được sử dụng cho bất kỳ hành động ghi nào. Lớp bộ nhớ cache chỉ được sử dụng để đọc dữ liệu. Nếu chúng ta từng ghi dữ liệu, việc ghi sẽ luôn chuyển sang thể hiện mongodb và chúng ta cần đảm bảo rằng bất cứ khi nào chúng ta ghi dữ liệu, chúng ta sẽ xóa mọi dữ liệu được lưu trữ trên máy chủ bộ nhớ cache có liên quan đến bản ghi mà chúng ta vừa cập nhật trong Mongo.