Díky Aleši .... Dne úterý 1. prosince 2020 v 14:23:15 UTC+1 uživatel Ales Zoulek napsal:
> Ahoj, > > > > > On Sat, Nov 28, 2020 at 4:54 PM MirekZv <mirek....@gmail.com> wrote: > >> Zdravím. >> Je to trochu filozofická otázka, spíš jsem ji tak zkusil sepsat, i s >> pokusem o odpověď, abych si sám věci ujasnil. >> Jestli někdo má trpělivost si to přečíst a má k tomu nějaký postřeh, >> samozřejmě vítám. >> >> Šéf mi dal toto zadání [zdravím, šéfe]: >> >> Produkty z různých skladů - chceme v redisu mít jejich celkový počet na >> všech skladech (ten pak vypisujeme v eshopu na obrazovku, kde je vždy >> několik produktů). >> >> Neznalý zacházení s redisem jsem to udělal tak, že jsem pro každý produkt >> udělal jeden klíč, něco jako stock_<product_id>. >> >> Šéf pak řekl "ne-ne-né", my chceme mít jediný klíč a v něm dictionary >> {product_id: stock}. >> >> Tak to teď předělávám. >> Ale vylíhlo se mi tu plno otázek: >> >> a) Mám-li u produktu nějakou funkci Product.get_stock() tak sice můžu v >> ní volat cache.get(), >> u mého řešení 1produkt=1klíč toto ani nebyl problém, >> ale tady tu celou velkou dict budu na stránce, kde je 20 produktů, z >> cache tahat 20x? >> > 1. Neznam vas setup (kde bezi redis, ani kolik produktu mate), ale obecne > bych si troufnul rict, ze to zasadni rozdil nebude. Pokud nemate opravdu > tunu tech produktu. > 2. Redis umi HGET, kterej ti vrati jen jeden prvek z toho dictu a pak je > to ekvivalentni s tvym puvodnim resenim. (Ale pak musis s redisem > komunikovat primo pomoci redis knihovny, django cache api to myslim neumi.) > 3. Spis bych se soustredil na to, co je lehci spravovat. Jak se to bude > invalidovat? Je lepsi mit globalni ttl na cely dict? Nebo po jednotlivych > produktech? Nebo budete "vzdy" invalidovat rucne? > > > >> b) Tak bych si ji měl asi někam uložit. Ale kam? >> Třeba bych si uměl představit, navěsit ji na request, jenže u metod >> modelu se asi k requestu nedostano snadno. >> > V zasade bych se 20ti requestu do redisu nebal, ale muzes pouzit treba > https://pypi.org/project/django-request-cache/ coz je cache, ktera se > invaliduje s kazdym requestem. > > >> >> c) Nakonec by ani nebylo špatné mít to úplně trvalé, jako atribut >> nějakého globálního objektu. Jenže - je v Djangu něco takového? (napadá mě >> jedině: Product._meta) >> Jenže stejně by zas byl problém, že se z toho stane taková další level >> cache a bude potřeba to nějak synchronizovat se změnami stavu. >> > To bych radsi nedelal. Od toho prave mas ten redis :) > > >> >> Zkusím si nějak odpovědět: >> Když něco řeším u produktu, nemůžu vědět, jestli to bude potřeba v rámci >> requestu nebo jinak (management command). Takže řešit obecně nějaké uložení >> na nějakou dobu je problém. Můžu leda tak zavést parametr stock=None, který >> když bude None, načte se cache.get() během té funkce. A tam, kde mám pocit, >> že by se opakovaná volání vyplatilo optimalizovat, můžu to načíst předem >> (např. na začátku view) a předávat už hotové tím parametrem. >> >> Pozn.: >> Na naplnění té cache chceme použít nějaký anotovaný queryset >> Product.objects.with_stock(). >> Ještě mě napadlo, že by bylo bezva, kdyby ten queryset vrátil ten stav >> skladu z Redisu, pokud to v tom Redisu už je. >> Jenže to asi není možné z principu věci, protože queryset se vždy jen >> hrabe v databázi, že (?). >> >> -- >> -- >> E-mailová skupina djan...@googlegroups.com >> Správa: http://groups.google.cz/group/django-cs >> --- >> Tuto zprávu jste obdrželi, protože jste přihlášeni k odběru skupiny >> „django-cs“ ve Skupinách Google. >> Chcete-li zrušit odběr skupiny a přestat dostávat e‑maily ze skupiny, >> zašlete e-mail na adresu django-cs+...@googlegroups.com. >> Chcete-li tuto diskusi zobrazit na webu, navštivte >> https://groups.google.com/d/msgid/django-cs/535fec5d-e3e7-4d4a-9ab6-d364c275d14bn%40googlegroups.com >> >> <https://groups.google.com/d/msgid/django-cs/535fec5d-e3e7-4d4a-9ab6-d364c275d14bn%40googlegroups.com?utm_medium=email&utm_source=footer> >> . >> > -- -- E-mailová skupina django-cs@googlegroups.com Správa: http://groups.google.cz/group/django-cs --- Tuto zprávu jste obdrželi, protože jste přihlášeni k odběru skupiny django-cs ve Skupinách Google. Chcete-li zrušit odběr skupiny a přestat dostávat e‑maily ze skupiny, zašlete e-mail na adresu django-cs+unsubscr...@googlegroups.com. Chcete-li zobrazit tuto diskusi na webu, navštivte https://groups.google.com/d/msgid/django-cs/d13f99d8-b7c9-44b0-aad3-526d54ebd509n%40googlegroups.com.