Thứ sáu, 20/09/2019 | 00:00 GMT+7

Cách quản lý cơ sở dữ liệu và khóa Redis

Redis là một repodata key-value open-souce trong bộ nhớ. Kho dữ liệu key-value là một loại database NoSQL trong đó các khóa đóng role là số nhận dạng duy nhất cho các giá trị liên quan của chúng. Bất kỳ cá thể Redis đã cho nào đều bao gồm một số database , mỗi database có thể chứa nhiều khóa khác nhau của nhiều kiểu dữ liệu .

Trong hướng dẫn này, ta sẽ xem xét cách chọn database , di chuyển khóa giữa các database , quản lý và xóa khóa.

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.

Quản lý database

Ngoài ra, một version Redis hỗ trợ 16 database logic. Các database này được tách biệt với nhau một cách hiệu quả và khi bạn chạy một lệnh trong một database , nó không ảnh hưởng đến bất kỳ dữ liệu nào được lưu trữ trong các database khác trong version Redis của bạn.

Database Redis được đánh số từ 0 đến 15 và theo mặc định, bạn kết nối với database 0 khi bạn kết nối với version Redis của bạn . Tuy nhiên, bạn có thể thay đổi database đang sử dụng bằng lệnh select sau khi kết nối:

  • select 15

Nếu bạn đã chọn một database khác 0 , nó sẽ được phản ánh trong dấu nhắc redis-cli :

  •  

Để hoán đổi tất cả dữ liệu được giữ trong một database với dữ liệu được giữ trong một database khác, hãy sử dụng lệnh swapdb . Ví dụ sau sẽ hoán đổi dữ liệu được giữ trong database 6 với dữ liệu trong database 8 và bất kỳ client nào được kết nối với một trong hai database sẽ có thể thấy các thay đổi ngay lập tức:

  • swapdb 6 8

swapdb sẽ trả về OK nếu hoán đổi thành công.

Nếu bạn muốn di chuyển một khóa sang một version Redis khác, bạn có thể chạy migrate . Lệnh này đảm bảo khóa tồn tại trên cá thể đích trước khi xóa nó khỏi cá thể nguồn. Khi bạn chạy migrate , lệnh phải bao gồm các phần tử sau theo thứ tự này:

  • Tên server hoặc địa chỉ IP của database đích
  • Số cổng của database đích
  • Tên của khóa bạn muốn di chuyển
  • Số database nơi bạn muốn lưu khóa trên version đích
  • Thời gian chờ, tính bằng mili giây, xác định lượng thời gian giao tiếp không tải tối đa giữa hai máy. Lưu ý đây không phải là giới hạn thời gian cho hoạt động, chỉ là hoạt động phải luôn đạt được một số tiến độ trong repository ảng thời gian xác định

Để minh họa:

  • migrate 203.0.113.0 6379 key_1 7 8000

Ngoài ra, migrate cho phép các tùy chọn sau mà bạn có thể thêm sau đối số thời gian chờ:

  • COPY : Chỉ định rằng khóa không được xóa khỏi version nguồn
  • REPLACE : Chỉ định rằng nếu khóa đã tồn tại trên đích, hoạt động migrate sẽ xóa và thay thế nó
  • KEYS : Thay vì cung cấp một khóa cụ thể để di chuyển, bạn có thể nhập một chuỗi trống ( "" ) và sau đó sử dụng cú pháp từ lệnh keys để di chuyển bất kỳ khóa nào phù hợp với một mẫu. Để biết thêm thông tin về cách hoạt động của keys , hãy xem hướng dẫn của ta về Cách khắc phục sự cố trong Redis .

Quản lý các phím

Có một số lệnh Redis hữu ích để quản lý các khóa dù chúng nắm giữ loại dữ liệu nào. Ta sẽ xem xét một vài trong số này trong phần này.

rename sẽ đổi tên khóa được chỉ định. Nếu thành công, nó sẽ trả về OK :

  • rename old_key new_key

Bạn có thể sử dụng randomkey để trả về một khóa ngẫu nhiên từ database hiện đang được chọn:

  • randomkey
Output
"any_key"

Sử dụng type để xác định loại dữ liệu mà khóa đã cho nắm giữ. Đầu ra của lệnh này có thể là string , list , hash , set , zset hoặc stream :

  • type key_1
Output
"string"

Nếu khóa được chỉ định không tồn tại, thay vào đó, type sẽ none trả về.

