2013-06-16 59 views
7

Tôi có 3,5 triệu bản ghi (chỉ đọc) thực sự được lưu trữ trong một DB MySQL mà tôi muốn rút ra cho Redis vì lý do hiệu suất. Thực ra, tôi đã quản lý để lưu trữ những thứ như thế này vào Redis:Tìm kiếm văn bản đầy đủ Redis: lập chỉ mục đảo ngược hoặc vết đen mặt trời?

1 {"type":"Country","slug":"albania","name_fr":"Albanie","name_en":"Albania"} 
2 {"type":"Country","slug":"armenia","name_fr":"Arménie","name_en":"Armenia"} 
... 

Chìa khóa tôi sử dụng ở đây là di sản MySQL id, vì vậy với một số keo Ruby, tôi có thể phá vỡ như điều ít càng tốt trong ứng dụng hiện nay (và đây là một mối quan tâm nghiêm túc ở đây).

Bây giờ vấn đề là khi tôi cần thực hiện tìm kiếm trên từ khóa "Armenia", bên trong phần giá trị. Có vẻ như chỉ có hai cách ra:

Hoặc là tôi nhân giống Redis index: giá trị

  • id => JSON (như hình trên)
  • sên => id (đảo ngược lập chỉ mục dựa trên sên , mà có thể làm các trick tìm kiếm cơ bản)
  • cuối cùng, một chỉ số rất lớn đặc biệt cho autocomplete, như trong bài này: http://oldblog.antirez.com/post/autocomplete-with-redis.html

Hoặc tôi sử dụng vết đen mặt trời hoặc một số công cụ tìm kiếm văn bản đầy đủ (không may, tôi thực sự sử dụng ThinkingSphinx quá nhiều liên kết với MySQL :-(

Vì vậy, bạn sẽ làm gì? Bạn có nghĩ rằng MySQL để Redis di chuyển của một bảng duy nhất thậm chí là một ý tưởng tốt? Tôi sợ những dấu chân bộ nhớ những khóa/giá trị khổng lồ Redis có thể mất trên một máy chủ RAM 16GB.

Bất kỳ phản hồi nào về cách sử dụng Redis tương tự?

Trả lời

4

Trước khi tôi bắt đầu với câu trả lời thực sự, tôi muốn đề cập đến rằng tôi không thấy lý do chính đáng để bạn sử dụng Redis tại đây. Dựa trên những loại trường hợp sử dụng mà nó nghe như bạn đang cố gắng làm, có vẻ như một cái gì đó như elasticsearch sẽ phù hợp hơn với bạn.

Điều đó nói rằng, nếu bạn chỉ muốn để có thể tìm kiếm một vài lĩnh vực khác nhau trong JSON của bạn, bạn đã có hai lựa chọn:

  1. chỉ số phụ trỏ field_key -> list_of_ids (trong trường hợp của bạn, "Armenia "-> 1).
  2. Sử dụng Lua trên đầu trang Redis với mã hóa và giải mã JSON để nhận được những gì bạn muốn. Đây là cách linh hoạt hơn và không gian hiệu quả, nhưng sẽ chậm hơn khi bảng của bạn phát triển.

Một lần nữa, tôi không nghĩ là phù hợp với bạn bởi vì nó không có vẻ như Redis sẽ là lựa chọn tốt cho bạn, nhưng nếu bạn phải, những thứ đó sẽ hiệu quả.

+0

Có Eli, cuối cùng có vẻ như bạn hoàn toàn đúng. Tôi đã thực hiện thí nghiệm của mình cho đến khi kết thúc và chấm điểm một tìm kiếm dựa trên chỉ số ngược sử dụng chỉ mục Redis vs ThinkingSphinx ... ThinkingSphinx giành chiến thắng (gần 30% nhanh hơn). Vì vậy, bạn nói đúng, tôi nghĩ Redis không phải là công cụ thích hợp ở đây, tôi sẽ tiếp tục sử dụng Sphinx nhanh chóng (và MySQL DB cũ của tôi điên cuồng, đầy đủ dữ liệu chỉ đọc ...) – gbarillot

+0

theo cách, chỉ FYI trong bạn đang googling này, 3 triệu hồ sơ thiết lập phù hợp trong 650Mo RAM, do đó, nó là một vấn đề ít quan trọng mà tôi đã mong đợi ở đầu – gbarillot

2

Đây là sự lựa chọn của tôi đối với Redis. Về cơ bản tôi nghĩ nó như một bộ nhớ đệm trong bộ nhớ có thể được cấu hình để chỉ lưu trữ dữ liệu được sử dụng gần đây nhất (LRU). Đó là vai trò của tôi trong trường hợp sử dụng của tôi, logic có thể được áp dụng để giúp bạn suy nghĩ về trường hợp sử dụng của bạn.

Tôi hiện đang sử dụng Redis để lưu trữ kết quả cho công cụ tìm kiếm dựa trên một số truy vấn phức tạp (chậm), được hỗ trợ bởi dữ liệu trong một DB khác (tương tự trường hợp của bạn). Vì vậy, Redis hoạt động như một bộ nhớ cache để trả lời các truy vấn. Tất cả các truy vấn hoặc được phân phối dữ liệu trong Redis hoặc DB nếu đó là một bộ nhớ cache-miss trong Redis. Vì vậy, lưu ý rằng Redis không phải là thay thế DB, nhưng chỉ đơn thuần là một phần mở rộng thông qua bộ nhớ cache trong trường hợp của tôi. Điều này phù hợp với trường hợp sử dụng cụ thể của tôi, vì việc bổ sung Redis được cho là hỗ trợ khả năng mở rộng trong tương lai. Ý tưởng là truy cập lặp lại dữ liệu gần đây (trong trường hợp của tôi, nếu một người dùng thực hiện truy vấn lặp lại) có thể được Redis phục vụ và lấy một số tải của DB.

Về cơ bản, lược đồ Redis của tôi đã kết thúc giống như việc sao chép chỉ mục của bạn mà bạn đã nêu ở trên. Tôi đã sử dụng tập hợp và sắp xếpSets để tạo "batch/sets" của redis-keys, mỗi khóa được trỏ đến kết quả truy vấn cụ thể được lưu trữ theo một khóa redis-cụ thể. Và trong DB, tôi vẫn có bộ dữ liệu hoàn chỉnh và một chỉ mục.

Nếu tập dữ liệu của bạn phù hợp với RAM, bạn có thể thực hiện "đổ bảng" thành Redis và loại bỏ nhu cầu về MySQL. Tôi có thể thấy điều này làm việc, miễn là bạn có kế hoạch lưu trữ Redis liên tục và lập kế hoạch cho sự tăng trưởng có thể có của dữ liệu của bạn, nếu "bảng" này sẽ phát triển trong tương lai.

Vì vậy, tùy thuộc vào trường hợp sử dụng thực tế của bạn và cách bạn xem Redis phù hợp với ngăn xếp của bạn và tải DB của bạn, không loại trừ khả năng phải thực hiện cả hai tùy chọn bạn đã nêu ở trên (trường hợp của tôi).

Hy vọng điều này sẽ hữu ích!

Các vấn đề liên quan