Cách quản lý database 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
:
Để swap 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ẽ swap 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 swap 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ồnREPLACE
: Chỉ định rằng nếu khóa đã tồn tại trên đích, hoạt độngmigrate
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ệnhkeys
để 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ủakeys
, 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
"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
"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 flushdb
và flushall
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ả flushdb
và flushall
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.
Backup database của bạn
Để tạo bản backup 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
:
. . .
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
để backup 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ả để backup 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 .
Các tin liên quan
Cách quản lý danh sách trong Redis2019-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