PDA

View Full Version : کش کردن کوئری



tehro0n
پنج شنبه 06 مهر 1391, 11:36 صبح
سلام،
چه موقع کوئری را باید کش کرد و چگونه این کار را انجام می دن؟

مثلا جدولی که هر دقیقه 300 تا آپدیت و افزودن داره یا جدولی که سلکت های متفاوت گرفته میشه رو میشه کش کرد یا تنها برای سلکت های تکراری کش میشه؟

tehro0n
شنبه 08 مهر 1391, 16:29 عصر
واقعا خسته نباشید

rezabojnordi
دوشنبه 10 مهر 1391, 00:32 صبح
سلام دوست عزیز من یک مثال براتون میزنم کشین مثل مروگرها میمونه که موزیلا بیشتر قدرتشو به خاطر کشینگ به بدست آورده که اگر کاربری در یک صفحه میره و چون از بانک اطلاعاتی میخونه اگر بازدید سایت بالا بود اگر بخواد همیشه از بانک بخونه سرعت میاد پایین اما اگه در یک فایل موقت نگهداری شود و کاربر به آن فایل لینک شود سرعتش میاد بالا اما باز کشینگ دو حالت داره یکی عادی و دیگری بهینه دوستداران اگه تمایل داشتن بگن من براشون با توضیحات کامیل براشون میل کنم
bojnordireza@yahoo.com
و ناگفته نمونه اگر دوستان سایت یا هر سوالی درباره php و vb.net داشتن در خدمتم شماره من 09368700813 رضا بجنوردی از مشهد

tehro0n
دوشنبه 10 مهر 1391, 00:42 صبح
سلام دوست عزیز من یک مثال براتون میزنم کشین مثل مروگرها میمونه که موزیلا بیشتر قدرتشو به خاطر کشینگ به بدست آورده که اگر کاربری در یک صفحه میره و چون از بانک اطلاعاتی میخونه اگر بازدید سایت بالا بود اگر بخواد همیشه از بانک بخونه سرعت میاد پایین اما اگه در یک فایل موقت نگهداری شود و کاربر به آن فایل لینک شود سرعتش میاد بالا اما باز کشینگ دو حالت داره یکی عادی و دیگری بهینه دوستداران اگه تمایل داشتن بگن من براشون با توضیحات کامیل براشون میل کنم
bojnordireza@yahoo.com
و ناگفته نمونه اگر دوستان سایت یا هر سوالی درباره php و vb.net داشتن در خدمتم شماره من 09368700813 رضا بجنوردی از مشهد

ممنون میشم مدل بهینه رو توضیح بدید

Hamid.RDN
دوشنبه 17 مهر 1391, 00:59 صبح
دوست عزیز کش کردن اطلاعات بسته به استراتژی شماست.
به صورت کلی اطلاعات دیتابیس رو میشه به صورتهای زیر و با توجه به استراتژی برنامه کاربردی کش کرد:

۱- کش Query
در این روش نتایج پرس و جوها در کش ذخیره می شه.
بهینه سازی این روش (با توجه به پیشرفت DBMS ها و سرورها) حدود ۲۰ تا ۷۰ درصد

۲- کش محتوای ایستا
در این روش محتوایی که پس از پرس و جو ایجاد شده در کش ذخیره می شه.
بهینه سازی این روش به دلیل کم کردن تمام سربارهای پردازشی از ۱۵۰ تا ۶۰۰۰ درصد

۳- کش محتوای پویا
همانند روش ۲ با این تفاوت نسب به تغییرات محتوا واکنش نشون میده و اطلاعات کش رو به روز می کنه.
بهینه سازی این روش نیز تا ۷۰۰ درصد

صرف نظر ار نوع سیستم کشینگ (که شما کش Query رو مد نظر دارید)، مهمترین موردی که باید در نظر گرفت معیار(های) اعتبار و سیاست های refresh کردن می باشد. (‌سوال شما)

معیار اعتبار روشی است که مشخص می کنیم آیا کش معتبر هست یا نه.
سیاست تازه سازی مشخص می کنه که اطلاعات باید چه زمانی به روز ( و یا حرس )بشن

خوب از اصول بالا می شه مدل زیر رو پیشنهاد داد:


از یک درهم ساز (هش) مثل MD5 برای پرس و جو های SELECT استفاده کنید. این کد کلید اصلی کش برای هر پرس و جوی منحصر به فرد است.
نام جداولی که این پرس و جو با آنها سر و کار دارد را بدست آورید ( با یک REGEX ساده)
نام جداول را در نام فایل کش خود اضافه نمایید.
پس از هر ویرایش جداول (UPDATE, DELETE, INSERT) کش هایی که مربوط به جداول ویرایش شده هستند رو حذف کنید.


مثلا پرس و جوی زیر رو در نظر بگیرید:

SELECT * FROM users,profiles


خوب مدخل کشمون در فایلی به شکل زیر ذخیره میشه:


e246b0037193993a3ba5ca2a4044a42e.users.profiles.da ta


خوب می بینید که بعد از MD5 کل کوئری نام جداول رو هم ذخیره کردیم ( با یک نقطه جداکننده)

خوب بعد از دستوری که محتوای جدول profiles رو تغییر می ده تمام فایلهای کش شده مربوط به جدول profiles را با کد زیر حذف می کنیم



$files = glob("*.profiles.*");
foreach( $files as $file)
@unlink($file);


این روش یکی از ساده ترین و در عین حال متداولترین استراتژی کش کوئری است.

با یکم جستجو ، خلاقیت و کد نویسی می تونید راههای بهتر و موثر تری پیدا کنید.

موفق و پایدار باشید

tehro0n
چهارشنبه 19 مهر 1391, 12:50 عصر
تقریبا فهمیدم چی گفتید ولی خوب توضیحتان جوری بود که حتما باید قبلا این کار را می کردم..
اگه میشه یک سلکت ساده رو مثال بزنید که چطور کش کردیدش و این کش چطور در فایل های ذخیره شده..
روش md5 رو برای رمز ها یا کاراکترهای طولانی استفاده کردم، ولی این که خود کوئری رو md5 کنم نه!

به نظر من، یا برای کار من بهترین مدل کش اونی هست که با هر تغییر دیتا بیس کش جدید ایجاد بشه، البته اینم خودش بستگی داره که چقدر CPU یا RAM بگیره و جوری نشه که دائم کش کردن هزینه بیشتری داشته باشه..
من در دوماه از 7 میلیون کوئری استفاده می کنم، نه اینکه بازدید سایت خودم باشه، ابزار طراحی شده زیاد مصرف میشه

tehro0n
پنج شنبه 27 مهر 1391, 19:43 عصر
رفتید؟ مثالی نیست؟ با روش کا گفتن سخته این کارو انجام دادن ولی اگه مثالی بیاورید کار راحت تر میشه

tehro0n
دوشنبه 29 آبان 1391, 11:11 صبح
????????????????????

rezaonline.net
دوشنبه 29 آبان 1391, 14:47 عصر
اگه از فریم ورک خاصی استفاده میکنید پیشنهاد میکنم از قسمت کش کوئری رو بخونید .
اگه نه از کلاس ezsql استفاده کنید .

تنها نکته ای که باید بهش اشاره کنم (همونطور که دوستمون گفتن) شما کش رو روی select میتونید انجام بدید .
فرض کنید مطالب وبلاگ شما روزانه آپدیت میشه پس میشه روی این یک کش 24 ساعته گذاشت یا حتی یه کار بهتر .
از کش apc استفاده کنید (اگه روی سرور فعال هست!)
یکبار اطلاعات رو بگیرید و منبعد نشون بدید ، هر وقت اون تیبل از دیتابیس رو آپییت کردید (insert , update , delete) اون کش رو حذف کنید و از اول بنویسید .

tehro0n
دوشنبه 29 آبان 1391, 15:23 عصر
من نه با apc آشنا هستم نه کلاس ezsql
اگه میشه بفرمایید از کجا باید بدونم که apc فعال هستش؟ من سرور لینوکس + دایرکت ادمین دارم
اگه میشه برای اون کلاس هم مثالی بزنید، چون اگه این روش ها رو بلد بودم تا الان انجام داده بودم!

rezaonline.net
دوشنبه 29 آبان 1391, 18:21 عصر
ببینید شما حتی زحمت دانلود کردن اون کلاس رو نکشیدید.
اینو بخون
یه نمونه کش هست
که توسط ci پیاده شده
http://codeigniter.com/user_guide/database/caching.html