2010-10-28 3 views
8

Chúng tôi đang sử dụng Redis làm máy chủ lưu trữ bộ nhớ cache và thường phải xử lý danh sách bộ nhớ đệm. Khi chúng ta cache các đối tượng đơn giản, chúng ta thực hiện GET và Redis sẽ trả về null nếu đối tượng không tồn tại và chúng ta sẽ biết rằng đối tượng không được lưu trữ và phải được nạp từ cơ sở dữ liệu.Thực hành tốt nhất cho danh sách và thiết lập xử lý trong Redis là gì?

Nhưng cách chúng tôi xử lý tốt nhất cho cùng một danh sách - danh sách trống có thể là giá trị hợp lệ. Chúng ta có cần gọi EXISTS để kiểm tra xem danh sách có tồn tại không (nhưng thực hiện cuộc gọi 2 hoạt động thay vì một) hoặc có ai đó có ý tưởng tốt hơn về cách xử lý kịch bản này không?

/Cảm ơn

Trả lời

9

Nếu bạn hoàn toàn cần làm điều đó, khi danh sách được tạo, bạn có thể đẩy "phần tử gửi" làm phần tử đầu tiên không bao giờ bị xóa. Để làm điều này một cách nguyên tử, bạn có thể sử dụng MULTI/EXEC/WATCH, nhưng đồng hồ chỉ có trong Redis 2.2 hiện đang là bản xem trước (ngay cả khi khá ổn định, bạn có thể lấy nó từ nhánh master github).

Tôi nghĩ rằng trong trường hợp sử dụng của bạn, bạn cũng có thể muốn RPUSHX và LPUSHX, sẽ thúc đẩy nguyên tử đối với một danh sách chỉ khi nó đã tồn tại.

Lưu ý rằng kể từ khi Redis 2.2 tồn tại phương tiện để có yếu tố ít nhất 1 cho một danh sách, như các danh sách đó sẽ đạt zero yếu tố được tự động xóa, vì nhiều lý do tốt;)

+1

Sau khi xem xét một số chi tiết, tôi nghĩ giải pháp của tôi sẽ đơn giản là không tự động tái tạo danh sách một cách nhanh chóng. Mối quan tâm của tôi là như sau: Tôi chèn một bản ghi vào cơ sở dữ liệu và thêm vào danh sách Redis cùng một lúc. Nếu Redis sẽ xảy ra sự cố (và mất có lẽ là giây cuối cùng của giao dịch) - làm thế nào tôi có thể đến một trạng thái nơi cơ sở dữ liệu và Redis được đồng bộ một lần nữa. Tôi nghĩ rằng tôi đã hạ cánh trên một giải pháp có nghĩa là nếu Redis sẽ xảy ra sụp đổ, tình hình sẽ phải được phục hồi bằng tay bằng cách tái đồng bộ danh sách từ cơ sở dữ liệu. Oh - và cảm ơn vì công việc tốt đẹp :-) – Micael

+0

+1 là câu trả lời đúng. Nhưng bạn có thể chỉ cho tôi "lý do chính đáng" của bạn không? Các bộ và danh sách trống khác với các bộ và danh sách không tồn tại. – Crisfole

-1

Nếu bạn đang sử dụng php, tôi sẽ gán giá trị trả về một biến và sau đó kiểm tra nếu nó là một mảng. (Đây là cách nó hoạt động bằng cách sử dụng thư viện Predis)

$res = $redis->get('Key'); 
if(is_array($res)) 
    do code here 
3

Thật không may, danh sách/thiết lập lệnh thu hồi như LRANGE và SMEMBERS dường như không phân biệt giữa một danh sách trống/thiết lập và một danh sách không tồn tại/thiết lập.

Vì vậy, nếu bạn hoàn toàn cần phải phân biệt giữa hai trường hợp, tôi đoán bạn sẽ cần phải thực hiện một EXISTS trước. Hãy thử pipelining lệnh của bạn cho hiệu suất tốt hơn. Hầu hết các thư viện khách Redis đều hỗ trợ pipelining.

Hoặc bạn có thể xem xét lại chiến lược lưu vào bộ nhớ cache của mình để bạn không cần phân biệt chúng.

+0

Kể từ redis v2.0 đối xử với danh sách rỗng , SETs, ZSETs và HASHE giống như cách không tồn tại. Khi bạn đã xóa tất cả các phần tử khỏi danh sách, lệnh EXISTS sẽ trả về false! –

+0

@Ludger Sprenker Wow, tôi không biết điều đó! Tôi chỉ thử nghiệm điều này với 1.2.6 trước đây. Chiến lược bộ nhớ đệm của Micael. – kijin