Redis
 sql >> Cơ Sở Dữ Liệu >  >> NoSQL >> Redis

Tìm hiểu Cơ sở dữ liệu Redis:Lặp lại các phím

Một trong những điều thường gây nhầm lẫn cho người dùng quen thuộc với các cơ sở dữ liệu khác khi họ dùng thử Redis, đó là việc cơ sở dữ liệu thiếu khả năng hiển thị:Không có bộ bảng hoặc bộ sưu tập nào để hãy xem, chỉ là một không gian phím đơn giản, phẳng có thể (có khả năng) có hàng triệu phím. Do đó, khả năng lặp lại rẻ trên không gian chính này trở nên rất quan trọng để làm quen với nội dung cơ sở dữ liệu.

Lặp lại không gian phím Redis có các trường hợp sử dụng quan trọng khác mà bạn cần nghĩ đến là:

  • thu gom rác hoặc dọn dẹp các phím khớp với một mẫu nhất định
  • việc di chuyển dữ liệu và lược đồ sẽ thay đổi hoặc di chuyển một tập hợp khóa nhất định sang cấu trúc dữ liệu khác
  • gỡ lỗi, lấy mẫu dữ liệu, sửa dữ liệu hoặc tìm và sửa tất cả các khóa bị rối bởi một thay đổi gần đây

Trong bài đăng này, chúng ta sẽ đi sâu vào các tùy chọn lặp lại không gian chính khác nhau có sẵn trong Redis.

O (N) Bộ lặp:KEYS

Lệnh Redis KEYS trả về tất cả các khóa trong cơ sở dữ liệu khớp với một mẫu (hoặc tất cả các khóa trong không gian khóa). Các lệnh tương tự để tìm nạp tất cả các trường được lưu trữ trong hàm băm là HGETALL và cho tất cả các lệnh tìm nạp các thành viên của một SMEMBERS. Bản thân các khóa trong Redis được lưu trữ trong từ điển (hay còn gọi là bảng băm). Lệnh KEYS hoạt động bằng cách lặp lại từ điển này và gửi mọi thứ phù hợp với mẫu ra dưới dạng một phản hồi Mảng duy nhất. Các lệnh khác hoạt động tương tự.

Hiệu suất của thao tác như vậy phụ thuộc vào kích thước của tập hợp, tức là O (N). Do đó, việc sử dụng KEYS không được khuyến khích nhiều trong môi trường sản xuất với số lượng lớn các phím. Red là một luồng đơn, bị chặn trong quá trình lặp này, do đó sẽ chặn các hoạt động khác. Do đó, KEYS chỉ nên được sử dụng để gỡ lỗi và các trường hợp đặc biệt khác mà hiệu suất không phải là vấn đề đáng lo ngại (như khi cơ sở dữ liệu được đưa vào ngoại tuyến để áp dụng sửa lỗi dữ liệu). Điều quan trọng khác cần nhớ về thuật toán này là nó gửi tất cả các khóa phù hợp với nhau dưới dạng một phản hồi duy nhất. Điều này có thể cực kỳ thuận tiện khi không gian chìa khóa nhỏ nhưng sẽ tạo ra nhiều vấn đề trên một không gian chìa khóa lớn. Tuy nhiên, KEYS là một lệnh yêu thích của các nhà phát triển trong môi trường nhà phát triển của riêng họ.

KEYS in Action:

 127.0.0.1:6379 [1]> MSET một 1 hai 2 ba 3 bốn 4OK # Tất cả các phím127.0.0.1:6379 [1]> phím * 1) "bốn" 2) "ba" 3) " hai phím "4)" một "# bắt đầu bằng ký tự 't'127.0.0.1:6379 [1]> phím t * 1)" ba "2)" hai "# phím có' ee 'trong chúng127. 0.0.1:6379 [1]> phím * ee * 1) "ba" 

Trình lặp dựa trên con trỏ:QUÉT

Các lệnh SCAN và it’s chị em, SSCAN (cho các tập hợp), HSCAN (cho các hàm băm) và ZSCAN (cho các tập hợp được sắp xếp) cung cấp phương pháp dựa trên con trỏ để lặp qua các cấu trúc dữ liệu Redis. Chúng đã có sẵn trong Redis kể từ 2.8.0.

