Xóa tất cả các mục nhập trong danh sách Redis


81

Giả sử bạn có kiểu dữ liệu LIST trong Redis. Làm thế nào để bạn xóa tất cả các mục nhập của nó? Tôi đã thử điều này rồi:

LTRIM key 0 0
LTRIM key -1 0

Cả hai đều để lại phần tử đầu tiên. Điều này sẽ để lại tất cả các phần tử:

LTRIM key 0 -1

Tôi không thấy một lệnh riêng biệt để làm trống hoàn toàn một danh sách.


2
@DavidJames: Hãy coi đó là một cách đánh vần khác của "foo". Tôi đang theo quy ước được sử dụng trong tài liệu hướng dẫn riêng Redis của: redis.io/commands
Paul A Jungwirth

Có, trong redis, tất cả các cấu trúc dữ liệu đều là khóa. Điều đó không có nghĩa là 'key' hữu ích trong một ví dụ. Tôi nghĩ là hoàn toàn ngược lại. Sử dụng mylistsẽ làm cho câu hỏi của bạn rõ ràng hơn. Ví dụ, redis.io/commands/ltrim viết: LTRIM mylist 1 -1. Trang bạn trích dẫn là một tham chiếu lệnh và không nên được coi là "quy ước" để đưa ra các ví dụ tốt.
David J.

Câu trả lời:


150

Xóa khóa và điều đó sẽ xóa tất cả các mục. Không có danh sách tương tự như không có bất kỳ mục nào trong đó. Redis sẽ không đưa ra bất kỳ ngoại lệ nào khi bạn cố gắng truy cập vào một khóa không tồn tại.

DEL key

Đây là một số nhật ký bảng điều khiển.

redis> KEYS *
(danh sách hoặc tập hợp trống)
redis> LPUSH tên John
(số nguyên) 1
redis> LPUSH tên Mary
(số nguyên) 2
redis> LPUSH tên Alice
(số nguyên) 3
redis> Tên LLEN
(số nguyên) 3
redis> LRANGE tên 0 2
1) "Alice"
2) "Mary"
3) "John"
redis> tên DEL
(số nguyên) 1
redis> Tên LLEN
(số nguyên) 0
redis> LRANGE tên 0 2
(danh sách hoặc tập hợp trống)

Có cách nào để làm điều đó trong một hoạt động nguyên tử không? (cả "tên LRANGE 0 2" và "tên DEL")
refaelos 14/1013

1
Một điều, sử dụng Del may create extra overhead, Độ phức tạp thời gian: O (N) trong đó N là số khóa sẽ bị xóa. Khi một khóa cần xóa giữ một giá trị khác với một chuỗi, độ phức tạp riêng cho khóa này là O (M) trong đó M là số phần tử trong danh sách, tập hợp, tập hợp đã sắp xếp hoặc băm. Loại bỏ một khóa duy nhất chứa giá trị chuỗi là O (1). Tài liệu
ChewOnThis_Trident

1
phương pháp này nguy hiểm vì nó cũng loại bỏ ttl của chìa khóa
Saitama

16

Bạn có thể loại bỏ tất cả các giá trị trong Danh sách chỉ khi các Danh sách có nhiều hơn một giá trị

LTRIM key -1 0

Thí dụ:

redis 127.0.0.1:6379> RPUSH mylist four 1 3 1
(integer) 4
redis 127.0.0.1:6379> KEYS *
1) "newKey"
2) "firstHash"
3) "secondList"
4) "test4"
5) "firstList"
6) "mylist"
redis 127.0.0.1:6379> LTRIM mylist -1 0
OK
redis 127.0.0.1:6379> LRANGE mylist 0 -1
(empty list or set)
redis 127.0.0.1:6379> KEYS *
1) "newKey"
2) "firstHash"
3) "secondList"
4) "test4"
5) "firstList"

Nhưng nếu Danh sách chỉ có một giá trị, bạn phải sử dụng

DEL key 

4

Chỉ cần sử dụng LTRIM . ... Aaa và phép thuật ở đây là sử dụng start lớn hơn end .

LTRIM key 99 0

Và bùm! có toàn bộ danh sách các phần tử. Chỉ * phập phồng * ngay trước mắt bạn !! Không có dư lượng còn lại, và hoàn toàn không có câu hỏi.

Lưu ý: Điều này sẽ làm cho khóa bị "xóa" ( như đã xóa ) như được mô tả ở đây

... nếu bắt đầu lớn hơn cuối danh sách, hoặc bắt đầu> kết thúc, kết quả sẽ là danh sách trống (khiến khóa bị xóa).


Có lý do gì khiến bạn thích điều này hơn DEL keynhư trong câu trả lời của @ Anurag không? Có vẻ như chúng có tác dụng tương tự.
Paul A Jungwirth,

Nói thẳng ra là không, không có thời gian để xem xét các điểm chuẩn, chỉ đang đọc tài liệu khi tôi phát hiện ra phương pháp trên, tôi nghĩ cũng có thể đề cập đến nó.
Mohd Abdul Mujib

1
Được rồi, cảm ơn! Được ủng hộ vì tôi có thể tưởng tượng các thuật toán sử dụng LTRIMnhiều lần và thật tốt khi biết điều gì sẽ xảy ra khi thông số thứ hai giảm xuống dưới thông số đầu tiên. Tôi có thể thấy cách khai thác hành vi này có thể làm cho một số mã trở nên thanh lịch hơn.
Paul A Jungwirth,

