2012-02-16 44 views

Trả lời

54

lựa chọn của bạn như sau:

  1. Sử dụng LREM và thay thế nó nếu nó đã được tìm thấy.
  2. Duy trì riêng biệt SET kết hợp với bạn LIST
  3. Looping qua LIST cho đến khi bạn tìm ra mục hoặc đạt được kết thúc.

Danh sách redis được triển khai dưới dạng http://en.wikipedia.org/wiki/Linked_list, do đó giới hạn.

Tôi nghĩ rằng tùy chọn tốt nhất của bạn là duy trì một bản sao SET. Đây là những gì tôi có xu hướng làm. Chỉ cần nghĩ về nó như một chỉ số phụ. Bất kể, hãy đảm bảo hành động của bạn là nguyên tử với các tập lệnh MULTI - EXEC hoặc Lua.

+1

+1 cho MULTI-EXEC – maximus

+0

@fritzy nó sẽ có thể xây dựng thêm về cách thực hiện SET/LIST hoặc chỉ cho tôi một nơi nào đó, cảm ơn. –

+0

Vì cả LREM và SREM đều là O (N) thì có lẽ tốt hơn là không có một bộ riêng biệt (trừ khi, tất nhiên, bạn định xóa toàn bộ tập hợp chứ không phải từng mục). –

4

Không, không có cách nào để kiểm tra xem danh sách redis có chứa giá trị đã cho hay không. Xem Redis list commands để tham khảo.

Tôi đoán bạn có thể sử dụng LREM để (cố gắng) xóa giá trị và kiểm tra giá trị trả lại để xem liệu giá trị đó có bị xóa hay không. Nhưng sau đó bạn sẽ phải đặt nó trở lại, và điều này có vẻ như không chắc chắn. Có thể có một số giải pháp tốt hơn cho vấn đề của bạn - bạn đang cố gắng làm gì?

+1

hi linus, tôi đoán anh ấy hỏi liệu một "khóa" có tồn tại hay không. không phải là một giá trị nhất định như bạn giả định – zotherstupidguy

+0

@babydudecoder Ông nói rằng ông muốn kiểm tra một chìa khóa đã tồn tại trong một danh sách redis. tôi nghĩ rằng chìa khóa của anh ta là một giá trị của danh sách redis. –

+0

@Harry Có vẻ như trong hầu hết các trường hợp, anh ta có thể thay thế danh sách cho 'hset' - và sử dụng' setnx', điều này không hoàn toàn giống với danh sách thực, nhưng bảng băm thường nhanh hơn. – user3467349

21

Lists cho phép trùng lặp nhưng không cung cấp một cách đơn giản để kiểm tra sự tồn tại và như @Fritzy khuyên, bạn có cần phải:

  • Tạo nhiều hoạt động (loại bỏ sau đó thêm một lần nữa được tìm thấy) để kiểm tra đơn giản = Chi phí trong thời gian
  • Duy trì một bộ riêng biệt = Chi phí trong bộ nhớ

tôi ngạc nhiên không ai khuyên bạn sử dụng hoặc là một Hash Table hoặc một Sắp xếp Set trong đó kết hợp những ưu điểm của phép tráo (bằng cách lưu trữ số lượng các yếu tố như giá trị - Hash Table, hoặc điểm - Sắp xếp Set) và thành viên chỉ mục bởi thiên nhiên của bảng/bộ băm.


Hash Table

Để kiểm tra sự tồn tại một trọng điểm, sử dụng lệnh HGET. Nó trả về một câu trả lời nil nếu thành viên được chỉ định không tồn tại.

Để thêm thành viên mới, chỉ cần sử dụng HINCRBY sẽ cập nhật giá trị (ví dụ: số thành phần có tên thành viên) hoặc tạo thành viên mới nếu nó không tồn tại.


Sắp xếp Set

Để kiểm tra sự tồn tại một trọng điểm, sử dụng một trong ba lệnh sau:

  • ZSCORE
  • ZRANK
  • ZREVRANK

Họ trả về câu trả lời nil nếu thành viên được chỉ định không tồn tại.

Để thêm thành viên mới, chỉ cần sử dụng ZINCRBY sẽ cập nhật điểm (ví dụ: số thành phần có tên thành viên) hoặc tạo thành viên mới nếu nó không tồn tại.


Tóm lại: Sắp xếp Thiết hoặc Bàn Hash phép bạn thực hiện tất cả các hoạt động với yêu cầu của bạn với một lệnh đơn.

+0

Tuy nhiên, nếu ai đó sử dụng tập hợp được sắp xếp, không có cách nào để biết chính xác những trường hợp này có giá trị bao nhiêu trong danh sách. Nếu tôi có giá trị "Hello World" tại các vị trí tùy ý trong một danh sách, thì chỉ lưu trữ số lần nó xuất hiện sẽ không giúp tôi xác định vị trí các yếu tố xung quanh của những trường hợp đó. –

+0

@AnuraagVaidya Đây là một vấn đề khác, không liên quan trong bối cảnh hiện tại của việc trả lời câu hỏi đã được hỏi. –

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