Các khóa được trả về theo số lần lặp tăng dần với đảm bảo thời gian không đổi cho mỗi lần lặp. Một con trỏ (trường hợp này là một số nguyên) được trả về khi các lần lặp được khởi tạo và một con trỏ được cập nhật được trả về và mỗi lần lặp. Một chu kỳ lặp lại bắt đầu khi con trỏ được đặt thành 0 trong yêu cầu SCAN và kết thúc khi con trỏ được máy chủ trả về bằng 0. Do các sắc thái của kiến ​​trúc Redis và việc triển khai thuật toán con trỏ, đây là một số điểm đặc biệt của phương pháp này:

  • Phép lặp đầy đủ luôn truy xuất tất cả các phần tử có trong bộ sưu tập từ đầu đến cuối của một lần lặp đầy đủ.
  • Việc lặp lại đầy đủ sẽ không bao giờ trả về bất kỳ phần tử nào KHÔNG có trong bộ sưu tập từ đầu đến cuối của một lần lặp đầy đủ.
  • Một phần tử đã cho có thể được trả về nhiều lần. Việc xử lý trường hợp các phần tử bị trùng lặp là tùy thuộc vào ứng dụng
  • Các phần tử không liên tục xuất hiện trong bộ sưu tập trong một lần lặp lại đầy đủ, có thể được trả lại hoặc không:nó là không xác định.
  • Một số phần tử được trả về trong mỗi lần đếm khác nhau và cũng có thể bằng 0. Tuy nhiên, quá trình lặp lại không hoàn tất cho đến khi máy chủ trả về giá trị con trỏ là 0.
  • COUNT tùy chọn có thể được sử dụng để giới hạn số phần tử được trả về trong mỗi lần lặp. Giá trị mặc định là 10. Tuy nhiên, nó chỉ được coi là một gợi ý và không được thực thi trong mọi trường hợp. Giá trị COUNT có thể được thay đổi trong mỗi lần gọi lặp lại.
  • TRẬN ĐẤU tùy chọn cho phép chỉ định các mẫu như lệnh KEYS cho phép.
  • Việc triển khai con trỏ hoàn toàn không có trạng thái ở phía máy chủ. Điều đó cho phép (có khả năng) lặp lại vô hạn bắt đầu song song. Ngoài ra, không có yêu cầu nào về việc đảm bảo rằng quá trình lặp lại tiếp tục cho đến cuối và có thể dừng lại bất cứ lúc nào.

Mặc dù có những đặc điểm riêng biệt, SCAN là một lệnh rất hữu ích và là lệnh phù hợp để chọn các lần lặp lại không gian chính cho hầu hết các trường hợp sử dụng.

SCAN là một lệnh rất hữu ích và là lệnh phù hợp để chọn các lần lặp lại không gian chính trong #RedisClick To Tweet

QUÉT đang hoạt động

 127.0.0.1:6379 [1]> flushdbOK127.0.0.1:6379 [1]> các khóa * (danh sách hoặc tập hợp trống) 127.0.0.1:6379 [1]> gỡ lỗi điền 33OK127.0.0.1:6379 [ 1]> quét 0 ĐẾM 51) Phím "4" 2) 1) ":1" 2) "Phím:9 Phím" 3) ":13 Phím" 4) ":29 Phím" 5) ":23" 127.0. 0,1:6379 [1]> quét 4 1) "42" 2) 1) "phím:24" 2) "phím:28" 3) "phím:18" 4) "phím:16" 5) "phím:12 Phím "6)":2 "7)" phím:6 "8)" phím:31 "9)" phím:27 "10)" phím:19 "127.0.0.1:6379 [1]> quét 421)" 9 Phím "2) 1)":3 "2)" phím:4 "3)" phím:20 "4)" phím:8 "5)" phím:32 "6)" phím:5 "7)" phím:Phím 26 "8)":10 "9)" phím:21 "10)" phím:14 "127.0.0.1:6379 [1]> quét 9 COUNT 1001)" 0 "2) 1)" phím:25 "2 ) "key:30" 3) "key:22" 4) "key:17" 5) "key:15" 6) "key:0" 7) "key:11" 8) "key:7"  

