Gỡ lỗi Sự cố Tham nhũng Dữ liệu #
Một vấn đề có thể khó gỡ lỗi là nếu RedisClient
giống nhau cá thể được chia sẻ trên nhiều luồng có thể dẫn đến việc trả về dữ liệu bị hỏng. Thông thường, đây là kết quả của việc sử dụng IRedisClient
trường trong một trường hợp singleton hoặc chia sẻ nó dưới dạng một trường hợp tĩnh. Để ngăn chặn điều này, mỗi Chủ đề sử dụng Redis phải truy xuất ứng dụng khách redis trong một câu lệnh using, ví dụ:
using var redis = redisManager.GetClient();
//...
Thật không may, trang web cuộc gọi trả về phản hồi bị hỏng hoặc Ngoại lệ thời gian chạy không xác định được nơi nào khác phiên bản ứng dụng khách Redis đang được sử dụng. Để giúp xác định nơi các phiên bản máy khách đang được sử dụng, bạn có thể khẳng định rằng máy khách chỉ được sử dụng trong Chuỗi đã giải quyết nó từ nhóm với:
RedisConfig.AssertAccessOnlyOnSameThread = true;
Điều này nắm bắt StackTrace của Chủ đề mỗi khi máy khách được giải quyết khỏi nhóm vì nó thêm nhiều chi phí, chỉ nên được bật khi gỡ lỗi các sự cố kết nối.
Nếu nó phát hiện thấy máy khách đang được truy cập từ một chuỗi khác, nó sẽ ném ra một InvalidAccessException
với tin nhắn chứa Id chuỗi khác nhau và StackTrace gốc nơi khách hàng đã được giải quyết từ nhóm. Bạn có thể so sánh điều này với StackTrace of the Exception để hy vọng xác định vị trí khách hàng đang được sử dụng không đúng cách.
Tránh các vấn đề về Sử dụng Đồng thời #
Cần lưu ý những gì trong cơ sở mã của bạn để ngăn chặn việc sử dụng đồng thời nhiều IRedisClient
ví dụ:
- Sử dụng
IRedisClient
redis instance client trongusing
tuyên bố - Không bao giờ sử dụng phiên bản máy khách sau khi nó đã được xử lý
- Không bao giờ sử dụng (hoặc trả lại) "bộ sưu tập hoặc tài nguyên máy chủ" (ví dụ:Redis.Lists, khóa) sau khi máy khách đã được xử lý
- Không bao giờ giữ một Singleton hoặc
static
đối với ứng dụng khách redis (chỉIRedisClientsManager
nhà máy) - Không bao giờ sử dụng cùng một ứng dụng khách redis trong nhiều luồng, tức là mỗi luồng giải quyết ứng dụng khách của chính chúng từ nhà máy