Thứ năm, 26/09/2019 | 00:00 GMT+7

Cách quản lý bộ trong Redis

Redis là một repodata key-value open-souce trong bộ nhớ. Tập hợp trong Redis là tập hợp các chuỗi được lưu trữ tại một khóa nhất định. Khi được giữ trong một tập hợp, một giá trị bản ghi riêng lẻ được coi là một thành viên . Không giống như danh sách, các tập hợp không có thứ tự và không cho phép các giá trị lặp lại.

Hướng dẫn này giải thích cách tạo tập hợp, truy xuất và xóa thành viên cũng như so sánh các thành viên của các tập hợp khác nhau.

Cách sử dụng Hướng dẫn này

Hướng dẫn này được viết như một bảng lừa đảo với các ví dụ riêng. Ta khuyến khích bạn chuyển đến bất kỳ phần nào có liên quan đến nhiệm vụ bạn đang cố gắng hoàn thành.

Các lệnh hiển thị trong hướng dẫn này đã được thử nghiệm trên server Ubuntu 18.04 chạy Redis version 4.0.9 . Để cài đặt một môi trường tương tự, bạn có thể làm theo Bước 1 trong hướng dẫn của ta về Cách cài đặt và bảo mật Redis trên Ubuntu 18.04 . Ta sẽ chứng minh các lệnh này hoạt động như thế nào bằng cách chạy chúng với redis-cli , giao diện dòng lệnh Redis. Lưu ý nếu bạn đang sử dụng một giao diện Redis khác - ví dụ như Redli - kết quả kết quả chính xác của một số lệnh nhất định có thể khác nhau.

Ngoài ra, bạn có thể cung cấp một version database Redis được quản lý để kiểm tra các lệnh này, nhưng lưu ý tùy thuộc vào mức độ kiểm soát được nhà cung cấp database của bạn cho phép, một số lệnh trong hướng dẫn này có thể không hoạt động như được mô tả. Để cung cấp Dịch vụ database DigitalOcean, hãy làm theo tài liệu sản phẩm Dịch vụ database của ta . Sau đó, bạn phải cài đặt Redli hoặc cài đặt tunnel TLS để kết nối với Dịch vụ database qua TLS.

Tạo bộ

Lệnh sadd cho phép bạn tạo một tập hợp và thêm một hoặc nhiều thành viên vào tập hợp đó. Ví dụ sau sẽ tạo một tập hợp tại khóa có tên key_horror với các thành viên "Frankenstein""Godzilla" :

  • sadd key_horror "Frankenstein" "Godzilla"

Nếu thành công, sadd sẽ trả về một số nguyên hiển thị số thành viên mà nó đã thêm vào tập hợp:

Output
(integer) 2

Nếu bạn thử thêm các thành viên của một tập hợp vào một khóa đã giữ một giá trị không phải là tập hợp, nó sẽ trả về một lỗi. Lệnh đầu tiên trong khối này tạo một danh sách có tên key_action với một phần tử, "Shaft" . Lệnh tiếp theo cố gắng thêm một thành viên đã đặt, "Shane" , vào danh sách, nhưng điều này tạo ra lỗi do các kiểu dữ liệu xung đột:

  • rpush key_action "Shaft"
  • sadd key_action "Shane"
Output
(error) WRONGTYPE Operation against a key holding the wrong kind of value

Lưu ý các bộ không cho phép nhiều hơn một lần xuất hiện của cùng một thành viên:

  • sadd key_comedy "It's" "A" "Mad" "Mad" "Mad" "Mad" "Mad" "World"
Output
(integer) 4

Mặc dù lệnh sadd này chỉ định tám thành viên, nhưng nó loại bỏ bốn trong số các thành viên "Mad" trùng lặp dẫn đến kích thước được đặt là 4.

Lấy các thành viên từ Bộ

Trong phần này, ta sẽ xem xét một số lệnh Redis trả về thông tin về các thành viên được giữ trong một tập hợp. Để thực hành các lệnh được nêu ở đây, hãy chạy lệnh sau, lệnh này sẽ tạo một tập hợp với sáu thành viên tại một khóa được gọi là key_stooges :

  • sadd key_stooges "Moe" "Larry" "Curly" "Shemp" "Joe" "Curly Joe"