Nâng cao

Thuật toán mà SCAN (và nó là các lệnh chị em) sử dụng để quét qua là một thuật toán hấp dẫn và dẫn đến một số đặc điểm của lệnh mà chúng tôi đã mô tả ở trên. Antirez đã mô tả nó ở cấp độ cao trong bài đăng trên blog của mình và nó được giải thích (tốt hơn một chút) trong các nhận xét phía trên việc triển khai (chức năng dictScan). Mô tả chi tiết sẽ khiến bài đăng này quá dài, vì vậy tôi sẽ cung cấp đủ mô tả để làm rõ hàm ý của nó.

  • Hầu hết các cấu trúc dữ liệu Redis được biểu diễn bên trong dưới dạng từ điển (ít nhất là một phần trong trường hợp các bộ được sắp xếp). Chúng được triển khai dưới dạng bảng băm có kích thước bằng hai lần với chuỗi cho các va chạm. Thách thức khi viết thuật toán lặp lại dựa trên con trỏ ở đây là có thể đối phó với việc tăng và thu nhỏ hàm băm mà không phải hy sinh các nguyên tắc của Redis về tính đơn giản (của API) và tốc độ.
  • SCAN về cơ bản quét một loạt các nhóm băm mỗi lần lặp lại và trả về các phần tử phù hợp với mẫu trong các nhóm đó. Vì nó chỉ xem xét một danh sách cố định của các nhóm nên các lần lặp lại thời gian có thể không trả về giá trị nào.
  • Con trỏ được trả về về cơ bản là một phần bù vào bảng băm đang được lặp lại. Nó giải quyết sự phát triển và thu hẹp của các bảng băm (tức là băm lại) bằng cách thao tác khéo léo các bit cấp cao hơn của phần bù trong khi tăng phần bù cùng với các thuộc tính của bảng băm. Hàm ý từ cách tiếp cận này là các phần tử mới được thêm vào trong quá trình lặp có thể được trả về hoặc không. Tuy nhiên, bản thân con trỏ sẽ không cần khởi động lại khi có thay đổi về kích thước của bảng băm.
  • Bạn phải truy cập một nhóm nhất định chỉ một lần và tất cả các khóa của nó phải được trả lại trong một lần. Điều này một lần nữa để đảm bảo rằng việc thay đổi kích thước băm (tức là băm lại) không làm phức tạp quá trình lặp lại. Tuy nhiên, điều này dẫn đến đối số COUNT không thể thực thi nghiêm túc.
  • Vì cách tiếp cận trên hoàn toàn không có trạng thái ở phía máy chủ, nên về cơ bản nó ngụ ý rằng có thể dừng các lần lặp lại hoặc một số lượng lớn các lần lặp có thể được bắt đầu song song mà không làm tăng mức sử dụng bộ nhớ.

Tóm tắt

Ở cấp độ cao, có hai lựa chọn khả dụng để lặp qua không gian phím Redis là:

  1. Sử dụng KEYS khi không quan tâm đến hiệu suất hoặc khi không gian phím có kích thước hợp lý.
  2. Vào mọi lúc, hãy sử dụng QUÉT.
Để lặp lại không gian phím #Redis, hãy sử dụng KEYS khi hiệu suất không phải là mối quan tâm, nếu không, hãy sử dụng SCANClick To Tweet

Bạn có biết hiện chúng tôi hỗ trợ lưu trữ cho Redis ™ * không? Nhận dịch vụ lưu trữ được quản lý đầy đủ cho Redis ™ để đảm bảo an toàn cho tài khoản đám mây của riêng bạn và tận dụng các khoản tín dụng AWS / Azure để triển khai Redis ™ của bạn.


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Có bất kỳ giá trị đề xuất nào của COUNT cho lệnh SCAN / HSCAN trong REDIS không?

  2. Đồng thời Redis INCR

  3. Thư viện Redis tốt nhất cho Java

  4. Làm thế nào để nhận các sự kiện hết hạn của Redis với nút?

  5. NodeJS - kết nối an toàn với máy chủ redis bên ngoài