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.

Reply via email to