Để trả lại mọi thành viên từ một tập hợp, hãy chạy lệnh smembers theo sau là khóa bạn muốn kiểm tra:

  • smembers key_stooges
Output
1) "Curly" 2) "Moe" 3) "Larry" 4) "Shemp" 5) "Curly Joe" 6) "Joe"

Để kiểm tra xem một giá trị cụ thể có phải là thành viên của một tập hợp hay không, hãy sử dụng lệnh sismember :

  • sismember key_stooges "Harpo"

Nếu phần tử "Harpo" là thành viên của bộ key_stooges , sismember sẽ trả về 1 . Nếu không, nó sẽ trả về 0 :

Output
(integer) 0

Để xem có bao nhiêu thành viên trong một tập hợp nhất định (nói cách khác, để tìm bản số của một tập hợp nhất định), hãy chạy scard :

  • scard key_stooges
Output
(integer) 6

Để trả về một phần tử ngẫu nhiên từ một tập hợp, hãy chạy srandmember :

  • srandmember key_stooges
Output
"Larry"

Để trả về nhiều phần tử ngẫu nhiên, khác biệt từ một tập hợp, bạn có thể làm theo lệnh srandmember với số phần tử bạn muốn lấy:

  • srandmember key_stooges 3
Output
1) "Larry" 2) "Moe" 3) "Curly Joe"

Nếu bạn chuyển một số âm cho srandmember , lệnh được phép trả về cùng một phần tử nhiều lần:

  • srandmember key_stooges -3
Output
1) "Shemp" 2) "Curly Joe" 3) "Curly Joe"

Hàm phần tử ngẫu nhiên được sử dụng trong srandmember không phải là ngẫu nhiên hoàn toàn, mặc dù hiệu suất của nó được cải thiện trong các tập dữ liệu lớn hơn. Xem tài liệu chính thức của lệnh để biết thêm chi tiết.

Xóa thành viên khỏi group

Redis đi kèm với ba lệnh được sử dụng để loại bỏ các thành viên khỏi một tập hợp: spop , sremsmove .

spop chọn ngẫu nhiên một số lượng thành viên được chỉ định từ một tập hợp và trả về chúng, tương tự như srandmember , nhưng sau đó xóa chúng khỏi tập hợp. Nó chấp nhận tên của khóa chứa một tập hợp và số thành viên cần xóa khỏi tập hợp làm đối số. Nếu bạn không chỉ định một số, spop sẽ mặc định trả về và xóa một giá trị duy nhất.

Lệnh ví dụ sau sẽ xóa và trả về hai phần tử được chọn ngẫu nhiên từ tập hợp key_stooges được tạo trong phần trước:

  • spop key_stooges 2
Output
1) "Shemp" 2) "Larry"

srem cho phép bạn xóa một hoặc nhiều thành viên cụ thể khỏi một tập hợp, thay vì những thành viên ngẫu nhiên:

  • srem key_stooges "Joe" "Curly Joe"

Thay vì trả về các thành viên đã bị xóa khỏi tập hợp, srem trả về một số nguyên cho biết có bao nhiêu thành viên đã bị xóa:

Output
(integer) 2

Sử dụng smove để di chuyển một thành viên từ group này sang group khác. Lệnh này chấp nhận các đối số là tập nguồn, tập đích và thành viên cần di chuyển, theo thứ tự đó. Lưu ý smove chỉ cho phép bạn di chuyển một thành viên tại một thời điểm:

  • smove key_stooges key_jambands "Moe"

Nếu lệnh di chuyển thành viên thành công, nó sẽ trả về (integer) 1 :

Output
(integer) 1

Nếu smove thất bại, nó sẽ thay trở lại (integer) 0 . Lưu ý nếu khóa đích chưa tồn tại, thì smove sẽ tạo nó trước khi chuyển thành viên vào đó.

So sánh các bộ

Redis cũng cung cấp một số lệnh để tìm sự khác biệt và giống nhau giữa các tập hợp. Để chứng minh cách thức hoạt động của những thứ này, phần này sẽ đề cập đến ba bộ được đặt tên là presidents , kingsbeatles . Nếu bạn muốn tự mình thử các lệnh trong phần này, hãy tạo các tập hợp này và điền chúng bằng các lệnh sadd sau:

  • sadd presidents "George" "John" "Thomas" "James"
  • sadd kings "Edward" "Henry" "John" "James" "George"
  • sadd beatles "John" "George" "Paul" "Ringo"

