PDA

View Full Version : مزایا یا معایب استفاده ازلیست استاتیک یک کلاس



masih_enter
شنبه 29 دی 1397, 01:54 صبح
سلام . من یک برنامه دارم مینویسم که در هر ریکوست که ارسال میشه نیازه ادرس هاست با مقدار درون پایگاه داده چک بشه تا مشخص بشه این دامنه برای کدوم کاربر هست و اگر برای کاربری نبود ریکویست رو منحل میکنه

در نسخه اولیه هر بار از پایگاه داده واکشی میکنه و میدونم اگر تو استفاده واقعی بره هرچه کاربر و تعداد ریکویست ها بیشتر بشهتعداد خیلی زیادی درخواست به اس کیو ال سرور میره

برای حل این موضوع اومدم یک کلاس پابلیک درست کردم و از اون یک ابجکت استاتیک درست کردم و هر بار ریکوسیتی میاد اول در این ابجکت استاتیک چک میکنم ببینم این ادرس دامنه برای کاربری ثبت شده یا نه . اگر بود که خوب دیگه درخواست به پایگاه داده نمیره اگر نبود میره از پایگاه چک میکنه و اگر پیدا کرد به ابجکت استاتیک اضافه میکنه و اگر پیدا نکرد درخواست رو منحل میکنه .

اینطوری تعداد ریکویست ها خیلی کم شده . مثلا از 1000 بار چک کردن پایگاه داده الان شده 1 بار .

حالا سوالم اینه این روش درسته یا اشتباهه و ایا راه درست تری برای اینکه یک کپی از مقادیر درون پایگاه داده روی رم داشته باشیم وجود داره که تعداد رخواست های زیاد به سرور اس کیو ال رو کم کنیم ؟

در مورد اپدیت پایگاه داده هم گفتم اگر اپدیتی قراره برای اون نام دامنه اتفاق بیافته از لیست ابجکت استاتیک حذف بشه و در درخواست بعدی دوباره چک بشه






private static List < DnsTbl > DnsList {get;set;}




public class DnsTbl {
public string Id {get;set;}
public string DnsName {get;set;}
}


private void CheckDns(string host) {
var result = DnsList.FirstOrDefault(s => s.DnsName == host);
if (result == null) {
//چک کردن از پایگاه داده
//افزودن به DnsList
} else {
// برگشت Id
}




}

masih_enter
شنبه 29 دی 1397, 20:46 عصر
کسی نظری نداره ؟ یا من سوالم رو بد مطرح کردم ؟

hakim22
یک شنبه 30 دی 1397, 16:33 عصر
مورد شما دقیقا جایی هست که بحث Caching در ASP.NET Core به کار میاد. استفاده از متغیرهای استاتیک هیچوقت روش خوبی برای حل مشکل در وب نیست. متغیرهای استاتیک علاوه بر اینکه پرفورمنس رو پایین میارن بعد از ریست شدن سرور هم پاک میشن و باید دوباره بارگیری بشن.

masih_enter
دوشنبه 01 بهمن 1397, 00:06 صبح
باهاتون موافقم و خودم هم حس میکنم کارم درست نیست . مثلا یک فیلدی که من دارم در کد بیهایند نرخ ارز هست که در پایگاه ذخیره میشه و احتمال داره روزی 1 بار اپدیت بشه . وقتی از پایگاه میخونم به تعداد ریکویست های روزانه کانکشن زده میشه به پایگاه در حالی که من یه بار اول رو از پایگاه میخونم و هرجا اگر پایگاه رو اپدیت کردم میگم این استاتیک هم اپدیت بشه دستی
اینطوری مثلا روزی 100 هزار تا کانکشن به پایگاه میشه 10 تا دونه . اگر این روش درستی نیست از چه روشی باید استفاده کنم ؟
کش کردن داده به نظر شما در اینجا هم کاربرد داره ؟ یا اینکه احتمال داره یک کش برای دونفر با پنل های متفاوت نمایش داده بشه ؟

hamid_hr
دوشنبه 01 بهمن 1397, 11:25 صبح
به نظر من اگه حجم این اطلاعات کم هست بهترین روش همون هست که استفاده کردین.
اگه حجم داده ها زیاد هست یا به مرور مثلا یک سال دیگه حجم زیاد میشه این روش بهینه نیست.

masih_enter
پنج شنبه 11 بهمن 1397, 01:19 صبح
حجم اطلاعات زیاد قراره بشه . برای همین دنبال راه بهینه تری هستم..
به نظر شما از چه راهی باید استفاده کرد در چنین مواردی ؟

hamid_hr
پنج شنبه 11 بهمن 1397, 12:55 عصر
یک راه اینه که تعداد محدودی مثلا 100 تایی که بیشترین درخواست رو دارن توی استاتیک نگه دارین وقتی ریکوئست اومد چک کنین که ایا توی لیست هست یا نه بعد برین از دیتابیس چک کنید.
البته باید یک آمایش هم داشته باشید و برای هر بار درخواسا ادرس هاست رتبه اون ادرس هاست رو یکی بالا ببرید و مثلا هر روز یا چند ساعت یک بار رنک بندی کنید و لیست رو رفرش کنید و 100 تای بالا رو تو لیست قرار بدین.
اینطوری مثلا میشه 80 درصد از درخواستا رو توی لیست مثلا 100 تایی نگه داشت. البته اعداد و ارقام همش توی ذهن من هست و شاید زمان عملیات خیلی اینها تغییر کند