Tôi đang sử dụng Redis trong một ứng dụng Java, nơi tôi đang đọc các tệp nhật ký, lưu trữ/truy xuất một số thông tin trong Redis cho mỗi nhật ký. Các khóa là địa chỉ IP trong tệp nhật ký của tôi, có nghĩa là chúng luôn là các phím tin tức sắp ra mắt, ngay cả khi cùng xuất hiện thường xuyên.Làm thế nào chậm là Redis khi đầy đủ và đuổi các phím? (Thuật toán LRU)
Tại một số thời điểm, Redis đạt đến kích thước tối đa (3gb trong trường hợp của tôi) và bắt đầu trục xuất một số khóa. Tôi sử dụng cài đặt "allkeys-lru" khi tôi muốn giữ các phím nhỏ nhất.
Toàn bộ ứng dụng sau đó sẽ giảm rất nhiều, lấy 5 lần dài hơn so với lúc bắt đầu. Vì vậy, tôi có ba câu hỏi:
- bình thường có sự chậm lại đáng kể (5 lần)? Có ai có kinh nghiệm chậm chạp như vậy không? Nếu không, tôi có thể có một vấn đề khác trong mã của tôi (không thể xảy ra khi sự chậm lại xuất hiện chính xác khi Redis đạt đến giới hạn của nó)
- tôi có thể cải thiện cấu hình của mình không? Tôi đã cố gắng thay đổi cài đặt mẫu tối đa mà không cần nhiều thành công
- tôi có nên xem xét thay thế cho vấn đề cụ thể của mình không? Có một DB trong bộ nhớ có thể xử lý các phím bị trục xuất với màn trình diễn tốt hơn không? Tôi có thể xem xét một đối tượng Java thuần túy (HashMap ...), ngay cả khi nó không giống như một thiết kế tốt.
chỉnh sửa 1: chúng tôi sử dụng 2 DBS trong Redis
chỉnh sửa 2: Chúng tôi sử dụng 2.2.12 redis (ubuntu 12.04 LTS). Các nghiên cứu sâu hơn giải thích vấn đề: chúng tôi đang sử dụng db0 và db1 trong redis. db1 được sử dụng ít hơn nhiều so với db0, và các khóa hoàn toàn khác nhau. Khi Redis đạt tới bộ nhớ tối đa (và bản đồ LRU bắt đầu loại bỏ khóa), redis sẽ loại bỏ gần như tất cả các khóa db1, làm chậm tất cả các cuộc gọi. Đây là một hành vi kỳ lạ, có lẽ không bình thường và có thể liên quan đến ứng dụng của chúng tôi. Chúng tôi đã khắc phục sự cố này bằng cách chuyển sang cơ chế bộ nhớ khác (tốt hơn) cho các khóa được tải trong db1.
cảm ơn!
Cảm ơn Didier. Chúng tôi vẫn đang điều tra vấn đề này, nhưng có vẻ như có điều gì khác gây ra sự chậm lại này. Chúng tôi thực sự sử dụng 2 DB trong redis, và có vẻ như có một hành vi lạ khi đạt đến bộ nhớ tối đa. Tôi sẽ đăng thêm chi tiết khi chúng tôi có nó. Tôi sẽ đợi các câu trả lời có thể khác và xác thực câu trả lời của bạn. – Pixou
@Pixou, Mọi cập nhật về điều này? – Ashish
@Ashish Về cơ bản, chúng tôi phát hiện ra rằng cơ chế LRU hoạt động trên cả hai cơ sở dữ liệu, theo cách mà nếu bạn có một cơ sở dữ liệu lớn và một cơ sở dữ liệu nhỏ, một nhỏ sẽ bị "hút" khá nhanh bởi LRU. Ví dụ, khi mẫu mamemory là 3, LRU dường như lấy 2 mẫu từ DB lớn, 1 từ mẫu nhỏ, ngay cả khi nhỏ hơn 10000 lần. Vì vậy, một lần nữa, chúng tôi đã khắc phục điều đó bằng cách chỉ có một cơ sở dữ liệu trong trường hợp redis của chúng tôi. – Pixou