1. Định nghĩa giao dịch
Giao dịch Redis cung cấp cơ chế "đóng gói nhiều lệnh và sau đó thực thi chúng cùng một lúc và theo trình tự".
Chức năng chính của giao dịch redis là kết nối nhiều lệnh nối tiếp để ngăn các lệnh khác nhảy vào hàng đợi.
Tuy nhiên, các giao dịch không có các đặc điểm của giao dịch cơ sở dữ liệu truyền thống, chẳng hạn như khôi phục.
2. Lệnh giao dịch
Các giao dịch trong Redis có thể được thực hiện bằng lệnh sau:
-
ĐA DẠNG
: Dùng để mở một khối giao dịch, nghĩa là các lệnh tiếp theo sẽ được đưa vào hàng đợi giao dịch chứ không được thực thi ngay.
- Lệnh giao dịch: trong
ĐA DẠNG
Và THỰC HIỆN
Tất cả các lệnh ở giữa sẽ được thêm vào hàng đợi giao dịch.
-
THỰC HIỆN
: Được sử dụng để thực thi tất cả các lệnh trong hàng đợi giao dịch. Sau khi thực hiện giao dịch, hàng đợi giao dịch sẽ bị xóa.
-
BỎ QUA
: Dùng để hủy giao dịch và xóa lệnh trong hàng đợi giao dịch.
-
ĐỒNG HỒ
: Giám sát một hoặc nhiều khóa Khi khóa được giám sát bị sửa đổi, giao dịch sẽ bị gián đoạn.
Giao dịch Redis được chia thành 2 giai đoạn: giai đoạn lập nhóm/đóng gói và giai đoạn thực hiện.
- Giai đoạn hình thành/đóng gói nhóm: Thêm tất cả các lệnh vào hàng đợi lệnh
- Giai đoạn thực thi: Thực hiện tuần tự các lệnh trong hàng đợi mà không bị ngắt quãng hoặc gián đoạn bởi các lệnh yêu cầu do client khác gửi đến.
Ví dụ:
redis 127.0.0.1:6379> MULTI OK redis 127.0.0.1:6379> ĐẶT tên sách "Redis từ lúc bắt đầu đến bỏ cuộc" QUEUED redis 127.0.0.1:6379> GET tên sách QUEUED redis 127.0.0.1:6379> SADD gắn thẻ " Redis" "Bắt đầu" "Bỏ cuộc" QUEUED redis 127.0.0.1:6379> Thẻ SMEMBERS QUEUED redis 127.0.0.1:6379> EXEC 1) OK 2) "Redis từ lúc bắt đầu đến từ bỏ" 3) (số nguyên) 3 4) 1) "Redis" 2) "Đang nhận đã bắt đầu" 3 ) "bỏ cuộc"
3. Xử lý lỗi giao dịch
Xử lý lỗi giao dịch được chia thành hai giai đoạn: lỗi trong quá trình thành lập nhóm và lỗi trong quá trình thực hiện.
- Lỗi khi lập đội: Nếu xảy ra lỗi trong quá trình lập đội, tất cả các lệnh trong toàn bộ hàng đợi sẽ bị hủy.
- Lỗi trong quá trình thực thi: Nếu xảy ra lỗi trong giai đoạn thực thi, một số lệnh sẽ được thực thi thành công và một số lệnh sẽ không thành công.
4. Xung đột giao dịch
Để giải quyết xung đột giao dịch, có thể sử dụng khóa, bao gồm cả khóa bi quan và khóa lạc quan.
4.1. Khóa bi quan
Khóa bi quan là một phương pháp kiểm soát đồng thời có thái độ bi quan đối với việc sửa đổi dữ liệu. Nó luôn giả định trường hợp xấu nhất và giả định rằng mỗi khi đọc dữ liệu, các luồng khác sẽ thay đổi dữ liệu và do đó yêu cầu thao tác khóa.
Thực hiện khóa bi quan:
- Cơ sở dữ liệu quan hệ truyền thống sử dụng cơ chế khóa này, chẳng hạn như khóa hàng, khóa bảng, khóa đọc, khóa ghi, v.v.
Tất cả Khóa trước khi vận hành.
- Triển khai từ khóa được đồng bộ hóa trong Java.
4.2. Khóa lạc quan
So với khóa bi quan, khóa lạc quan giả định rằng dữ liệu sẽ không gây ra xung đột trong các trường hợp thông thường và chỉ phát hiện xung đột khi dữ liệu được gửi để cập nhật. Nếu có xung đột, thông tin ngoại lệ sẽ được trả về và người dùng có thể quyết định cách xử lý. Khóa lạc quan phù hợp với các tình huống đọc nhiều hơn và viết ít hơn và có thể cải thiện thông lượng chương trình.
Thực hiện khóa lạc quan:
- Triển khai CAS: Các biến nguyên tử trong gói java.util.concurrent.atomic trong Java sử dụng triển khai CAS của khóa tối ưu.
- Kiểm soát số phiên bản: Nói chung, trường số phiên bản dữ liệu được thêm vào bảng dữ liệu để cho biết số lần dữ liệu đã được sửa đổi. Khi dữ liệu được sửa đổi, giá trị phiên bản sẽ là +1. Khi luồng A muốn cập nhật dữ liệu, nó cũng sẽ đọc giá trị phiên bản trong khi đọc dữ liệu. Khi gửi bản cập nhật, nó sẽ chỉ cập nhật nếu giá trị phiên bản vừa đọc bằng giá trị phiên bản trong cơ sở dữ liệu hiện tại, nếu không hãy thử cập nhật lại. .Hoạt động cho đến khi cập nhật thành công.
Redis triển khai khóa lạc quan thông qua CAS (Kiểm tra và Đặt) và sử dụng lệnh WATCH để giám sát một hoặc nhiều khóa. Khi người dùng gửi giao dịch sửa đổi, nó sẽ kiểm tra xem các khóa được giám sát có thay đổi hay không. Nếu không có thay đổi nào xảy ra thì cam kết thành công; nếu không thì giao dịch sẽ thất bại.
Ví dụ: hai khách hàng bắt đầu giao dịch cùng một lúc và cả hai đều sửa đổi giá trị của cùng một khóa. Tuy nhiên, khi thực hiện lệnh EXEC của giao dịch, chỉ giao dịch của một khách hàng có thể thành công còn giao dịch của khách hàng kia thì không. Việc thực thi không thành công vì giá trị của khóa đã thay đổi.
Khách hàng 1:
# Làm mới cơ sở dữ liệu 127.0.0.1:6379> FLUSHDB OK # Đặt giá trị key 127.0.0.1:6379> đặt key 10 OK # Monitor key 127.0.0.1:6379> Key WATCH OK # Mở giao dịch 127.0.0.1:6379> MULTI OK
Khách hàng 2:
# Monitor key 127.0.0.1:6379> WATCH key OK # Mở giao dịch 127.0.0.1:6379> MULTI OK
Khách hàng 1:
# Thêm lệnh vào hàng đợi 127.0.0.1:6379(TX)> INCR key QUEUED # Thực thi lệnh, bạn có thể thấy rằng việc thực thi thành công, một phần dữ liệu được sửa đổi và giá trị được cập nhật thành 11 127.0.0.1 :6379(TX)> EXEC 1) (số nguyên ) 11
Khách hàng 2:
127.0.0.1:6379(TX)> Khóa INCR ĐÃ ĐẾN HÀNG 127.0.0.1:6379(TX)> exec (nil)
5. Ba đặc điểm của giao dịch
Giao dịch Redis có ba đặc điểm sau:
- hoạt động cách ly riêng biệt : Các lệnh trong giao dịch sẽ được tuần tự hóa và thực hiện theo trình tự mà không bị gián đoạn bởi các lệnh từ máy khách khác.
- Không có khái niệm về mức cách ly : Tất cả các hướng dẫn sẽ không được thực hiện trước khi giao dịch được thực hiện.
- nguyên tử : Nhóm giao dịch là nguyên tử, nhưng nếu một lệnh nào đó bị sai trong giai đoạn thực hiện thì các hướng dẫn trong quá trình giao dịch vẫn có hiệu lực.
Cuối cùng, bài viết này về Redis từ khi bắt đầu từ bỏ (5): Giao dịch kết thúc tại đây. Nếu bạn muốn biết thêm về Redis từ khi bắt đầu từ bỏ (5): Giao dịch, vui lòng tìm kiếm các bài viết của CFSDN hoặc tiếp tục duyệt các bài viết liên quan. Bài viết, tôi hy vọng bạn sẽ ủng hộ blog của tôi trong tương lai! .
Tôi là một lập trình viên xuất sắc, rất giỏi!