Thứ ba, 01/10/2019 | 00:00 GMT+7

Cách thực hiện giao dịch trong Redis

Redis là một repodata key-value open-souce trong bộ nhớ. Redis cho phép bạn lập kế hoạch chuỗi lệnh và chạy chúng lần lượt, một thủ tục được gọi là giao dịch . Mỗi giao dịch được coi là một hoạt động không bị gián đoạn và cô lập, đảm bảo tính toàn vẹn của dữ liệu. Khách hàng không thể chạy lệnh khi khối giao dịch đang được thực hiện

Hướng dẫn này trình bày về cách thực hiện và hủy giao dịch, đồng thời bao gồm một số thông tin về các cạm bẫy thường liên quan đến giao dịch.

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.

Giao dịch đang chạy

Lệnh multi yêu cầu Redis bắt đầu một khối giao dịch. Bất kỳ lệnh tiếp theo sẽ được xếp hàng lên cho đến khi bạn chạy một exec lệnh, mà sẽ thực hiện chúng.

Các lệnh sau tạo thành một khối giao dịch duy nhất. Lệnh đầu tiên bắt đầu giao dịch, lệnh thứ hai đặt khóa giữ một chuỗi có giá trị là 1 , lệnh thứ ba tăng giá trị lên 1, lệnh thứ tư tăng giá trị của nó lên 40, lệnh thứ năm trả về giá trị hiện tại của chuỗi và lệnh cuối cùng một thực thi khối giao dịch:

  • multi
  • set key_MeaningOfLife 1
  • incr key_MeaningOfLife
  • incrby key_MeaningOfLife 40
  • get key_MeaningOfLife
  • exec

Sau khi chạy multi , redis-cli sẽ phản hồi từng lệnh sau bằng QUEUED . Sau khi bạn chạy lệnh exec , nó sẽ hiển thị kết quả của từng lệnh đó riêng lẻ:

Output
1) OK 2) (integer) 2 3) (integer) 42 4) "42"

Các lệnh bao gồm trong một khối giao dịch được chạy tuần tự theo thứ tự chúng được xếp hàng đợi. Các giao dịch Redis là nguyên tử , nghĩa là mọi lệnh trong khối giao dịch đều được xử lý (nghĩa là nó được chấp nhận là hợp lệ và được xếp hàng đợi để được thực hiện) hoặc không có lệnh nào. Tuy nhiên, ngay cả khi một lệnh được xếp hàng đợi thành công, nó vẫn có thể tạo ra lỗi khi thực thi. Trong những trường hợp như vậy, các lệnh khác trong giao dịch vẫn có thể chạy, nhưng Redis sẽ bỏ qua lệnh gây lỗi. Xem phần tìm hiểu lỗi giao dịch để biết thêm chi tiết.

Hủy giao dịch

Để hủy giao dịch, hãy chạy lệnh discard . Điều này ngăn không cho chạy bất kỳ lệnh nào đã được xếp hàng trước đó:

  • multi
  • set key_A 146
  • incrby key_A 10
  • discard
Output
OK

Lệnh discard trả kết nối về trạng thái bình thường, lệnh này yêu cầu Redis chạy các lệnh đơn như bình thường. Bạn cần chạy lại multi lần để thông báo cho server biết rằng bạn đang bắt đầu một giao dịch khác.

Hiểu lỗi giao dịch

Một số lệnh có thể không thể xếp hàng, chẳng hạn như các lệnh có lỗi cú pháp. Nếu bạn cố gắng xếp hàng một lệnh không chính xác về mặt cú pháp, Redis sẽ trả về một lỗi.

Giao dịch sau tạo một khóa có tên key_A và sau đó cố gắng tăng nó lên 10. Tuy nhiên, lỗi chính tả trong lệnh incrby gây ra và lỗi và đóng giao dịch:

  • multi
  • set key_A 146
  • incrbuy key_A 10
Output
(error) ERR unknown command 'incrbuy'

Nếu bạn cố gắng chạy một exec lệnh sau khi cố gắng xếp hàng một lệnh có lỗi cú pháp như thế này, bạn sẽ nhận được một thông báo lỗi nói với bạn rằng giao dịch đã được loại bỏ:

  • exec
Output
(error) EXECABORT Transaction discarded because of previous errors.

Trong những trường hợp như thế này, bạn cần phải khởi động lại khối giao dịch và đảm bảo bạn nhập chính xác từng lệnh.

Một số lệnh không thể thể xảy ra vào hàng đợi, chẳng hạn như chạy incr trên một phím chỉ chứa một chuỗi. Bởi vì lệnh như vậy là đúng cú pháp, Redis sẽ không trở lại một lỗi nếu bạn cố gắng đưa nó vào trong một giao dịch và sẽ không ngăn cản bạn chạy exec . Trong những trường hợp như thế này, tất cả các lệnh khác trong hàng đợi sẽ được thực thi, nhưng lệnh không thể sẽ trả về lỗi:

  • multi
  • set key_A 146
  • incrby key_A "ten"
  • exec
Output
1) OK 2) (error) ERR value is not an integer or out of range

Để biết thêm thông tin về cách Redis xử lý các lỗi bên trong giao dịch, hãy xem tài liệu chính thức về chủ đề này .

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, chạy và hủy giao dịch 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 phân tích thống kê database Redis được quản lý bằng cách sử dụng elastic trên Ubuntu 18.04
2019-09-27
Cách quản lý bộ trong Redis
2019-09-26
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