Men-debugging Masalah Korupsi Data #
Masalah yang sulit untuk di-debug adalah jika RedisClient
yang sama instance dibagikan di beberapa utas yang dapat menghasilkan pengembalian data yang rusak. Biasanya, ini adalah hasil dari penggunaan IRedisClient
bidang dalam instance tunggal atau membagikannya sebagai instance statis. Untuk mencegah hal ini, setiap Thread yang menggunakan Redis harus mengambil klien redis dalam pernyataan using, mis:
using var redis = redisManager.GetClient();
//...
Sayangnya situs panggilan yang mengembalikan respons rusak atau Pengecualian runtime tidak mengidentifikasi di mana lagi instance klien Redis digunakan. Untuk membantu mengidentifikasi di mana instance klien digunakan, Anda dapat menegaskan bahwa klien hanya digunakan di Utas yang menyelesaikannya dari kumpulan dengan:
RedisConfig.AssertAccessOnlyOnSameThread = true;
Ini menangkap Thread's StackTrace setiap kali klien diselesaikan dari kumpulan yang karena menambahkan banyak overhead, hanya boleh diaktifkan saat men-debug masalah koneksi.
Jika itu mendeteksi klien sedang diakses dari utas yang berbeda, itu akan melempar InvalidAccessException
dengan pesan yang berisi ID Thread yang berbeda dan StackTrace asli di mana klien diselesaikan dari kumpulan. Anda dapat membandingkannya dengan StackTrace of the Exception untuk mudah-mudahan mengidentifikasi di mana klien digunakan secara tidak benar.
Menghindari masalah Penggunaan Bersamaan #
Apa yang harus diwaspadai dalam basis kode Anda untuk mencegah beberapa penggunaan bersamaan dari IRedisClient
contoh:
- Gunakan
IRedisClient
redis klien instance dalamusing
pernyataan - Jangan pernah menggunakan instance klien setelah dibuang
- Jangan pernah menggunakan (atau mengembalikan) "kumpulan atau sumber daya server" (mis. Redis.Lists, lock) setelah klien dibuang
- Jangan pernah menyimpan Singleton atau
static
instance ke klien redis (hanyaIRedisClientsManager
pabrik) - Jangan pernah menggunakan klien redis yang sama di beberapa utas, yaitu minta setiap utas menyelesaikan klien mereka sendiri dari pabrik