0

câu trả lời được chấp nhận là sai. giả sử tôi có

redis 127.0.0.1:6379> KEYS * 
1) "newKey" 
2) "firstHash" 
3) "secondList" 
4) "test4" 
5) "firstList" 
6) "mylist" 

để sử dụng ví dụ của ahmed, điều này thực sự đúng. bây giờ, nếu tôi làm:

DEL 'test4'

tôi kết thúc với:

1) "newKey" 
2) "firstHash" 
3) "secondList" 
4) "firstList" 
5) "mylist"` 

vì vậy, tôi đã không xóa tất cả các mục nhập khỏi danh sách 'test4', tôi đã xóa chính test4 . không giống nhau. không có gì. tôi có một ứng dụng nhỏ trong đó các khóa danh sách được tính toán từ một số dữ liệu (tốt, không phải là tất cả?), những danh sách đó đôi khi bị xóa, nhưng ngữ nghĩa của danh sách trống và danh sách không tồn tại rất khác nhau. vì vậy, không, tôi không muốn DEL 'myhashes', tôi chỉ muốn xóa tất cả các mục nhập.

Hãy cẩn thận, oh những người lang thang ở đây.


Nếu bạn nhìn vào trang được trích dẫn bên dưới, bạn sẽ thấy rằng trên thực tế, ngữ nghĩa là như nhau! Được lấy từ :The LPUSH command inserts a new element on the head, while RPUSH inserts a new element on the tail. A new list is created when one of this operations is performed against an empty key. Similarly the key is removed from the key space if a list operation will empty the list. These are very handy semantics since all the list commands will behave exactly like they were called with an empty list if called with a non-existing key as argument.
Dominic

từ miệng ngựa: "Tương tự, khóa được xóa khỏi không gian khóa nếu một thao tác danh sách sẽ làm trống danh sách." vậy, có phải là {[], [], []} === {[]} không? không phải cho tôi. tôi đoán chúng tôi đang ở trong không gian tôpô khác nhau .... :)
deimosaffair

Câu hỏi ban đầu là làm thế nào để xóa toàn bộ Danh sách trong redis. vì vậy nếu bạn xóa khóa hoặc xóa tất cả các mục nhập và để khóa tự động bị redis xóa sẽ cho kết quả tương tự. Vì vậy, tôi không chắc ý của bạn với {[], [], []} === {[]}.
Dominic

Xóa phần tử cuối cùng khỏi danh sách tương đương với xóa khóa. Liên kết này thậm chí tương tự đối với LIST (được thử nghiệm với RPOPLPUSH) bennadel.com/blog/…
Kanagavelu Sugumar

0

Tôi đã thử điều này và nó phù hợp với tôi. Chỉ cần thay đổi myList cho tên danh sách của bạn và thực thi nó redis-cli KEYS "myList:*" | xargs redis-cli DEL


1
Mặc dù công trình này, keyslà một hoạt động đặc biệt nặng nhọc có liên quan đến phân tích tất cả các chìa khóa duy nhất trong cơ sở dữ liệu của bạn, mà là khá cần thiết trong trường hợp này, hay đúng hơn là trong nhiều trường hợp
Adalcar

0

Đây có thể là một phản hồi muộn nhưng tôi sẽ gắn nó ở đây để đề phòng trường hợp ai đó vẫn cần chức năng đó.

Câu trả lời ngắn

ltrim mylist 0 - (n + 1) trong đó mylist là khóa và n là độ dài của mylist.

Câu trả lời dài

Cách hoạt động của ltrim là, nó lấy hai chỉ số và trả về các phần tử nằm giữa chúng bao gồm cả các chỉ số.

Danh sách Ltrim startIndex endIndex

Ví dụ giả sử chúng ta có một danh sách redis với key mylist chứa 10 mục:

ltrim mylist 0 5 sẽ cắt danh sách thành các phần tử bắt đầu từ chỉ mục 0 đến chỉ mục 5. Và loại bỏ những phần tử nằm ngoài phạm vi đó.

May mắn thay, hoạt động danh sách redis hỗ trợ lập chỉ mục tiêu cực, điều này tỏ ra cực kỳ hữu ích trong một số tình huống. Điển hình là khi bạn không biết độ dài của danh sách.

-1 đề cập đến phần tử cuối cùng, - 2 phần tử áp chót, v.v. Và (-n) là phần tử đầu tiên.

Các chỉ mục ngoài phạm vi không có hại. Nếu chỉ mục cuối lớn hơn độ dài của danh sách, redis coi nó bằng chỉ mục cuối cùng.

Đây là lý do tại sao ltrim mylist 0, - (n +1) xóa danh sách. Nó làm như vậy vì (-n) tương đương với chỉ số 0. Việc thêm 1 vào nó sẽ không để lại phần tử nào trong phạm vi đó vì nó sẽ nằm trước phần tử đầu tiên.


Cảm ơn vì đã chia sẻ những hiểu biết của bạn. Như một phần mở rộng cho câu trả lời của bạn, bạn có thể chỉ cần cung cấp một giá trị N đủ lớn hơn danh sách để đảm bảo rằng tất cả các mục đều bị xóa. Ví dụ ltrim mylist 0 -99999.
Dave Johnson
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.