Bạn có thể di chuyển một private key lẻ sang database khác trong version Redis của bạn bằng lệnh move . move lấy tên của một khóa và database nơi bạn muốn di chuyển khóa làm đối số. Ví dụ: để di chuyển khóa key_1 sang database 8 , bạn sẽ chạy như sau:

  • move key_1 8

move sẽ trở lại OK nếu di chuyển khóa thành công.

Xóa các phím

Để xóa một hoặc nhiều khóa của bất kỳ kiểu dữ liệu nào, hãy sử dụng lệnh del theo sau là một hoặc nhiều khóa mà bạn muốn xóa:

  • del key_1 key_2

Nếu lệnh này xóa (các) khóa thành công, nó sẽ trả về (integer) 1 . Nếu không, nó sẽ trả về (integer) 0 .

Lệnh unlink thực hiện một chức năng tương tự như del , với sự khác biệt là del chặn client khi server lấy lại bộ nhớ được chiếm bởi khóa. Nếu khóa đang bị xóa được liên kết với một đối tượng nhỏ, lượng thời gian để del lấy lại bộ nhớ là rất nhỏ và thời gian chặn thậm chí có thể không đáng chú ý.

Tuy nhiên, nó có thể trở nên bất tiện nếu chẳng hạn, khóa bạn đang xóa được liên kết với nhiều đối tượng, chẳng hạn như một hàm băm với hàng nghìn hoặc hàng triệu trường. Việc xóa khóa như vậy có thể mất một thời gian đáng kể và bạn sẽ bị chặn thực hiện bất kỳ thao tác nào khác cho đến khi nó bị xóa hoàn toàn khỏi bộ nhớ của server .

Tuy nhiên, unlink , trước tiên xác định chi phí của việc phân bổ bộ nhớ mà khóa chiếm dụng. Nếu nó nhỏ thì hãy unlink chức năng giống như cách del bằng phím ngay lập tức đồng thời chặn client . Tuy nhiên, nếu có chi phí cao để phân bổ bộ nhớ cho một khóa, việc unlink sẽ xóa khóa không đồng bộ bằng cách tạo một stream khác và dần dần lấy lại bộ nhớ trong nền mà không chặn client :

  • unlink key_1

Vì nó chạy ở chế độ nền, nên thường bạn nên sử dụng unlink để xóa khóa khỏi server của bạn nhằm giảm lỗi trên client của bạn, mặc dù trong nhiều trường hợp, del cũng sẽ đủ.

Cảnh báo: Hai lệnh sau được coi là nguy hiểm . Các flushdbflushall sẽ xóa tất cả các khóa trong một database và tất cả các khóa trong mọi database trên server Redis một cách không phục hồi được . Ta khuyên bạn chỉ nên chạy các lệnh này nếu bạn hoàn toàn chắc chắn rằng bạn muốn xóa tất cả các khóa trong database hoặc server của bạn .

Bạn có thể quan tâm đến việc đổi tên các lệnh này thành một thứ gì đó với khả năng bị vô tình chạy thấp hơn.

Để xóa tất cả các khóa trong database đã chọn, hãy sử dụng lệnh flushdb :

  • flushdb

Để xóa tất cả các khóa trong mọi database trên server Redis (bao gồm cả database hiện được chọn), hãy chạy flushall :

  • flushall

Cả flushdbflushall chấp nhận tùy chọn async , cho phép bạn xóa tất cả các khóa trên một database duy nhất hoặc mọi database trong cụm một cách không đồng bộ. Điều này cho phép chúng hoạt động tương tự như lệnh unlink và chúng sẽ tạo một chuỗi mới để giải phóng dần bộ nhớ trong nền.

Sao lưu database của bạn

Để tạo bản sao lưu của database hiện được chọn, bạn có thể sử dụng lệnh save :

  • save

Thao tác này sẽ xuất một ảnh chụp nhanh của tập dữ liệu hiện tại dưới dạng file .rdb , là file kết xuất database chứa dữ liệu ở định dạng tuần tự hóa nén nội bộ.

save chạy đồng bộ và sẽ chặn bất kỳ client nào khác được kết nối với database . Do đó, tài liệu về lệnh save khuyến nghị rằng lệnh này hầu như không bao giờ được chạy trong môi trường production . Thay vào đó, nó gợi ý sử dụng lệnh bgsave . Điều này yêu cầu Redis phân tách database : cấp độ root sẽ tiếp tục phục vụ các client trong khi tiến trình con lưu database trước khi thoát:

  • bgsave