sinter so sánh các tập hợp khác nhau và trả về giao điểm của tập hợp hoặc các giá trị xuất hiện trong mọi tập hợp:

  • sinter presidents kings beatles
Output
1) "John" 2) "George"

sinterstore thực hiện một chức năng tương tự, nhưng thay vì trả về các phần tử giao nhau, nó tạo một tập hợp mới tại đích được chỉ định chứa các phần tử giao nhau này. Lưu ý nếu đích đã tồn tại, sinterstore sẽ overrides lên nội dung của nó:

  • sinterstore new_set presidents kings beatles
  • smembers new_set
Output
1) "John" 2) "George"

sdiff trả về sự khác biệt tập hợp - các thành viên là kết quả của sự khác biệt của tập hợp được chỉ định đầu tiên từ mỗi tập hợp sau:

  • sdiff presidents kings beatles
Output
1) "Thomas"

Nói cách khác, sdiff xem xét từng thành viên trong tập hợp đầu tiên và sau đó so sánh chúng với các thành viên trong mỗi tập hợp kế tiếp. Bất kỳ thành viên nào trong tập hợp đầu tiên cũng xuất hiện trong các tập hợp sau sẽ bị loại bỏ và sdiff trả về các thành viên còn lại. Hãy coi nó như việc loại bỏ các thành viên của các tập hợp tiếp theo khỏi tập hợp đầu tiên.

sdiffstore thực hiện một chức năng tương tự như sdiff , nhưng thay vì trả về sự khác biệt đã đặt, nó tạo ra một tập hợp mới tại một điểm đến nhất định, chứa sự khác biệt đã đặt:

  • sdiffstore new_set beatles kings presidents
  • smembers new_set
Output
1) "Paul" 2) "Ringo"

Giống như sinterstore , sdiffstore sẽ overrides lên khóa đích nếu nó đã tồn tại.

sunion trả về tập hợp liên hiệp hoặc tập hợp chứa mọi thành viên của mọi tập hợp bạn chỉ định:

  • sunion presidents kings beatles
Output
1) "Thomas" 2) "George" 3) "Paul" 4) "Henry" 5) "James" 6) "Edward" 7) "John" 8) "Ringo"

sunion xử lý các kết quả giống như một tập hợp mới trong đó nó chỉ cho phép một lần xuất hiện của bất kỳ thành viên nhất định nào.

sunionstore thực hiện một chức năng tương tự, nhưng tạo một tập hợp mới chứa liên hợp tập hợp tại một điểm đến nhất định thay vì chỉ trả về kết quả:

  • sunionstore new_set presidents kings beatles
Output
(integer) 8

Như với sinterstoresdiffstore , sunionstore sẽ overrides lên khóa đích nếu nó đã tồn tại.

Kết luận

Hướng dẫn này trình bày chi tiết một số lệnh được sử dụng để tạo và quản lý các tập hợp trong Redis. Nếu có các lệnh, đối số hoặc quy trình liên quan khác mà bạn muốn xem được nêu trong hướng dẫn này, vui lòng hỏi hoặc đưa ra đề xuất trong phần comment bên dưới.

Để biết thêm thông tin về các lệnh Redis, hãy xem loạt bài hướng dẫn của ta về Cách quản lý database Redis .


Tags:

Các tin liên quan

Cách quản lý database và khóa Redis
2019-09-20
Cách quản lý danh sách trong Redis
2019-09-20
Cách quản lý hàm băm trong Redis
2019-09-20
Cách khắc phục sự cố trong Redis
2019-09-20
Cách quản lý chuỗi trong Redis
2019-09-20
Cách quản lý danh sách trong Redis
2019-09-20
Cách đánh giá hiệu suất của server Redis trên Ubuntu 18.04
2019-08-16
Cách cài đặt và bảo mật Redis trên Debian 10
2019-07-16
Cách cài đặt và bảo mật Redis trên Debian 9
2018-09-05
Cách cài đặt Redis từ nguồn trên Ubuntu 18.04
2018-06-27