рдХреБрдЫ рд╕рдордп рдкрд╣рд▓реЗ
рдореИрдВрдиреЗ рдХреИрд╢рд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд▓рд┐рдЦрд╛ рдерд╛ ред рдореБрдЭреЗ рдпрд╛рдж рд╣реИ рдХрд┐ рдореИрдВрдиреЗ рдЬрд╛рд░реА рд░рдЦрдиреЗ рдХрд╛ рд╡рд╛рджрд╛ рдХрд┐рдпрд╛ рдерд╛, рд▓реЗрдХрд┐рди рдЕрдм рдореИрдВрдиреЗ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ рдХрд┐ рдХреЛрдб рдХреА рдПрдХ рдкрдВрдХреНрддрд┐ рд╕реИрдХрдбрд╝реЛрдВ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рд╕реЗ рдмреЗрд╣рддрд░ рд╣реИ, рд╣рдо рдмрд╛рдж рдХреЗ рд▓рд┐рдП рд╕рд┐рджреНрдзрд╛рдВрдд рдЫреЛрдбрд╝ рджреЗрдВрдЧреЗред рдЗрд╕рд▓рд┐рдП, рдЖрдЬ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдмреЛрддрд▓ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд╕реБрдЭрд╛рд╡реЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рддрд░рд╣ рдХреА рдШреЛрд╖рдгрд╛ рд╣реИред рдХреИрд╢реЗрдкреНрд╕ - рдХреИрд╢ рд╕рд┐рд╕реНрдЯрдо рдФрд░ рдЬрд┐рдУ рдУрдЖрд░рдПрдо рдХреЗ рд▓рд┐рдП рд╕реНрд╡рдд: рдХреИрд╢ рдЕрдорд╛рдиреНрдп рд╣реЛрдирд╛ред
рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг, рдЬрд┐рдиреНрд╣реЛрдВрдиреЗ рдкрд┐рдЫрд▓реЗ рд▓реЗрдЦ рдХреЛ рдирд╣реАрдВ рдкрдврд╝рд╛ рд╣реИ рдпрд╛ рднреВрд▓ рдЧрдП рд╣реИрдВред рд╕рд┐рд╕реНрдЯрдо рдХреЛ рдореЙрдбрд▓ рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдХреА рдШрдЯрдирд╛ рдкрд░ ORM рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдкреНрд░рд╢реНрдиреЛрдВ рдХреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЛ рдЕрдорд╛рдиреНрдп рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдкреНрд░рддреНрдпреЗрдХ рдШрдЯрдирд╛ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдирд╛ рдХрд┐ рдХреМрди рд╕реЗ рдкреНрд░рд╢реНрди рдкреБрд░рд╛рдиреЗ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рдЪреВрдВрдХрд┐ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдЕрдорд╛рдиреНрдпрдХрд░рдг рдХреЛ рдЫреЛрдбрд╝рдХрд░ рдЕрддрд┐рд░рд┐рдХреНрдд рд╕рдВрд░рдЪрд┐рдд рдЬрд╛рдирдХрд╛рд░реА рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдХреИрд╢ рдХреА рд╕рд╛рдордЧреНрд░реА,
рд░реЗрдбрд┐рд╕ рдХреЛ рдмреИрдХреЗрдВрдб рдХреЗ рд░реВрдк рдореЗрдВ рдЪреБрдирд╛ рдЧрдпрд╛ рдерд╛ред рдФрд░ рдЪреВрдВрдХрд┐ рдпрд╣ рдПрдХ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдШреЛрд╖рдгрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЪреБрдк рд╣реЛ рдЧрдпрд╛ рдФрд░ рд╡реНрдпрд╛рдкрд╛рд░ рдореЗрдВ рдЙрддрд░ рдЧрдпрд╛ред
рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рдЖрдкрдиреЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА Redis, Django рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рд╣реИ, рдФрд░ рдЖрдкрдХреЗ рдкрд╛рд╕ рдХреИрд╢ (рдореЙрдбрд▓ рдФрд░ рдкреНрд░рд╢реНрдиреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ) рдХреБрдЫ рд╣реИред рдХреИрд╢ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ:
pip install django-cacheops
рдпрд╛ рдпрджрд┐ рдЖрдк рдЕрднреА рднреА рдХреЛрдб рдореЗрдВ рддрд▓реНрд▓реАрди рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓реЗрддреЗ рд╣реИрдВ:
git clone git://github.com/Suor/django-cacheops.git ln -s `pwd`/django-cacheops/cacheops/ /somewhere/on/your/python/import/path/
рдЕрдЧрд▓рд╛, рд╣рдореЗрдВ рдЗрд╕реЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд┐рдП рдЧрдП рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреА рд╕реВрдЪреА рдореЗрдВ рдХреИрд╢реЙрдкреНрд╕ рдЬреЛрдбрд╝реЗрдВред Django рдореЙрдбрд▓ рд▓реЛрдб рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдХреИрд╢реЗрдк рдХреЛ рдЖрд░рдВрдн рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ рдкрд╣рд▓реЗ рд░рдЦреЗрдВ:
INSTALLED_APPS = ( 'cacheops', ... )
рдЖрдкрдХреЛ рдореВрд▓реА рдХрдиреЗрдХреНрд╢рди рдФрд░ рдХреИрд╢ рдкреНрд░реЛрдлрд╛рдЗрд▓ рднреА рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдирд╛ рд╣реЛрдЧрд╛:
CACHEOPS_REDIS = { 'host': 'localhost',
рдЗрд╕рдХреЗ рдмрд╛рдж, рдХреИрд╢ рд╕реНрдЯреЛрд░реЗрдЬ рдХрд╛ рд╕рдордп рдЕрдХреНрд╕рд░ рдкреНрд░рдХрдЯ рд╣реЛрддрд╛ рд╣реИ, рдпрд╣ рд╕рдордЭрдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рдпрд╣ рдХреЗрд╡рд▓ рдЬреАрд╡рди рднрд░ рдХреА рдЕрдзрд┐рдХрддрдо рд╕реАрдорд╛ рд╣реИ, рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХрд╛рдо рдореЗрдВ, рдкреНрд░рддреНрдпреЗрдХ рд╡рд┐рд╢реЗрд╖ рд░рд┐рдХреЙрд░реНрдб рдХреЛ рдШрдЯрдирд╛ рдкрд░ рдмрд╣реБрдд рдкрд╣рд▓реЗ рд╣реА рд╣рдЯрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рд╕реЗрдЯрдЕрдк рддреИрдпрд╛рд░ рд╣реИ, рдЖрдк рдЖрдЧреЗ рдмрдврд╝ рд╕рдХрддреЗ рд╣реИрдВред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЖрдк рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрди рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рднреА рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рдХреИрд╢ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдФрд░ рдЬрдм рдЖрдк рд╕рдВрдмрдВрдзрд┐рдд рдореЙрдбрд▓реЛрдВ рдХреЛ рдмрджрд▓рддреЗ рд╣реИрдВ, рд╣рдЯрд╛рддреЗ рд╣реИрдВ рдпрд╛ рд╣рдЯрд╛рддреЗ рд╣реИрдВ рддреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЕрдорд╛рдиреНрдп рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВред рд╣рд╛рд▓рд╛рдБрдХрд┐, рд╡реНрдпрдХреНрддрд┐рдЧрдд рдХреНрд╡реЗрд░реА рдХреЗ рд╕реНрддрд░ рдкрд░ рдЕрдзрд┐рдХ рд╕реВрдХреНрд╖реНрдо рдЙрдкрдпреЛрдЧ рд╕рдВрднрд╡ рд╣реИред
рдПрдХ рдиреНрдпреВрдирддрдо рд╕реЗрдЯрд┐рдВрдЧ рдХреЗ рд░реВрдк рдореЗрдВ рдЬреЛ рдЖрдкрдХреЛ рдореИрдиреНрдпреБрдЕрд▓ рдХреИрд╢рд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдЖрдк рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
CACHEOPS = { '*.*': ('just_enable', < >), }
рдпрд╣ рд╣рдореЗрдВ рдХреБрдЫ рд▓рд┐рдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛:
articles = Article.objects.filter(tag=2).cache()
рдФрд░ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдиреБрд░реЛрдз рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ, рдЬрд┐рд╕ рдкрд░ рдПрдХ рддрд░рдл рдХреИрд╢ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдФрд░ рджреВрд╕рд░реЗ рдкрд░, рдЬрд┐рд╕рдХрд╛ рдХреИрд╢ рдорд┐рдЯ рдЬрд╛рдПрдЧрд╛, рдЬрдм рдЯреИрдЧ 2 рдХреЗ рд╕рд╛рде рдПрдХ рд▓реЗрдЦ рдХреЛ рдмрджрд▓рдирд╛, рдЬреЛрдбрд╝рдирд╛ рдпрд╛ рд╣рдЯрд╛рдирд╛ рд╣реЛрдЧрд╛ред
рдЖрдк .cache () рд╡рд┐рдзрд┐ рдХреЗ рд▓рд┐рдП рдЬреЛ рдЖрдкрдХреЛ рдХреИрд╢ рдФрд░ рдЯрд╛рдЗрдо рдЖрдЙрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдПрдХ рд╕реЗрдЯ рдкрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
qs = Article.objects.filter(tag=2).cache(ops=['count'], timeout=60*5) paginator = Paginator(objects, ipp)
рд╕рдВрдЪрд╛рд▓рди рдХрд╛ рд╕реЗрдЯ рд╡рд░реНрддрдорд╛рди рдХреНрд╡реЗрд░реАрд╕реЗрдЯ рдХреЗ рд▓рд┐рдП рдХреИрд╢рд┐рдВрдЧ рдХреЛ рдЕрдХреНрд╖рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЦрд╛рд▓реА рд╕рд╣рд┐рдд - ['рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ', 'рд▓рд╛рдиреЗ', 'рдЧрд┐рдирдиреЗ'] рдХрд╛ рдХреЛрдИ рд╕рдмрд╕реЗрдЯ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдмрд╛рдж рдХреЗ рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╢реЙрд░реНрдЯрдХрдЯ рд╣реИ:
qs = Article.objects.filter(visible=True).nocache()
рдпрд╣рд╛рдВ, рдХреНрдпреВ рд╕рд╛рдордЧреНрд░реА рддрдХ рдкрд╣реБрдВрдЪ рдбреЗрдЯрд╛рдмреЗрд╕ рдкрд░ рдЬрд╛рдПрдЧреАред
рдХреНрд╡реЗрд░реА рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдХреИрд╢реЙрдк рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдЙрдиреНрд╣реЗрдВ рдХреБрдЫ рдХреНрд╡реЗрд░реА рдХреЗ рд░реВрдк рдореЗрдВ рдЕрдХреНрд╖рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
from cacheops import cacheoped_as @cacheoped_as(Article.objects.all()) def article_stats(): return { 'tags': list( Article.objects.values('tag').annotate(count=Count('id')).nocache() ) 'categories': list( Article.objects.values('category').annotate(count=Count('id')).nocache() ) }
рд╕реВрдЪреА рдореЗрдВ рдХреНрд╡реЗрд░реАрдЬрд╝ рдХреЗ рд░реИрдкрд┐рдВрдЧ рдкрд░ рдзреНрдпрд╛рди рджреЗрдВ () - рд╣рдо рдЕрдиреБрд░реЛрдз рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдХреИрд╢ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЬрд┐рд╕реЗ рддрдм рд╣рд░ рдмрд╛рд░ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдЬрдм рдЖрдк рдЗрд╕реЗ рдПрдХреНрд╕реЗрд╕ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВред рд╣рдо .nocache () рдХрд╛ рднреА рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдХрд╛рдо рди рдХрд░реЗрдВ рдФрд░ рдордзреНрдпрд╡рд░реНрддреА рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЗ рд╕рд╛рде рдХреИрд╢ рдХреЛ рд░реЛрдХреЗрдВ рдирд╣реАрдВред
рд╢рд╛рдпрдж рдореИрдВрдиреЗ рдкрд░реНрдпрд╛рдкреНрдд рджрд┐рдпрд╛ рд╣реИ рддрд╛рдХрд┐ рд╣рд░ рдХреЛрдИ рд╕реНрд╡рд╛рдж рдорд╣рд╕реВрд╕ рдХрд░ рд╕рдХреЗ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рддрдм рддрдХ рд░реБрдХреВрдВрдЧрд╛ рдЬрдм рддрдХ рдХрд┐ рдпрд╣ рдЙрдмрд╛рдК рди рд╣реЛ рдЬрд╛рдПред
PS рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЬреЛ рдЕрдВрддрд░рдВрдЧ рд╡рд┐рд╡рд░рдг рдЪрд╛рд╣рддреЗ рд╣реИрдВ - рдЬреАрдердм рдкрд░
рд░реВрд╕реА рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ
рд╢рд╛рдЦрд╛ рд╣реИ ред