هل يدعم SQLAlchemy التخزين المؤقت؟
-
03-07-2019 - |
سؤال
هل يدعم SQLAlchemy نوعًا ما من التخزين المؤقت، لذلك إذا قمت بتشغيل نفس الاستعلام بشكل متكرر فإنه يقوم بإرجاع الاستجابة من ذاكرة التخزين المؤقت بدلاً من الاستعلام عن قاعدة البيانات؟هل يتم مسح ذاكرة التخزين المؤقت هذه تلقائيًا عند تحديث قاعدة البيانات؟
أو ما هي أفضل طريقة لتنفيذ ذلك على إعداد CherryPy + SQLAlchemy؟
المحلول
لدينا حل شامل جدا التخزين المؤقت، على سبيل المثال بالتزامن مع السنانير جزءا لا يتجزأ، في 0.6. انها وصفة لفئة فرعية سؤال، وجعلها تدرك بيكر، والسماح السيطرة على التخزين المؤقت الاستعلام عن الاستفسارات واضحة وكذلك رافعات كسول عبر خيارات الاستعلام.
وأنا على التوالي في الإنتاج الآن. على سبيل المثال نفسه في حي وثائق مقدمة هي في HTTP: // www.sqlalchemy.org/docs/orm/examples.html#beaker-caching .
وUPDATE: تم الآن استبدال بيكر مع التخزين المؤقت dogpile
: <لأ href = "http://docs.sqlalchemy.org/en/latest/orm/examples.html#module-examples.dogpile_caching" يختلط = "noreferrer" > http://docs.sqlalchemy.org/en/latest/orm/examples.html#module-examples.dogpile_caching
نصائح أخرى
ليست إجابة على سؤالك الثاني، ولكن من التعليقات الموجودة في هذا الرابط تشير إلى أن SQLAlchemy لا يدعم التخزين المؤقت: http://spyced.blogspot.com/2007/01/why-sqlalchemy-impresses-me.html
وقال رافين...
Does SQLAlchemy do any kind of internal caching? For example, if you ask for the same data twice (or an obvious subset of the initially requested data) will the database be hit once or twice? I recently wrote a caching database abstraction layer for an application and (while fun) it was a fair bit of work to get it to a minimally functional state. If SQLAlchemy did that I would seriously consider jumping on the bandwagon. I've found things in the docs that imply something like this might be going on, but nothing explicit. 4:36 PM
وقال جوناثان إليس...
No; the author of SA [rightly, IMO] considers caching a separate concern. What you saw in the docs is probably the SA identity map, which makes it so if you load an instance in two different places, they will refer to the same object. But the database will still be queried twice, so it is not a cache in the sense you mean.
يدعم SQLAlchemy نوعين من ذاكرات التخزين المؤقت:
تخزين مجموعة النتائج مؤقتًا بحيث يصل تشغيل نفس الاستعلام بشكل متكرر إلى ذاكرة التخزين المؤقت بدلاً من قاعدة البيانات.يستخدم
dogpile
الذي يدعم العديد من الواجهات الخلفية المختلفة، بما في ذلكmemcached
,redis
, والملفات المسطحة الأساسية.المستندات هنا: http://docs.sqlalchemy.org/en/latest/orm/examples.html#module-examples.dogpile_caching
التخزين المؤقت
query
كائن بحيث لا يضطر مترجم بايثون إلى إعادة تجميع سلسلة الاستعلام يدويًا في كل مرة.تسمى هذه الاستعلاماتbaked queries
ويتم استدعاء ذاكرة التخزين المؤقتbaked
.في الأساس يقوم بتخزين كافة الإجراءاتsqlalchemy
يستغرق الأمر قبل الوصول إلى قاعدة البيانات - فهو لا يقلل من مكالمات قاعدة البيانات.تظهر المعايير الأولية تسريعًا يصل إلى 40%query
وقت التوليد في مقابل زيادة طفيفة في إسهاب التعليمات البرمجية.المستندات هنا: http://docs.sqlalchemy.org/en/latest/orm/extensions/baked.html
وأو استخدام مخبأ مستوى التطبيق عبر إشارات ضعيفة dicts (weakref.WeakValueDictionary)، انظر مثالا هنا: <لأ href = "http://www.sqlalchemy.org/trac/wiki/UsageRecipes/UniqueObject" يختلط = "noreferrer نوفولو"> http://www.sqlalchemy.org/trac/wiki/UsageRecipes/UniqueObject