Lưu ý nếu khách hàng thêm hoặc sửa đổi dữ liệu trong khi hoạt động bgsave đang diễn ra, những thay đổi này sẽ không được ghi lại trong ảnh chụp nhanh.

Bạn cũng có thể chỉnh sửa file cấu hình Redis để Redis tự động lưu ảnh chụp nhanh (được gọi là chế độ chụp nhanh hoặc RDB ) sau một khoảng thời gian nhất định nếu một số thay đổi tối thiểu được thực hiện đối với database . Đây được coi là một điểm lưu . Các cài đặt điểm lưu sau được bật theo mặc định trong file redis.conf :

/etc/redis/redis.conf
. . .
save 900 1
save 300 10
save 60 10000
. . .
dbfilename "nextfile.rdb"
. . .

Với các cài đặt này, Redis sẽ xuất một ảnh chụp nhanh của database sang file được xác định bởi tham số dbfilename cứ sau 900 giây nếu có ít nhất 1 khóa được thay đổi, cứ sau 300 giây nếu có ít nhất 10 khóa được thay đổi và cứ sau 60 giây nếu ít nhất 10000 các phím được thay đổi.

Bạn có thể sử dụng lệnh shutdown để sao lưu dữ liệu Redis của bạn và sau đó đóng kết nối. Lệnh này sẽ chặn mọi client được kết nối với database và sau đó thực hiện thao tác save nếu ít nhất một điểm lưu được cấu hình, nghĩa là nó sẽ xuất database ở trạng thái hiện tại sang file .rdb trong khi ngăn client thực hiện bất kỳ thay đổi nào.

Ngoài ra, lệnh shutdown sẽ xóa các thay đổi đối với file chỉ phần phụ của Redis trước khi thoát nếu chế độ chỉ phần bổ sung được bật. Chế độ file chỉ nối thêm (AOF) liên quan đến việc tạo log của mọi hoạt động ghi trên server trong file kết thúc bằng .aof sau mỗi ảnh chụp nhanh. Chế độ AOF và RDB có thể được bật trên cùng một server và sử dụng cả hai phương pháp liên tục là một cách hiệu quả để sao lưu dữ liệu .

Nói tóm lại, lệnh shutdown về cơ bản là một lệnh save chặn cũng xóa tất cả các thay đổi gần đây đối với file chỉ nối thêm và đóng kết nối với cá thể Redis:

Cảnh báo: Lệnh shutdown được coi là nguy hiểm . Bằng cách chặn các client của server Redis, bạn có thể làm cho dữ liệu của bạn không khả dụng đối với user và ứng dụng phụ thuộc vào nó. Ta khuyên bạn chỉ nên chạy lệnh này nếu bạn đang kiểm tra hành vi của Redis hoặc bạn hoàn toàn chắc chắn rằng bạn muốn chặn tất cả các client trên server Redis của bạn .

Trên thực tế, bạn có thể quan tâm đến việc đổi tên lệnh này thành một thứ gì đó với khả năng bị vô tình chạy thấp hơn.

  • shutdown

Nếu bạn chưa cấu hình bất kỳ điểm lưu nào nhưng vẫn muốn Redis thực hiện thao tác save , hãy thêm tùy chọn save vào lệnh tắt máy:

  • shutdown save

Nếu bạn đã cấu hình ít nhất một điểm lưu nhưng bạn muốn tắt server Redis mà không thực hiện lưu, bạn có thể thêm đối số nosave vào lệnh:

  • shutdown nosave

Lưu ý file chỉ dành cho phần phụ thêm có thể dài ra theo thời gian, nhưng bạn có thể cấu hình Redis để viết lại file dựa trên các biến nhất định bằng cách chỉnh sửa file redis.conf . Bạn cũng có thể hướng dẫn Redis viết lại file chỉ dành cho phần thêm bằng cách chạy lệnh bgrewriteaof :

  • bgrewriteaof

bgrewriteaof sẽ tạo bộ lệnh ngắn nhất cần thiết để đưa database trở lại trạng thái hiện tại. Như tên của lệnh này, nó sẽ chạy ở chế độ nền. Tuy nhiên, nếu một lệnh duy trì khác đang chạy trong một tiến trình , lệnh đó phải kết thúc trước khi Redis thực thi bgrewriteaof .

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 để quản lý database và khóa. 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 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 trước

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
Cách bảo mật cài đặt Redis của bạn trên Ubuntu 18.04 2018-06-27