Nếu bạn làm việc với Java và sử dụng Spring, rất có thể các khóa của bạn trong Redis trông giống như thế này
\xac\xed\x00\x05t\x00\x0amyrediskey
Các khóa trong Redis chỉ có thể là Chuỗi, nhưng Spring cũng cho phép bạn lưu trữ các đối tượng java. Theo mặc định, Spring sẽ chuyển đổi đối tượng java bằng cách sử dụng bộ tuần tự JDK. Bộ tuần tự JDK thêm những \xac\xed...
`byte.
Cách khắc phục thường là thay đổi 1 dòng - hướng dẫn mùa xuân sử dụng StringRedisSerializer. Nhưng thay đổi này chỉ ảnh hưởng đến các khóa mới. Các khóa hiện có sẽ tiếp tục ở lại Redis nhưng sẽ không thể truy cập được vào java.
Nếu bạn đã có dữ liệu trong quá trình sản xuất, bạn cần phải làm thêm. Một cách tiếp cận là đổi tên các khóa và loại bỏ dữ liệu nhị phân.
Đổi tên các khóa được mã hóa Java
Gần đây, chúng tôi đã phát hành một tập lệnh java tự động sửa các khóa như vậy. Xem hashedin / redis-rename-java-encoded-key.
Cách tiếp cận chung là:
- Quét các khóa và tìm các khóa bắt đầu bằng
\xac\xed\x00\x05
- là chữ ký cho các đối tượng được mã hóa java - Cố gắng deserialize thành một đối tượng java.
- Nếu thành công và nếu đối tượng thuộc loại Chuỗi, thì hãy đổi tên khóa
- Nếu đó là một cụm, khóa đổi tên sẽ không hoạt động. Trong trường hợp đó, hãy kết xuất và khôi phục khóa dưới tên mới
Chạy nó trong Sản xuất
- Trước tiên, bạn cần thực hiện thay đổi mã để ngừng sử dụng Jdk Serializer
- Tại thời điểm này, các lần đọc từ redis sẽ không thành công vì mã đang tìm kiếm các đối tượng được tuần tự hóa
- Bây giờ hãy bắt đầu chạy tập lệnh để sửa dữ liệu
Cải tiến trong tương lai
- Để giảm thời gian chết, bạn có thể quét cơ sở dữ liệu và đệm tất cả các lệnh đổi tên. Sau đó, thực hiện thay đổi mã và chạy ngay các lệnh đổi tên chỉ trong một lần.
- Cải thiện hỗ trợ cụm. Hiện tại, bạn phải chạy với từng nút chính trong cụm