Coder Social home page Coder Social logo

Invalidation problem about django-cacheops HOT 32 CLOSED

MikeVL avatar MikeVL commented on August 15, 2024
Invalidation problem

from django-cacheops.

Comments (32)

Suor avatar Suor commented on August 15, 2024

Делать flushdb во время работы не надо просто. Либо одновременно с
перезапуском процесса. Так что это не баг, нельзя вмешиваться в работу
системы и потом жаловаться на неё.

Дело в том, что схемы кешируются в памяти процесса, поэтому при втором
запросе cacheops думает что такие есть и не пересоздаёт их.

from django-cacheops.

MikeVL avatar MikeVL commented on August 15, 2024

Ну я не жалуюсь. Так мы делали на тестовом сервере.
А вобще начали разбираться, потому, что у нас есть проблема с инвалидацией.
Почему то кеш не обновляется по полю slug=.
Сервер уже много раз был перезагружен, но все равно инвалидация не проходит.

Поле slug никак не хочет добавляться в ключ:

smembers "schemes:catalog.brand"

Вот и пытаемся разобраться.

from django-cacheops.

Suor avatar Suor commented on August 15, 2024

Что значит кэш не обновляется по полю slug? Идеальный ответ был бы в виде
теста :-)

from django-cacheops.

MikeVL avatar MikeVL commented on August 15, 2024

У нас запросы вида Brand.objects.get(slug=***) не инвалидируются.
Я начал искать проблему, и думал проблема в том, что я описал в первом посте.

Вчера вечером в ключ "schemes:catalog.brand" я в ручную добавил поле slug.
Но сегодня утром проверил, и оказалось что данный ключ вобще не существует.

Я создал его в ручную. Добавил в него поля id и slug.

Через несколько часов, slug удалился, но добавился is_active.

Каким образом могло поле slug удалиться из ключа "schemes:catalog.brand" ?
Деплоев не делали, не перезагружали.
Запущено 8 демонов uwsgi с тредами.

from django-cacheops.

Suor avatar Suor commented on August 15, 2024

Сейчас, просмотрел код. Теоретически возможна ситуация когда происходит рассинхронизация схем в памяти процесса и в редисе при частом обновлении какого-то m2m.

Стоит попробовать использовать master кешопса отсюда, в нём проблема устранена.

from django-cacheops.

MikeVL avatar MikeVL commented on August 15, 2024

Поставил из мастера, понаблюдаю как будет работать.

from django-cacheops.

MikeVL avatar MikeVL commented on August 15, 2024

Не знаю, нормально или нет, создались вот такие ключики:

redis 127.0.0.1:6379> smembers schemes:catalog.brand
 1) "geo_id,geo_id,is_active"
 2) "geo_id,geo_id,geo_id,geo_id,is_active"
 3) "office_id"
 4) "is_active"
 5) "geo_id,geo_id,geo_id,is_active"
 6) "id"
 7) "is_active,geo_id,geo_id,geo_id,geo_id"
 8) "is_active,geo_id,geo_id,geo_id"
 9) "is_active,geo_id,geo_id"
10) "geo_id,is_active"
11) "is_active,geo_id"
12) "slug"

В коде есть такие запросы:

Brand.objects.filter(is_active=True).exclude(geo__in=[19, 25, 4, 13]).defer(*defer_fields).order_by('title')
Brand.objects.filter(is_active=True, geo=19).defer(*defer_fields).order_by('title')
Brand.objects.filter(is_active=True, geo=25).defer(*defer_fields).order_by('title')
Brand.objects.filter(is_active=True, geo=4).defer(*defer_fields).order_by('title')
Brand.objects.filter(is_active=True, geo=13).defer(*defer_fields).order_by('title')

from django-cacheops.

MikeVL avatar MikeVL commented on August 15, 2024

Также, в случае рестарта Redis, пока не рестартану приложение, получаю такую ошибку:

Traceback (most recent call last):
File "/usr/local/lib/python2.7/dist-packages/Django-1.5.5-py2.7.egg/django/core/handlers/base.py", line 115, in get_response response = callback(request, *callback_args, **callback_kwargs)
File "/usr/local/lib/python2.7/dist-packages/newrelic-2.12.0.10-py2.7-linux-x86_64.egg/newrelic/hooks/framework_django.py", line 492, in wrapper return wrapped(*args, **kwargs)
File "/usr/local/lib/python2.7/dist-packages/vluki-5.2.3-py2.7.egg/vluki/contrib/news/views.py", line 126, in day_archive page_item = paginator.page(page)
File "/usr/local/lib/python2.7/dist-packages/Django-1.5.5-py2.7.egg/django/core/paginator.py", line 40, in page number = self.validate_number(number)
File "/usr/local/lib/python2.7/dist-packages/Django-1.5.5-py2.7.egg/django/core/paginator.py", line 31, in validate_number if number > self.num_pages:
File "/usr/local/lib/python2.7/dist-packages/Django-1.5.5-py2.7.egg/django/core/paginator.py", line 63, in _get_num_pages if self.count == 0 and not self.allow_empty_first_page:
File "/usr/local/lib/python2.7/dist-packages/Django-1.5.5-py2.7.egg/django/core/paginator.py", line 51, in _get_count self._count = self.object_list.count()
File "/usr/local/lib/python2.7/dist-packages/cacheops/query.py", line 365, in count return cached_as(self, extra='count')(self._no_monkey.count)(self)
File "/usr/local/lib/python2.7/dist-packages/cacheops/query.py", line 100, in wrapper queryset._cache_results(cache_key, result, timeout)
File "/usr/local/lib/python2.7/dist-packages/cacheops/query.py", line 258, in _cache_results cache_thing(self.model, cache_key, results, cond_dnf, timeout or self._cacheconf['timeout'])
File "/usr/local/lib/python2.7/dist-packages/cacheops/query.py", line 58, in cache_thing model._cacheprofile['timeout'] + 10
File "/usr/local/lib/python2.7/dist-packages/redis-2.8.0-py2.7.egg/redis/client.py", line 2047, in __call__ return client.evalsha(self.sha, len(keys), *args)
File "/usr/local/lib/python2.7/dist-packages/redis-2.8.0-py2.7.egg/redis/client.py", line 1470, in evalsha return self.execute_command('EVALSHA', sha, numkeys, *keys_and_args)
File "/usr/local/lib/python2.7/dist-packages/redis-2.8.0-py2.7.egg/redis/client.py", line 394, in execute_command return self.parse_response(connection, command_name, **options)
File "/usr/local/lib/python2.7/dist-packages/redis-2.8.0-py2.7.egg/redis/client.py", line 404, in parse_response response = connection.read_response()
File "/usr/local/lib/python2.7/dist-packages/redis-2.8.0-py2.7.egg/redis/connection.py", line 316, in read_response raise response

ResponseError: NOSCRIPT No matching script. Please use EVAL.

from django-cacheops.

Suor avatar Suor commented on August 15, 2024

Ключики - ненормально, даже 2 ненормальности:

  • имена полей неупорядочены (я это поправил только что)
  • поля дублируются. Это, по-идее, может возникать только при запросах вида Brand.objects.cache().filter(id=1).filter(id=2). Совсем не исключено, если запросы строятся в результате какой-то логики, в цикле там.

from django-cacheops.

Suor avatar Suor commented on August 15, 2024

Ах, да. главный вопрос. Инвалидация-то работает?

from django-cacheops.

Suor avatar Suor commented on August 15, 2024

Проблема с ResponseError: NOSCRIPT No matching script. решается обновлением питоньего redis клиента до последней версии:

pip install -U redis

from django-cacheops.

MikeVL avatar MikeVL commented on August 15, 2024

Инвалидация да, работает. Пока проблем не было.

  • По поводу дубликации полей. Я на тестовом сервере очистил кэш и сделал вот этот запрос:
    Brand.objects.filter(is_active=True).exclude(geo__in=[19, 25, 4, 13]).defer(*defer_fields).order_by('title')

Результат:

redis 127.0.0.1:6379[2]> smembers "schemes:catalog.brand"
1) "geo_id,geo_id,geo_id,is_active"
2) "geo_id,geo_id,is_active"
3) "geo_id,geo_id,geo_id,geo_id,is_active"
4) "geo_id,is_active"
5) "is_active"

from django-cacheops.

Suor avatar Suor commented on August 15, 2024

Попробовал воспроизвести, у меня не получается. Можно попробовать следующее:

  1. Выполнить то же самое при включеном мониторе редиса redis-cli -n <cacheops-db> monitor и послать мне лог.
  2. Постепенно упрощать запрос и модель пока косяк сохраняется. Послать мне оставшийся код, включая модель или оформить из него тест.

1 можно сделать быстро. 2 - в идеале. И обновить cacheops до последнего мастера перед тем как начинать )

from django-cacheops.

MikeVL avatar MikeVL commented on August 15, 2024

Код питона:

>>> from elec.contrib.catalog.models import Brand
>>> defer_fields = ['text', 'tizer', 'url', 'url_rus', 'keywords']
>>> Brand.objects.filter(is_active=True).exclude(geo__in=[19, 25, 4, 13]).defer(*defer_fields).order_by('title')

Лог redis:

mike@iMac-Mikhail:elec:master$ redis-cli -n 2 monitor
OK
1393245148.301567 [0 127.0.0.1:58483] "SELECT" "2"
1393245148.301692 [2 127.0.0.1:58483] "GET" "q:8f23cc431f27fd3c2d2fe9d519a40351"
1393245148.315951 [2 127.0.0.1:58483] "MULTI"
1393245148.316002 [2 127.0.0.1:58483] "GET" "schemes:catalog.brand:version"
1393245148.316031 [2 127.0.0.1:58483] "SMEMBERS" "schemes:catalog.brand"
1393245148.316058 [2 127.0.0.1:58483] "EXEC"
1393245148.316438 [2 127.0.0.1:58483] "MULTI"
1393245148.316461 [2 127.0.0.1:58483] "INCRBY" "schemes:catalog.brand:version" "1"
1393245148.316478 [2 127.0.0.1:58483] "SADD" "schemes:catalog.brand" "geo_id,is_active"
1393245148.316501 [2 127.0.0.1:58483] "SADD" "schemes:catalog.brand" "geo_id,geo_id,geo_id,geo_id,is_active"
1393245148.316518 [2 127.0.0.1:58483] "SADD" "schemes:catalog.brand" "geo_id,geo_id,is_active"
1393245148.316532 [2 127.0.0.1:58483] "SADD" "schemes:catalog.brand" "geo_id,geo_id,geo_id,is_active"
1393245148.316548 [2 127.0.0.1:58483] "SADD" "schemes:catalog.brand" "is_active"
1393245148.316563 [2 127.0.0.1:58483] "EXEC"
1393245148.318246 [2 127.0.0.1:58483] "MULTI"
1393245148.318316 [2 127.0.0.1:58483] "SETEX" "q:8f23cc431f27fd3c2d2fe9d519a40351" "900" "\x80\x02]q\x01(cdjango.db.models.base\nmodel_unpickle\nq\x02X\a\x00\x00\x00catalogq\x03U\x05Brandq\x04\x86]q\x05(U\x05tizerq\x06U\x04textq\aU\bkeywordsq\bU\x03urlq\tU\aurl_rusq\necdjango.db.models.query_utils\ndeferred_class_factory\nq\x0b\x87Rq\x0c}q\r(U\x05titleq\x0eX\x02\x00\x00\x003MU\tis_activeq\x0f\x88U\x06_stateq\x10cdjango.db.models.base\nModelState\nq\x11)\x81q\x12}q\x13(U\x06addingq\x14\x89U\x02dbq\x15U\adefaultq\x16ubU\x04slugq\x17X\x02\x00\x00\x003mU\toffice_idq\x18NU\x0clastmodifiedq\x19cdatetime\ndatetime\nq\x1aU\n\a\xde\x02\x13\x121'\x0e\xd2\xfc\x85Rq\x1bU\x04logoq\x1cX\"\x00\x00\x00files/2010/07/21/brand/3m-logo.gifU\x06geo_idq\x1dM\xdc\x01U\bpub_dateq\x1eh\x1aU\n\a\xda\a\x15\x15\x12\x18\x00\x00\x00\x85Rq\x1fU\x02idq M\xaf\x01ubh\x02h\x03h\x04\x86]q!(h\x06h\ah\bh\th\neh\x0b\x87Rq\"}q#(h\x0eX\x03\x00\x00\x00ABBh\x0f\x88h\x10h\x11)\x81q$}q%(h\x14\x89h\x15h\x16ubh\x17X\x03\x00\x00\x00abbh\x18Nh\x19h\x1aU\n\a\xdd\x0c\x10\x150/\x00\x00\x00\x85Rq&h\x1cX\x13\x00\x00\x00brands/abb/logo.gifh\x1dM\xd7\x01h\x1eh\x1aU\n\a\xd8\a\x03\x15:\x14\x00\x00\x00\x85Rq'h K#ubh\x02h\x03h\x04\x86]q((h\x06h\ah\bh\th\neh\x0b\x87Rq)}q*(h\x0eX\n\x00\x00\x00ABL SURSUMh\x0f\x88h\x10h\x11)\x81q+}q,(h\x14\x89h\x15h\x16ubh\x17X\n\x00\x00\x00abl-sursumh\x18Nh\x19h\x1aU\n\a\xdd\b\x1b\x15\x037\x00\x00\x00\x85Rq-h\x1cX\x1f\x00\x00\x00files/2013/08/27/brand/logo.gifh\x1dK\ah\x1eh\x1aU\n\a\xd8\a\x03\x15:\x14\x00\x00\x00\x85Rq.h K\x90ubh\x02h\x03h\x04\x86]q/(h\x06h\ah\bh\th\neh\x0b\x87Rq0}q1(h\x0eX\x0e\x00\x00\x00ABTECH Limitedh\x0f\x88h\x10h\x11)\x81q2}q3(h\x14\x89h\x15h\x16ubh\x17X\x0e\x00\x00\x00abtech-limitedh\x18Nh\x19h\x1aU\n\a\xdd\x05\x0f\x13\x166\x00\x00\x00\x85Rq4h\x1cX&\x00\x00\x00files/2012/03/05/brand/Abtech-logo.jpgh\x1dM\xd3\x01h\x1eh\x1aU\n\a\xdc\x03\x05\x11\"\x00\x00\x00\x00\x85Rq5h M\xd9\x01ubh\x02h\x03h\x04\x86]q6(h\x06h\ah\bh\th\neh\x0b\x87Rq7}q8(h\x0eX\x13\x00\x00\x00AEG Power Solutionsh\x0f\x88h\x10h\x11)\x81q9}q:(h\x14\x89h\x15h\x16ubh\x17X\x13\x00\x00\x00aeg-power-solutionsh\x18Nh\x19h\x1aU\n\a\xdd\x0c\x05\x0f\x00\x00\x00\x00\x00\x85Rq;h\x1cX\x1f\x00\x00\x00files/2013/02/05/brand/logo.jpgh\x1dK\ah\x1eh\x1aU\n\a\xd9\x06\x19\r.\x1c\x00\x00\x00\x85Rq<h Mo\x01ubh\x02h\x03h\x04\x86]q=(h\x06h\ah\bh\th\neh\x0b\x87Rq>}q?(h\x0eX\x05\x00\x00\x00AEMSAh\x0f\x88h\x10h\x11)\x81q@}qA(h\x14\x89h\x15h\x16ubh\x17X\x05\x00\x00\x00aemsah\x18Nh\x19h\x1aU\n\a\xdd\x03\x04\r:;\x00\x00\x00\x85RqBh\x1cX\x15\x00\x00\x00brands/aemsa/logo.gifh\x1dM\xda\x01h\x1eh\x1aU\n\a\xd8\a\x03\x15:\x14\x00\x00\x00\x85RqCh K\xd1ubh\x02h\x03h\x04\x86]qD(h\x06h\ah\bh\th\neh\x0b\x87RqE}qF(h\x0eX\x04\x00\x00\x00AKSAh\x0f\x88h\x10h\x11)\x81qG}qH(h\x14\x89h\x15h\x16ubh\x17X\x04\x00\x00\x00aksah\x18Nh\x19h\x1aU\n\a\xdd\x06\r\x1507\x00\x00\x00\x85RqIh\x1cX\x1f\x00\x00\x00files/2011/06/21/brand/logo.jpgh\x1dK\x18h\x1eh\x1aU\n\a\xd8\a\a\r\x05*\x00\x00\x00\x85RqJh M\x03\x01ubh\x02h\x03h\x04\x86]qK(h\x06h\ah\bh\th\neh\x0b\x87RqL}qM(h\x0eX\x05\x00\x00\x00ALFRAh\x0f\x88h\x10h\x11)\x81qN}qO(h\x14\x89h\x15h\x16ubh\x17X\x05\x00\x00\x00alfrah\x18Nh\x19h\x1aU\n\a\xdd\t\n\x14\x1d\r\x00\x00\x00\x85RqPh\x1cX\x1f\x00\x00\x00files/2013/02/05/brand/logo.gifh\x1dK\ah\x1eh\x1aU\n\a\xd9\x06\x04\x123\x0b\x00\x00\x00\x85RqQh Mh\x01ubh\x02h\x03h\x04\x86]qR(h\x06h\ah\bh\th\neh\x0b\x87RqS}qT(h\x0eX\x15\x00\x00\x00ALL-BRIGHT TECHNOLOGYh\x0f\x88h\x10h\x11)\x81qU}qV(h\x14\x89h\x15h\x16ubh\x17X\x1c\x00\x00\x00all-bright-technology-co-ltdh\x18Nh\x19h\x1aU\n\a\xdd\b\b\x139\x1e\x00\x00\x00\x85RqWh\x1cX\x1f\x00\x00\x00files/2013/06/17/brand/logo.jpgh\x1dM\xf1\x01h\x1eh\x1aU\n\a\xdd\x06\x11\x14\x051\x00\x00\x00\x85RqXh M\xfe\x01ubh\x02h\x03h\x04\x86]qY(h\x06h\ah\bh\th\neh\x0b\x87RqZ}q[(h\x0eX\b\x00\x00\x00ALPPILUXh\x0f\x88h\x10h\x11)\x81q\\}q](h\x14\x89h\x15h\x16ubh\x17X\b\x00\x00\x00alppiluxh\x18Nh\x19h\x1aU\n\a\xdd\x03\x04\x0e\x02\n\x00\x00\x00\x85Rq^h\x1cX \x00\x00\x00files/2013/02/05/brand/logo0.jpgh\x1dK\th\x1eh\x1aU\n\a\xd9\x05\r\x14\x02,\x00\x00\x00\x85Rq_h Mb\x01ubh\x02h\x03h\x04\x86]q`(h\x06h\ah\bh\th\neh\x0b\x87Rqa}qb(h\x0eX\x0c\x00\x00\x00ANAM-Legrandh\x0f\x88h\x10h\x11)\x81qc}qd(h\x14\x89h\x15h\x16ubh\x17X\x0c\x00\x00\x00anam-legrandh\x18Nh\x19h\x1aU\n\a\xdd\x03\x04\x0e\x03\t\x00\x00\x00\x85Rqeh\x1cX\x1c\x00\x00\x00brands/anam-legrand/logo.JPGh\x1dM\xf3\x01h\x1eh\x1aU\n\a\xd9\x06\x1d\x0e\x19.\x00\x00\x00\x85Rqfh Mv\x01ubh\x02h\x03h\x04\x86]qg(h\x06h\ah\bh\th\neh\x0b\x87Rqh}qi(h\x0eX\x06\x00\x00\x00APATORh\x0f\x88h\x10h\x11)\x81qj}qk(h\x14\x89h\x15h\x16ubh\x17X\x06\x00\x00\x00apatorh\x18Nh\x19h\x1aU\n\a\xdd\b\x13\x13\t7\x00\x00\x00\x85Rqlh\x1cX\"\x00\x00\x00files/2013/02/06/brand/Logotip.jpgh\x1dK\x12h\x1eh\x1aU\n\a\xd8\a\x03\x15:\x14\x00\x00\x00\x85Rqmh K%ubh\x02h\x03h\x04\x86]qn(h\x06h\ah\bh\th\neh\x0b\x87Rqo}qp(h\x0eX\x03\x00\x00\x00APCh\x0f\x88h\x10h\x11)\x81qq}qr(h\x14\x89h\x15h\x16ubh\x17X\x03\x00\x00\x00apch\x18Nh\x19h\x1aU\n\a\xdd\x02\x06\x12\x02\x12\x00\x00\x00\x85Rqsh\x1cX\x13\x00\x00\x00brands/apc/logo.gifh\x1dM\xdc\x01h\x1eh\x1aU\n\a\xd9\x05\x1a\x13\r\n\x00\x00\x00\x85Rqth Mg\x01ubh\x02h\x03h\x04\x86]qu(h\x06h\ah\bh\th\neh\x0b\x87Rqv}qw(h\x0eX\x05\x00\x00\x00APE\xd0\x9ch\x0f\x88h\x10h\x11)\x81qx}qy(h\x14\x89h\x15h\x16ubh\x17X\x04\x00\x00\x00apemh\x18Nh\x19h\x1aU\n\a\xdd\x04\b\r 2\x00\x00\x00\x85Rqzh\x1cX$\x00\x00\x00files/2013/03/29/brand/logo-apem.gifh\x1dM\xd4\x01h\x1eh\x1aU\n\a\xdd\x03\x1d\x10\x031\x00\x00\x00\x85Rq{h M\xe3\x01ubh\x02h\x03h\x04\x86]q|(h\x06h\ah\bh\th\neh\x0b\x87Rq}}q~(h\x0eX\x04\x00\x00\x00APPAh\x0f\x88h\x10h\x11)\x81q\x7f}q\x80(h\x14\x89h\x15h\x16ubh\x17X\x04\x00\x00\x00appah\x18Nh\x19h\x1aU\n\a\xdd\b\b\x14;\x0b\x00\x00\x00\x85Rq\x81h\x1cX\x1f\x00\x00\x00files/2013/02/06/brand/appa.gifh\x1dM\xf1\x01h\x1eh\x1aU\n\a\xda\x05\x1c\x12-1\x00\x00\x00\x85Rq\x82h M\xa6\x01ubh\x02h\x03h\x04\x86]q\x83(h\x06h\ah\bh\th\neh\x0b\x87Rq\x84}q\x85(h\x0eX\a\x00\x00\x00AUSONIAh\x0f\x88h\x10h\x11)\x81q\x86}q\x87(h\x14\x89h\x15h\x16ubh\x17X\a\x00\x00\x00ausoniah\x18Nh\x19h\x1aU\n\a\xdd\x03\x04\x0e\b\x1b\x00\x00\x00\x85Rq\x88h\x1cX\x17\x00\x00\x00brands/ausonia/logo.gifh\x1dM\xd5\x01h\x1eh\x1aU\n\a\xd8\n\x1c\x10\a'\x00\x00\x00\x85Rq\x89h M\x1b\x01ubh\x02h\x03h\x04\x86]q\x8a(h\x06h\ah\bh\th\neh\x0b\x87Rq\x8b}q\x8c(h\x0eX\n\x00\x00\x00AUSPICIOUSh\x0f\x88h\x10h\x11)\x81q\x8d}q\x8e(h\x14\x89h\x15h\x16ubh\x17X\n\x00\x00\x00auspicioush\x18Nh\x19h\x1aU\n\a\xdd\n\x1e\x0e+\x1b\x00\x00\x00\x85Rq\x8fh\x1cX\x1a\x00\x00\x00brands/auspicious/logo.jpgh\x1dM\xf1\x01h\x1eh\x1aU\n\a\xd8\a\x03\x15:\x14\x00\x00\x00\x85Rq\x90h K\xedubh\x02h\x03h\x04\x86]q\x91(h\x06h\ah\bh\th\neh\x0b\x87Rq\x92}q\x93(h\x0eX\t\x00\x00\x00Advantechh\x0f\x88h\x10h\x11)\x81q\x94}q\x95(h\x14\x89h\x15h\x16ubh\x17X\t\x00\x00\x00advantechh\x18Nh\x19h\x1aU\n\a\xdd\t\n\x13\x1e\"\x00\x00\x00\x85Rq\x96h\x1cX\x19\x00\x00\x00brands/advantech/logo.gifh\x1dM\xdc\x01h\x1eh\x1aU\n\a\xd9\x01\x1b\x0c *\x00\x00\x00\x85Rq\x97h MB\x01ubh\x02h\x03h\x04\x86]q\x98(h\x06h\ah\bh\th\neh\x0b\x87Rq\x99}q\x9a(h\x0eX\b\x00\x00\x00Aeroflexh\x0f\x88h\x10h\x11)\x81q\x9b}q\x9c(h\x14\x89h\x15h\x16ubh\x17X\b\x00\x00\x00aeroflexh\x18Nh\x19h\x1aU\n\a\xdd\x06\x13\r*\x0b\x00\x00\x00\x85Rq\x9dh\x1cX#\x00\x00\x00files/2013/06/17/brand/Aeroflex.jpgh\x1dM\xdc\x01h\x1eh\x1aU\n\a\xdd\x06\x11\x14\x116\x00\x00\x00\x85Rq\x9eh M\xff\x01ubh\x02h\x03h\x04\x86]q\x9f(h\x06h\ah\bh\th\neh\x0b\x87Rq\xa0}q\xa1(h\x0eX\x14\x00\x00\x00Agilent Technologiesh\x0f\x88h\x10h\x11)\x81q\xa2}q\xa3(h\x14\x89h\x15h\x16ubh\x17X\x14\x00\x00\x00agilent-technologiesh\x18Nh\x19h\x1aU\n\a\xdd\x06\x13\r*\x05\x00\x00\x00\x85Rq\xa4h\x1cX \x00\x00\x00files/2013/06/17/brand/logo0.jpgh\x1dM\xdc\x01h\x1eh\x1aU\n\a\xdd\x06\x11\x14&\x16\x00\x00\x00\x85Rq\xa5h M\x00\x02ubh\x02h\x03h\x04\x86]q\xa6(h\x06h\ah\bh\th\neh\x0b\x87Rq\xa7}q\xa8(h\x0eX\x06\x00\x00\x00Alberth\x0f\x88h\x10h\x11)\x81q\xa9}q\xaa(h\x14\x89h\x15h\x16ubh\x17X\x11\x00\x00\x00albert-gmbh-co-kgh\x18Nh\x19h\x1aU\n\a\xdd\x02\x06\x15\x11:\x00\x00\x00\x85Rq\xabh\x1cX!\x00\x00\x00brands/albert-gmbh-co-kg/logo.gifh\x1dK\ah\x1eh\x1aU\n\a\xd9\x05\r\x12\x06\x1d\x00\x00\x00\x85Rq\xach Ma\x01ube."
1393245148.319300 [2 127.0.0.1:58483] "SADD" "conj:catalog.brand:is_active=True" "q:8f23cc431f27fd3c2d2fe9d519a40351"
1393245148.319323 [2 127.0.0.1:58483] "EXPIRE" "conj:catalog.brand:is_active=True" "910"
1393245148.319338 [2 127.0.0.1:58483] "SADD" "conj:catalog.brand:geo_id=None&is_active=True" "q:8f23cc431f27fd3c2d2fe9d519a40351"
1393245148.319363 [2 127.0.0.1:58483] "EXPIRE" "conj:catalog.brand:geo_id=None&is_active=True" "910"
1393245148.319381 [2 127.0.0.1:58483] "SADD" "conj:catalog.brand:geo_id=None&is_active=True" "q:8f23cc431f27fd3c2d2fe9d519a40351"
1393245148.319405 [2 127.0.0.1:58483] "EXPIRE" "conj:catalog.brand:geo_id=None&is_active=True" "910"
1393245148.319422 [2 127.0.0.1:58483] "SADD" "conj:catalog.brand:geo_id=None&geo_id=None&is_active=True" "q:8f23cc431f27fd3c2d2fe9d519a40351"
1393245148.319449 [2 127.0.0.1:58483] "EXPIRE" "conj:catalog.brand:geo_id=None&geo_id=None&is_active=True" "910"
1393245148.319469 [2 127.0.0.1:58483] "SADD" "conj:catalog.brand:geo_id=None&is_active=True" "q:8f23cc431f27fd3c2d2fe9d519a40351"
1393245148.319493 [2 127.0.0.1:58483] "EXPIRE" "conj:catalog.brand:geo_id=None&is_active=True" "910"
1393245148.319510 [2 127.0.0.1:58483] "SADD" "conj:catalog.brand:geo_id=None&geo_id=None&is_active=True" "q:8f23cc431f27fd3c2d2fe9d519a40351"
1393245148.319536 [2 127.0.0.1:58483] "EXPIRE" "conj:catalog.brand:geo_id=None&geo_id=None&is_active=True" "910"
1393245148.319555 [2 127.0.0.1:58483] "SADD" "conj:catalog.brand:geo_id=None&geo_id=None&is_active=True" "q:8f23cc431f27fd3c2d2fe9d519a40351"
1393245148.319581 [2 127.0.0.1:58483] "EXPIRE" "conj:catalog.brand:geo_id=None&geo_id=None&is_active=True" "910"
1393245148.319601 [2 127.0.0.1:58483] "SADD" "conj:catalog.brand:geo_id=None&geo_id=None&geo_id=None&is_active=True" "q:8f23cc431f27fd3c2d2fe9d519a40351"
1393245148.319630 [2 127.0.0.1:58483] "EXPIRE" "conj:catalog.brand:geo_id=None&geo_id=None&geo_id=None&is_active=True" "910"
1393245148.319653 [2 127.0.0.1:58483] "SADD" "conj:catalog.brand:geo_id=None&is_active=True" "q:8f23cc431f27fd3c2d2fe9d519a40351"
1393245148.319676 [2 127.0.0.1:58483] "EXPIRE" "conj:catalog.brand:geo_id=None&is_active=True" "910"
1393245148.319693 [2 127.0.0.1:58483] "SADD" "conj:catalog.brand:geo_id=None&geo_id=None&is_active=True" "q:8f23cc431f27fd3c2d2fe9d519a40351"
1393245148.319719 [2 127.0.0.1:58483] "EXPIRE" "conj:catalog.brand:geo_id=None&geo_id=None&is_active=True" "910"
1393245148.319739 [2 127.0.0.1:58483] "SADD" "conj:catalog.brand:geo_id=None&geo_id=None&is_active=True" "q:8f23cc431f27fd3c2d2fe9d519a40351"
1393245148.319765 [2 127.0.0.1:58483] "EXPIRE" "conj:catalog.brand:geo_id=None&geo_id=None&is_active=True" "910"
1393245148.319785 [2 127.0.0.1:58483] "SADD" "conj:catalog.brand:geo_id=None&geo_id=None&geo_id=None&is_active=True" "q:8f23cc431f27fd3c2d2fe9d519a40351"
1393245148.319814 [2 127.0.0.1:58483] "EXPIRE" "conj:catalog.brand:geo_id=None&geo_id=None&geo_id=None&is_active=True" "910"
1393245148.319836 [2 127.0.0.1:58483] "SADD" "conj:catalog.brand:geo_id=None&geo_id=None&is_active=True" "q:8f23cc431f27fd3c2d2fe9d519a40351"
1393245148.319862 [2 127.0.0.1:58483] "EXPIRE" "conj:catalog.brand:geo_id=None&geo_id=None&is_active=True" "910"
1393245148.319881 [2 127.0.0.1:58483] "SADD" "conj:catalog.brand:geo_id=None&geo_id=None&geo_id=None&is_active=True" "q:8f23cc431f27fd3c2d2fe9d519a40351"
1393245148.319910 [2 127.0.0.1:58483] "EXPIRE" "conj:catalog.brand:geo_id=None&geo_id=None&geo_id=None&is_active=True" "910"
1393245148.319932 [2 127.0.0.1:58483] "SADD" "conj:catalog.brand:geo_id=None&geo_id=None&geo_id=None&is_active=True" "q:8f23cc431f27fd3c2d2fe9d519a40351"
1393245148.319960 [2 127.0.0.1:58483] "EXPIRE" "conj:catalog.brand:geo_id=None&geo_id=None&geo_id=None&is_active=True" "910"
1393245148.319982 [2 127.0.0.1:58483] "SADD" "conj:catalog.brand:geo_id=None&geo_id=None&geo_id=None&geo_id=None&is_active=True" "q:8f23cc431f27fd3c2d2fe9d519a40351"
1393245148.320014 [2 127.0.0.1:58483] "EXPIRE" "conj:catalog.brand:geo_id=None&geo_id=None&geo_id=None&geo_id=None&is_active=True" "910"
1393245148.320065 [2 127.0.0.1:58483] "EXEC"

from django-cacheops.

MikeVL avatar MikeVL commented on August 15, 2024

Вариант 1: Brand.objects.filter(is_active=True).exclude(geo__in=[19, 25, 4, 13])

redis 127.0.0.1:6379[2]> smembers "schemes:catalog.brand"
1) "geo_id,geo_id,geo_id,is_active"
2) "geo_id,geo_id,is_active"
3) "geo_id,geo_id,geo_id,geo_id,is_active"
4) "geo_id,is_active"
5) "is_active"

Вариант 2 Brand.objects.exclude(geo__in=[19, 25, 4, 13])

redis 127.0.0.1:6379[2]> smembers "schemes:catalog.brand"
(empty list or set)

from django-cacheops.

Suor avatar Suor commented on August 15, 2024

Это явно очень старая версия cacheops, в последнем мастере не используются транзакции.

from django-cacheops.

MikeVL avatar MikeVL commented on August 15, 2024

Хм, я обновил до последнего мастера.

>>> cacheops.VERSION
(1, 3, 0)

Сейчас его полностью удалю и заново поставлю.

from django-cacheops.

Suor avatar Suor commented on August 15, 2024

Под очень старой я имею в виду "по сравнению с мастером".

И вообще происходит что-то странное, т.к. ошибка со скриптами (NOSCRIPT) может происходить только если используется новая версия, а MULTI может использоваться только если используется старая. Возможно, у вас там несколько версий cacheops завалялось.

from django-cacheops.

Suor avatar Suor commented on August 15, 2024

cacheops.VERSION показывает предыдущую версию. Я обновляю её только при релизе.

from django-cacheops.

MikeVL avatar MikeVL commented on August 15, 2024

redis-cli:

redis 127.0.0.1:6379[2]> keys *
1) "conj:catalog.brand:is_active=true"
2) "conj:catalog.brand:geo_id=userdata: 0x0&geo_id=userdata: 0x0&geo_id=userdata: 0x0&geo_id=userdata: 0x0&is_active=true"
3) "conj:catalog.brand:geo_id=userdata: 0x0&is_active=true"
4) "schemes:catalog.brand"
5) "conj:catalog.brand:geo_id=userdata: 0x0&geo_id=userdata: 0x0&is_active=true"
6) "q:8f23cc431f27fd3c2d2fe9d519a40351"
7) "conj:catalog.brand:geo_id=userdata: 0x0&geo_id=userdata: 0x0&geo_id=userdata: 0x0&is_active=true"
redis 127.0.0.1:6379[2]> smembers "schemes:catalog.brand"
1) "geo_id,geo_id,geo_id,is_active"
2) "geo_id,is_active"
3) "geo_id,geo_id,is_active"
4) "geo_id,geo_id,geo_id,geo_id,is_active"
5) "is_active"

monitor log:

$ redis-cli -n 2 monitor
OK
1393246276.588530 [0 127.0.0.1:58621] "SELECT" "2"
1393246276.588642 [2 127.0.0.1:58621] "GET" "q:8f23cc431f27fd3c2d2fe9d519a40351"
1393246276.603684 [2 127.0.0.1:58621] "SCRIPT" "LOAD" "local key = KEYS[1]\nlocal data = ARGV[1]\nlocal model = ARGV[2]\nlocal dnf = cjson.decode(ARGV[3])\nlocal timeout = ARGV[4]\nlocal inv_timeout = ARGV[5]\n\n-- Update schemes\nlocal schemes = {}\nfor _, conj in ipairs(dnf) do\n    local s = {}\n    for _, eq in ipairs(conj) do\n        table.insert(s, eq[1])\n    end\n    table.insert(schemes, table.concat(s, ','))\nend\nredis.call('sadd', 'schemes:' .. model, unpack(schemes))\n\n-- Write data to cache\nredis.call('setex', key, timeout, data)\n\nlocal conj_cache_key = function (model, conj)\n    local parts = {}\n    for _, eq in ipairs(conj) do\n        table.insert(parts, eq[1] .. '=' .. tostring(eq[2]))\n    end\n\n    return 'conj:' .. model .. ':' .. table.concat(parts, '&')\nend\n\n-- Add new cache_key to list of dependencies for every conjunction in dnf\nfor _, conj in ipairs(dnf) do\n    local conj_key = conj_cache_key(model, conj)\n    redis.call('sadd', conj_key, key)\n    redis.call('expire', conj_key, inv_timeout)\nend\n"
1393246276.604326 [2 127.0.0.1:58621] "EVALSHA" "988c4725c0487b06835d92253314c64fbc0d0607" "1" "q:8f23cc431f27fd3c2d2fe9d519a40351" "\x80\x02]q\x01(cdjango.db.models.base\nmodel_unpickle\nq\x02X\a\x00\x00\x00catalogq\x03U\x05Brandq\x04\x86]q\x05(U\x05tizerq\x06U\x04textq\aU\bkeywordsq\bU\x03urlq\tU\aurl_rusq\necdjango.db.models.query_utils\ndeferred_class_factory\nq\x0b\x87Rq\x0c}q\r(U\x05titleq\x0eX\x02\x00\x00\x003MU\tis_activeq\x0f\x88U\x06_stateq\x10cdjango.db.models.base\nModelState\nq\x11)\x81q\x12}q\x13(U\x06addingq\x14\x89U\x02dbq\x15U\adefaultq\x16ubU\x04slugq\x17X\x02\x00\x00\x003mU\toffice_idq\x18NU\x0clastmodifiedq\x19cdatetime\ndatetime\nq\x1aU\n\a\xde\x02\x13\x121'\x0e\xd2\xfc\x85Rq\x1bU\x04logoq\x1cX\"\x00\x00\x00files/2010/07/21/brand/3m-logo.gifU\x06geo_idq\x1dM\xdc\x01U\bpub_dateq\x1eh\x1aU\n\a\xda\a\x15\x15\x12\x18\x00\x00\x00\x85Rq\x1fU\x02idq M\xaf\x01ubh\x02h\x03h\x04\x86]q!(h\x06h\ah\bh\th\neh\x0b\x87Rq\"}q#(h\x0eX\x03\x00\x00\x00ABBh\x0f\x88h\x10h\x11)\x81q$}q%(h\x14\x89h\x15h\x16ubh\x17X\x03\x00\x00\x00abbh\x18Nh\x19h\x1aU\n\a\xdd\x0c\x10\x150/\x00\x00\x00\x85Rq&h\x1cX\x13\x00\x00\x00brands/abb/logo.gifh\x1dM\xd7\x01h\x1eh\x1aU\n\a\xd8\a\x03\x15:\x14\x00\x00\x00\x85Rq'h K#ubh\x02h\x03h\x04\x86]q((h\x06h\ah\bh\th\neh\x0b\x87Rq)}q*(h\x0eX\n\x00\x00\x00ABL SURSUMh\x0f\x88h\x10h\x11)\x81q+}q,(h\x14\x89h\x15h\x16ubh\x17X\n\x00\x00\x00abl-sursumh\x18Nh\x19h\x1aU\n\a\xdd\b\x1b\x15\x037\x00\x00\x00\x85Rq-h\x1cX\x1f\x00\x00\x00files/2013/08/27/brand/logo.gifh\x1dK\ah\x1eh\x1aU\n\a\xd8\a\x03\x15:\x14\x00\x00\x00\x85Rq.h K\x90ubh\x02h\x03h\x04\x86]q/(h\x06h\ah\bh\th\neh\x0b\x87Rq0}q1(h\x0eX\x0e\x00\x00\x00ABTECH Limitedh\x0f\x88h\x10h\x11)\x81q2}q3(h\x14\x89h\x15h\x16ubh\x17X\x0e\x00\x00\x00abtech-limitedh\x18Nh\x19h\x1aU\n\a\xdd\x05\x0f\x13\x166\x00\x00\x00\x85Rq4h\x1cX&\x00\x00\x00files/2012/03/05/brand/Abtech-logo.jpgh\x1dM\xd3\x01h\x1eh\x1aU\n\a\xdc\x03\x05\x11\"\x00\x00\x00\x00\x85Rq5h M\xd9\x01ubh\x02h\x03h\x04\x86]q6(h\x06h\ah\bh\th\neh\x0b\x87Rq7}q8(h\x0eX\x13\x00\x00\x00AEG Power Solutionsh\x0f\x88h\x10h\x11)\x81q9}q:(h\x14\x89h\x15h\x16ubh\x17X\x13\x00\x00\x00aeg-power-solutionsh\x18Nh\x19h\x1aU\n\a\xdd\x0c\x05\x0f\x00\x00\x00\x00\x00\x85Rq;h\x1cX\x1f\x00\x00\x00files/2013/02/05/brand/logo.jpgh\x1dK\ah\x1eh\x1aU\n\a\xd9\x06\x19\r.\x1c\x00\x00\x00\x85Rq<h Mo\x01ubh\x02h\x03h\x04\x86]q=(h\x06h\ah\bh\th\neh\x0b\x87Rq>}q?(h\x0eX\x05\x00\x00\x00AEMSAh\x0f\x88h\x10h\x11)\x81q@}qA(h\x14\x89h\x15h\x16ubh\x17X\x05\x00\x00\x00aemsah\x18Nh\x19h\x1aU\n\a\xdd\x03\x04\r:;\x00\x00\x00\x85RqBh\x1cX\x15\x00\x00\x00brands/aemsa/logo.gifh\x1dM\xda\x01h\x1eh\x1aU\n\a\xd8\a\x03\x15:\x14\x00\x00\x00\x85RqCh K\xd1ubh\x02h\x03h\x04\x86]qD(h\x06h\ah\bh\th\neh\x0b\x87RqE}qF(h\x0eX\x04\x00\x00\x00AKSAh\x0f\x88h\x10h\x11)\x81qG}qH(h\x14\x89h\x15h\x16ubh\x17X\x04\x00\x00\x00aksah\x18Nh\x19h\x1aU\n\a\xdd\x06\r\x1507\x00\x00\x00\x85RqIh\x1cX\x1f\x00\x00\x00files/2011/06/21/brand/logo.jpgh\x1dK\x18h\x1eh\x1aU\n\a\xd8\a\a\r\x05*\x00\x00\x00\x85RqJh M\x03\x01ubh\x02h\x03h\x04\x86]qK(h\x06h\ah\bh\th\neh\x0b\x87RqL}qM(h\x0eX\x05\x00\x00\x00ALFRAh\x0f\x88h\x10h\x11)\x81qN}qO(h\x14\x89h\x15h\x16ubh\x17X\x05\x00\x00\x00alfrah\x18Nh\x19h\x1aU\n\a\xdd\t\n\x14\x1d\r\x00\x00\x00\x85RqPh\x1cX\x1f\x00\x00\x00files/2013/02/05/brand/logo.gifh\x1dK\ah\x1eh\x1aU\n\a\xd9\x06\x04\x123\x0b\x00\x00\x00\x85RqQh Mh\x01ubh\x02h\x03h\x04\x86]qR(h\x06h\ah\bh\th\neh\x0b\x87RqS}qT(h\x0eX\x15\x00\x00\x00ALL-BRIGHT TECHNOLOGYh\x0f\x88h\x10h\x11)\x81qU}qV(h\x14\x89h\x15h\x16ubh\x17X\x1c\x00\x00\x00all-bright-technology-co-ltdh\x18Nh\x19h\x1aU\n\a\xdd\b\b\x139\x1e\x00\x00\x00\x85RqWh\x1cX\x1f\x00\x00\x00files/2013/06/17/brand/logo.jpgh\x1dM\xf1\x01h\x1eh\x1aU\n\a\xdd\x06\x11\x14\x051\x00\x00\x00\x85RqXh M\xfe\x01ubh\x02h\x03h\x04\x86]qY(h\x06h\ah\bh\th\neh\x0b\x87RqZ}q[(h\x0eX\b\x00\x00\x00ALPPILUXh\x0f\x88h\x10h\x11)\x81q\\}q](h\x14\x89h\x15h\x16ubh\x17X\b\x00\x00\x00alppiluxh\x18Nh\x19h\x1aU\n\a\xdd\x03\x04\x0e\x02\n\x00\x00\x00\x85Rq^h\x1cX \x00\x00\x00files/2013/02/05/brand/logo0.jpgh\x1dK\th\x1eh\x1aU\n\a\xd9\x05\r\x14\x02,\x00\x00\x00\x85Rq_h Mb\x01ubh\x02h\x03h\x04\x86]q`(h\x06h\ah\bh\th\neh\x0b\x87Rqa}qb(h\x0eX\x0c\x00\x00\x00ANAM-Legrandh\x0f\x88h\x10h\x11)\x81qc}qd(h\x14\x89h\x15h\x16ubh\x17X\x0c\x00\x00\x00anam-legrandh\x18Nh\x19h\x1aU\n\a\xdd\x03\x04\x0e\x03\t\x00\x00\x00\x85Rqeh\x1cX\x1c\x00\x00\x00brands/anam-legrand/logo.JPGh\x1dM\xf3\x01h\x1eh\x1aU\n\a\xd9\x06\x1d\x0e\x19.\x00\x00\x00\x85Rqfh Mv\x01ubh\x02h\x03h\x04\x86]qg(h\x06h\ah\bh\th\neh\x0b\x87Rqh}qi(h\x0eX\x06\x00\x00\x00APATORh\x0f\x88h\x10h\x11)\x81qj}qk(h\x14\x89h\x15h\x16ubh\x17X\x06\x00\x00\x00apatorh\x18Nh\x19h\x1aU\n\a\xdd\b\x13\x13\t7\x00\x00\x00\x85Rqlh\x1cX\"\x00\x00\x00files/2013/02/06/brand/Logotip.jpgh\x1dK\x12h\x1eh\x1aU\n\a\xd8\a\x03\x15:\x14\x00\x00\x00\x85Rqmh K%ubh\x02h\x03h\x04\x86]qn(h\x06h\ah\bh\th\neh\x0b\x87Rqo}qp(h\x0eX\x03\x00\x00\x00APCh\x0f\x88h\x10h\x11)\x81qq}qr(h\x14\x89h\x15h\x16ubh\x17X\x03\x00\x00\x00apch\x18Nh\x19h\x1aU\n\a\xdd\x02\x06\x12\x02\x12\x00\x00\x00\x85Rqsh\x1cX\x13\x00\x00\x00brands/apc/logo.gifh\x1dM\xdc\x01h\x1eh\x1aU\n\a\xd9\x05\x1a\x13\r\n\x00\x00\x00\x85Rqth Mg\x01ubh\x02h\x03h\x04\x86]qu(h\x06h\ah\bh\th\neh\x0b\x87Rqv}qw(h\x0eX\x05\x00\x00\x00APE\xd0\x9ch\x0f\x88h\x10h\x11)\x81qx}qy(h\x14\x89h\x15h\x16ubh\x17X\x04\x00\x00\x00apemh\x18Nh\x19h\x1aU\n\a\xdd\x04\b\r 2\x00\x00\x00\x85Rqzh\x1cX$\x00\x00\x00files/2013/03/29/brand/logo-apem.gifh\x1dM\xd4\x01h\x1eh\x1aU\n\a\xdd\x03\x1d\x10\x031\x00\x00\x00\x85Rq{h M\xe3\x01ubh\x02h\x03h\x04\x86]q|(h\x06h\ah\bh\th\neh\x0b\x87Rq}}q~(h\x0eX\x04\x00\x00\x00APPAh\x0f\x88h\x10h\x11)\x81q\x7f}q\x80(h\x14\x89h\x15h\x16ubh\x17X\x04\x00\x00\x00appah\x18Nh\x19h\x1aU\n\a\xdd\b\b\x14;\x0b\x00\x00\x00\x85Rq\x81h\x1cX\x1f\x00\x00\x00files/2013/02/06/brand/appa.gifh\x1dM\xf1\x01h\x1eh\x1aU\n\a\xda\x05\x1c\x12-1\x00\x00\x00\x85Rq\x82h M\xa6\x01ubh\x02h\x03h\x04\x86]q\x83(h\x06h\ah\bh\th\neh\x0b\x87Rq\x84}q\x85(h\x0eX\a\x00\x00\x00AUSONIAh\x0f\x88h\x10h\x11)\x81q\x86}q\x87(h\x14\x89h\x15h\x16ubh\x17X\a\x00\x00\x00ausoniah\x18Nh\x19h\x1aU\n\a\xdd\x03\x04\x0e\b\x1b\x00\x00\x00\x85Rq\x88h\x1cX\x17\x00\x00\x00brands/ausonia/logo.gifh\x1dM\xd5\x01h\x1eh\x1aU\n\a\xd8\n\x1c\x10\a'\x00\x00\x00\x85Rq\x89h M\x1b\x01ubh\x02h\x03h\x04\x86]q\x8a(h\x06h\ah\bh\th\neh\x0b\x87Rq\x8b}q\x8c(h\x0eX\n\x00\x00\x00AUSPICIOUSh\x0f\x88h\x10h\x11)\x81q\x8d}q\x8e(h\x14\x89h\x15h\x16ubh\x17X\n\x00\x00\x00auspicioush\x18Nh\x19h\x1aU\n\a\xdd\n\x1e\x0e+\x1b\x00\x00\x00\x85Rq\x8fh\x1cX\x1a\x00\x00\x00brands/auspicious/logo.jpgh\x1dM\xf1\x01h\x1eh\x1aU\n\a\xd8\a\x03\x15:\x14\x00\x00\x00\x85Rq\x90h K\xedubh\x02h\x03h\x04\x86]q\x91(h\x06h\ah\bh\th\neh\x0b\x87Rq\x92}q\x93(h\x0eX\t\x00\x00\x00Advantechh\x0f\x88h\x10h\x11)\x81q\x94}q\x95(h\x14\x89h\x15h\x16ubh\x17X\t\x00\x00\x00advantechh\x18Nh\x19h\x1aU\n\a\xdd\t\n\x13\x1e\"\x00\x00\x00\x85Rq\x96h\x1cX\x19\x00\x00\x00brands/advantech/logo.gifh\x1dM\xdc\x01h\x1eh\x1aU\n\a\xd9\x01\x1b\x0c *\x00\x00\x00\x85Rq\x97h MB\x01ubh\x02h\x03h\x04\x86]q\x98(h\x06h\ah\bh\th\neh\x0b\x87Rq\x99}q\x9a(h\x0eX\b\x00\x00\x00Aeroflexh\x0f\x88h\x10h\x11)\x81q\x9b}q\x9c(h\x14\x89h\x15h\x16ubh\x17X\b\x00\x00\x00aeroflexh\x18Nh\x19h\x1aU\n\a\xdd\x06\x13\r*\x0b\x00\x00\x00\x85Rq\x9dh\x1cX#\x00\x00\x00files/2013/06/17/brand/Aeroflex.jpgh\x1dM\xdc\x01h\x1eh\x1aU\n\a\xdd\x06\x11\x14\x116\x00\x00\x00\x85Rq\x9eh M\xff\x01ubh\x02h\x03h\x04\x86]q\x9f(h\x06h\ah\bh\th\neh\x0b\x87Rq\xa0}q\xa1(h\x0eX\x14\x00\x00\x00Agilent Technologiesh\x0f\x88h\x10h\x11)\x81q\xa2}q\xa3(h\x14\x89h\x15h\x16ubh\x17X\x14\x00\x00\x00agilent-technologiesh\x18Nh\x19h\x1aU\n\a\xdd\x06\x13\r*\x05\x00\x00\x00\x85Rq\xa4h\x1cX \x00\x00\x00files/2013/06/17/brand/logo0.jpgh\x1dM\xdc\x01h\x1eh\x1aU\n\a\xdd\x06\x11\x14&\x16\x00\x00\x00\x85Rq\xa5h M\x00\x02ubh\x02h\x03h\x04\x86]q\xa6(h\x06h\ah\bh\th\neh\x0b\x87Rq\xa7}q\xa8(h\x0eX\x06\x00\x00\x00Alberth\x0f\x88h\x10h\x11)\x81q\xa9}q\xaa(h\x14\x89h\x15h\x16ubh\x17X\x11\x00\x00\x00albert-gmbh-co-kgh\x18Nh\x19h\x1aU\n\a\xdd\x02\x06\x15\x11:\x00\x00\x00\x85Rq\xabh\x1cX!\x00\x00\x00brands/albert-gmbh-co-kg/logo.gifh\x1dK\ah\x1eh\x1aU\n\a\xd9\x05\r\x12\x06\x1d\x00\x00\x00\x85Rq\xach Ma\x01ube." "catalog.brand" "[[[\"is_active\", true]], [[\"geo_id\", null], [\"is_active\", true]], [[\"geo_id\", null], [\"is_active\", true]], [[\"geo_id\", null], [\"geo_id\", null], [\"is_active\", true]], [[\"geo_id\", null], [\"is_active\", true]], [[\"geo_id\", null], [\"geo_id\", null], [\"is_active\", true]], [[\"geo_id\", null], [\"geo_id\", null], [\"is_active\", true]], [[\"geo_id\", null], [\"geo_id\", null], [\"geo_id\", null], [\"is_active\", true]], [[\"geo_id\", null], [\"is_active\", true]], [[\"geo_id\", null], [\"geo_id\", null], [\"is_active\", true]], [[\"geo_id\", null], [\"geo_id\", null], [\"is_active\", true]], [[\"geo_id\", null], [\"geo_id\", null], [\"geo_id\", null], [\"is_active\", true]], [[\"geo_id\", null], [\"geo_id\", null], [\"is_active\", true]], [[\"geo_id\", null], [\"geo_id\", null], [\"geo_id\", null], [\"is_active\", true]], [[\"geo_id\", null], [\"geo_id\", null], [\"geo_id\", null], [\"is_active\", true]], [[\"geo_id\", null], [\"geo_id\", null], [\"geo_id\", null], [\"geo_id\", null], [\"is_active\", true]]]" "900" "910"
1393246276.605760 [2 lua] "sadd" "schemes:catalog.brand" "is_active" "geo_id,is_active" "geo_id,is_active" "geo_id,geo_id,is_active" "geo_id,is_active" "geo_id,geo_id,is_active" "geo_id,geo_id,is_active" "geo_id,geo_id,geo_id,is_active" "geo_id,is_active" "geo_id,geo_id,is_active" "geo_id,geo_id,is_active" "geo_id,geo_id,geo_id,is_active" "geo_id,geo_id,is_active" "geo_id,geo_id,geo_id,is_active" "geo_id,geo_id,geo_id,is_active" "geo_id,geo_id,geo_id,geo_id,is_active"
1393246276.605885 [2 lua] "setex" "q:8f23cc431f27fd3c2d2fe9d519a40351" "900" "\x80\x02]q\x01(cdjango.db.models.base\nmodel_unpickle\nq\x02X\a\x00\x00\x00catalogq\x03U\x05Brandq\x04\x86]q\x05(U\x05tizerq\x06U\x04textq\aU\bkeywordsq\bU\x03urlq\tU\aurl_rusq\necdjango.db.models.query_utils\ndeferred_class_factory\nq\x0b\x87Rq\x0c}q\r(U\x05titleq\x0eX\x02\x00\x00\x003MU\tis_activeq\x0f\x88U\x06_stateq\x10cdjango.db.models.base\nModelState\nq\x11)\x81q\x12}q\x13(U\x06addingq\x14\x89U\x02dbq\x15U\adefaultq\x16ubU\x04slugq\x17X\x02\x00\x00\x003mU\toffice_idq\x18NU\x0clastmodifiedq\x19cdatetime\ndatetime\nq\x1aU\n\a\xde\x02\x13\x121'\x0e\xd2\xfc\x85Rq\x1bU\x04logoq\x1cX\"\x00\x00\x00files/2010/07/21/brand/3m-logo.gifU\x06geo_idq\x1dM\xdc\x01U\bpub_dateq\x1eh\x1aU\n\a\xda\a\x15\x15\x12\x18\x00\x00\x00\x85Rq\x1fU\x02idq M\xaf\x01ubh\x02h\x03h\x04\x86]q!(h\x06h\ah\bh\th\neh\x0b\x87Rq\"}q#(h\x0eX\x03\x00\x00\x00ABBh\x0f\x88h\x10h\x11)\x81q$}q%(h\x14\x89h\x15h\x16ubh\x17X\x03\x00\x00\x00abbh\x18Nh\x19h\x1aU\n\a\xdd\x0c\x10\x150/\x00\x00\x00\x85Rq&h\x1cX\x13\x00\x00\x00brands/abb/logo.gifh\x1dM\xd7\x01h\x1eh\x1aU\n\a\xd8\a\x03\x15:\x14\x00\x00\x00\x85Rq'h K#ubh\x02h\x03h\x04\x86]q((h\x06h\ah\bh\th\neh\x0b\x87Rq)}q*(h\x0eX\n\x00\x00\x00ABL SURSUMh\x0f\x88h\x10h\x11)\x81q+}q,(h\x14\x89h\x15h\x16ubh\x17X\n\x00\x00\x00abl-sursumh\x18Nh\x19h\x1aU\n\a\xdd\b\x1b\x15\x037\x00\x00\x00\x85Rq-h\x1cX\x1f\x00\x00\x00files/2013/08/27/brand/logo.gifh\x1dK\ah\x1eh\x1aU\n\a\xd8\a\x03\x15:\x14\x00\x00\x00\x85Rq.h K\x90ubh\x02h\x03h\x04\x86]q/(h\x06h\ah\bh\th\neh\x0b\x87Rq0}q1(h\x0eX\x0e\x00\x00\x00ABTECH Limitedh\x0f\x88h\x10h\x11)\x81q2}q3(h\x14\x89h\x15h\x16ubh\x17X\x0e\x00\x00\x00abtech-limitedh\x18Nh\x19h\x1aU\n\a\xdd\x05\x0f\x13\x166\x00\x00\x00\x85Rq4h\x1cX&\x00\x00\x00files/2012/03/05/brand/Abtech-logo.jpgh\x1dM\xd3\x01h\x1eh\x1aU\n\a\xdc\x03\x05\x11\"\x00\x00\x00\x00\x85Rq5h M\xd9\x01ubh\x02h\x03h\x04\x86]q6(h\x06h\ah\bh\th\neh\x0b\x87Rq7}q8(h\x0eX\x13\x00\x00\x00AEG Power Solutionsh\x0f\x88h\x10h\x11)\x81q9}q:(h\x14\x89h\x15h\x16ubh\x17X\x13\x00\x00\x00aeg-power-solutionsh\x18Nh\x19h\x1aU\n\a\xdd\x0c\x05\x0f\x00\x00\x00\x00\x00\x85Rq;h\x1cX\x1f\x00\x00\x00files/2013/02/05/brand/logo.jpgh\x1dK\ah\x1eh\x1aU\n\a\xd9\x06\x19\r.\x1c\x00\x00\x00\x85Rq<h Mo\x01ubh\x02h\x03h\x04\x86]q=(h\x06h\ah\bh\th\neh\x0b\x87Rq>}q?(h\x0eX\x05\x00\x00\x00AEMSAh\x0f\x88h\x10h\x11)\x81q@}qA(h\x14\x89h\x15h\x16ubh\x17X\x05\x00\x00\x00aemsah\x18Nh\x19h\x1aU\n\a\xdd\x03\x04\r:;\x00\x00\x00\x85RqBh\x1cX\x15\x00\x00\x00brands/aemsa/logo.gifh\x1dM\xda\x01h\x1eh\x1aU\n\a\xd8\a\x03\x15:\x14\x00\x00\x00\x85RqCh K\xd1ubh\x02h\x03h\x04\x86]qD(h\x06h\ah\bh\th\neh\x0b\x87RqE}qF(h\x0eX\x04\x00\x00\x00AKSAh\x0f\x88h\x10h\x11)\x81qG}qH(h\x14\x89h\x15h\x16ubh\x17X\x04\x00\x00\x00aksah\x18Nh\x19h\x1aU\n\a\xdd\x06\r\x1507\x00\x00\x00\x85RqIh\x1cX\x1f\x00\x00\x00files/2011/06/21/brand/logo.jpgh\x1dK\x18h\x1eh\x1aU\n\a\xd8\a\a\r\x05*\x00\x00\x00\x85RqJh M\x03\x01ubh\x02h\x03h\x04\x86]qK(h\x06h\ah\bh\th\neh\x0b\x87RqL}qM(h\x0eX\x05\x00\x00\x00ALFRAh\x0f\x88h\x10h\x11)\x81qN}qO(h\x14\x89h\x15h\x16ubh\x17X\x05\x00\x00\x00alfrah\x18Nh\x19h\x1aU\n\a\xdd\t\n\x14\x1d\r\x00\x00\x00\x85RqPh\x1cX\x1f\x00\x00\x00files/2013/02/05/brand/logo.gifh\x1dK\ah\x1eh\x1aU\n\a\xd9\x06\x04\x123\x0b\x00\x00\x00\x85RqQh Mh\x01ubh\x02h\x03h\x04\x86]qR(h\x06h\ah\bh\th\neh\x0b\x87RqS}qT(h\x0eX\x15\x00\x00\x00ALL-BRIGHT TECHNOLOGYh\x0f\x88h\x10h\x11)\x81qU}qV(h\x14\x89h\x15h\x16ubh\x17X\x1c\x00\x00\x00all-bright-technology-co-ltdh\x18Nh\x19h\x1aU\n\a\xdd\b\b\x139\x1e\x00\x00\x00\x85RqWh\x1cX\x1f\x00\x00\x00files/2013/06/17/brand/logo.jpgh\x1dM\xf1\x01h\x1eh\x1aU\n\a\xdd\x06\x11\x14\x051\x00\x00\x00\x85RqXh M\xfe\x01ubh\x02h\x03h\x04\x86]qY(h\x06h\ah\bh\th\neh\x0b\x87RqZ}q[(h\x0eX\b\x00\x00\x00ALPPILUXh\x0f\x88h\x10h\x11)\x81q\\}q](h\x14\x89h\x15h\x16ubh\x17X\b\x00\x00\x00alppiluxh\x18Nh\x19h\x1aU\n\a\xdd\x03\x04\x0e\x02\n\x00\x00\x00\x85Rq^h\x1cX \x00\x00\x00files/2013/02/05/brand/logo0.jpgh\x1dK\th\x1eh\x1aU\n\a\xd9\x05\r\x14\x02,\x00\x00\x00\x85Rq_h Mb\x01ubh\x02h\x03h\x04\x86]q`(h\x06h\ah\bh\th\neh\x0b\x87Rqa}qb(h\x0eX\x0c\x00\x00\x00ANAM-Legrandh\x0f\x88h\x10h\x11)\x81qc}qd(h\x14\x89h\x15h\x16ubh\x17X\x0c\x00\x00\x00anam-legrandh\x18Nh\x19h\x1aU\n\a\xdd\x03\x04\x0e\x03\t\x00\x00\x00\x85Rqeh\x1cX\x1c\x00\x00\x00brands/anam-legrand/logo.JPGh\x1dM\xf3\x01h\x1eh\x1aU\n\a\xd9\x06\x1d\x0e\x19.\x00\x00\x00\x85Rqfh Mv\x01ubh\x02h\x03h\x04\x86]qg(h\x06h\ah\bh\th\neh\x0b\x87Rqh}qi(h\x0eX\x06\x00\x00\x00APATORh\x0f\x88h\x10h\x11)\x81qj}qk(h\x14\x89h\x15h\x16ubh\x17X\x06\x00\x00\x00apatorh\x18Nh\x19h\x1aU\n\a\xdd\b\x13\x13\t7\x00\x00\x00\x85Rqlh\x1cX\"\x00\x00\x00files/2013/02/06/brand/Logotip.jpgh\x1dK\x12h\x1eh\x1aU\n\a\xd8\a\x03\x15:\x14\x00\x00\x00\x85Rqmh K%ubh\x02h\x03h\x04\x86]qn(h\x06h\ah\bh\th\neh\x0b\x87Rqo}qp(h\x0eX\x03\x00\x00\x00APCh\x0f\x88h\x10h\x11)\x81qq}qr(h\x14\x89h\x15h\x16ubh\x17X\x03\x00\x00\x00apch\x18Nh\x19h\x1aU\n\a\xdd\x02\x06\x12\x02\x12\x00\x00\x00\x85Rqsh\x1cX\x13\x00\x00\x00brands/apc/logo.gifh\x1dM\xdc\x01h\x1eh\x1aU\n\a\xd9\x05\x1a\x13\r\n\x00\x00\x00\x85Rqth Mg\x01ubh\x02h\x03h\x04\x86]qu(h\x06h\ah\bh\th\neh\x0b\x87Rqv}qw(h\x0eX\x05\x00\x00\x00APE\xd0\x9ch\x0f\x88h\x10h\x11)\x81qx}qy(h\x14\x89h\x15h\x16ubh\x17X\x04\x00\x00\x00apemh\x18Nh\x19h\x1aU\n\a\xdd\x04\b\r 2\x00\x00\x00\x85Rqzh\x1cX$\x00\x00\x00files/2013/03/29/brand/logo-apem.gifh\x1dM\xd4\x01h\x1eh\x1aU\n\a\xdd\x03\x1d\x10\x031\x00\x00\x00\x85Rq{h M\xe3\x01ubh\x02h\x03h\x04\x86]q|(h\x06h\ah\bh\th\neh\x0b\x87Rq}}q~(h\x0eX\x04\x00\x00\x00APPAh\x0f\x88h\x10h\x11)\x81q\x7f}q\x80(h\x14\x89h\x15h\x16ubh\x17X\x04\x00\x00\x00appah\x18Nh\x19h\x1aU\n\a\xdd\b\b\x14;\x0b\x00\x00\x00\x85Rq\x81h\x1cX\x1f\x00\x00\x00files/2013/02/06/brand/appa.gifh\x1dM\xf1\x01h\x1eh\x1aU\n\a\xda\x05\x1c\x12-1\x00\x00\x00\x85Rq\x82h M\xa6\x01ubh\x02h\x03h\x04\x86]q\x83(h\x06h\ah\bh\th\neh\x0b\x87Rq\x84}q\x85(h\x0eX\a\x00\x00\x00AUSONIAh\x0f\x88h\x10h\x11)\x81q\x86}q\x87(h\x14\x89h\x15h\x16ubh\x17X\a\x00\x00\x00ausoniah\x18Nh\x19h\x1aU\n\a\xdd\x03\x04\x0e\b\x1b\x00\x00\x00\x85Rq\x88h\x1cX\x17\x00\x00\x00brands/ausonia/logo.gifh\x1dM\xd5\x01h\x1eh\x1aU\n\a\xd8\n\x1c\x10\a'\x00\x00\x00\x85Rq\x89h M\x1b\x01ubh\x02h\x03h\x04\x86]q\x8a(h\x06h\ah\bh\th\neh\x0b\x87Rq\x8b}q\x8c(h\x0eX\n\x00\x00\x00AUSPICIOUSh\x0f\x88h\x10h\x11)\x81q\x8d}q\x8e(h\x14\x89h\x15h\x16ubh\x17X\n\x00\x00\x00auspicioush\x18Nh\x19h\x1aU\n\a\xdd\n\x1e\x0e+\x1b\x00\x00\x00\x85Rq\x8fh\x1cX\x1a\x00\x00\x00brands/auspicious/logo.jpgh\x1dM\xf1\x01h\x1eh\x1aU\n\a\xd8\a\x03\x15:\x14\x00\x00\x00\x85Rq\x90h K\xedubh\x02h\x03h\x04\x86]q\x91(h\x06h\ah\bh\th\neh\x0b\x87Rq\x92}q\x93(h\x0eX\t\x00\x00\x00Advantechh\x0f\x88h\x10h\x11)\x81q\x94}q\x95(h\x14\x89h\x15h\x16ubh\x17X\t\x00\x00\x00advantechh\x18Nh\x19h\x1aU\n\a\xdd\t\n\x13\x1e\"\x00\x00\x00\x85Rq\x96h\x1cX\x19\x00\x00\x00brands/advantech/logo.gifh\x1dM\xdc\x01h\x1eh\x1aU\n\a\xd9\x01\x1b\x0c *\x00\x00\x00\x85Rq\x97h MB\x01ubh\x02h\x03h\x04\x86]q\x98(h\x06h\ah\bh\th\neh\x0b\x87Rq\x99}q\x9a(h\x0eX\b\x00\x00\x00Aeroflexh\x0f\x88h\x10h\x11)\x81q\x9b}q\x9c(h\x14\x89h\x15h\x16ubh\x17X\b\x00\x00\x00aeroflexh\x18Nh\x19h\x1aU\n\a\xdd\x06\x13\r*\x0b\x00\x00\x00\x85Rq\x9dh\x1cX#\x00\x00\x00files/2013/06/17/brand/Aeroflex.jpgh\x1dM\xdc\x01h\x1eh\x1aU\n\a\xdd\x06\x11\x14\x116\x00\x00\x00\x85Rq\x9eh M\xff\x01ubh\x02h\x03h\x04\x86]q\x9f(h\x06h\ah\bh\th\neh\x0b\x87Rq\xa0}q\xa1(h\x0eX\x14\x00\x00\x00Agilent Technologiesh\x0f\x88h\x10h\x11)\x81q\xa2}q\xa3(h\x14\x89h\x15h\x16ubh\x17X\x14\x00\x00\x00agilent-technologiesh\x18Nh\x19h\x1aU\n\a\xdd\x06\x13\r*\x05\x00\x00\x00\x85Rq\xa4h\x1cX \x00\x00\x00files/2013/06/17/brand/logo0.jpgh\x1dM\xdc\x01h\x1eh\x1aU\n\a\xdd\x06\x11\x14&\x16\x00\x00\x00\x85Rq\xa5h M\x00\x02ubh\x02h\x03h\x04\x86]q\xa6(h\x06h\ah\bh\th\neh\x0b\x87Rq\xa7}q\xa8(h\x0eX\x06\x00\x00\x00Alberth\x0f\x88h\x10h\x11)\x81q\xa9}q\xaa(h\x14\x89h\x15h\x16ubh\x17X\x11\x00\x00\x00albert-gmbh-co-kgh\x18Nh\x19h\x1aU\n\a\xdd\x02\x06\x15\x11:\x00\x00\x00\x85Rq\xabh\x1cX!\x00\x00\x00brands/albert-gmbh-co-kg/logo.gifh\x1dK\ah\x1eh\x1aU\n\a\xd9\x05\r\x12\x06\x1d\x00\x00\x00\x85Rq\xach Ma\x01ube."
1393246276.606827 [2 lua] "sadd" "conj:catalog.brand:is_active=true" "q:8f23cc431f27fd3c2d2fe9d519a40351"
1393246276.606849 [2 lua] "expire" "conj:catalog.brand:is_active=true" "910"
1393246276.606870 [2 lua] "sadd" "conj:catalog.brand:geo_id=userdata: 0x0&is_active=true" "q:8f23cc431f27fd3c2d2fe9d519a40351"
1393246276.606896 [2 lua] "expire" "conj:catalog.brand:geo_id=userdata: 0x0&is_active=true" "910"
1393246276.606919 [2 lua] "sadd" "conj:catalog.brand:geo_id=userdata: 0x0&is_active=true" "q:8f23cc431f27fd3c2d2fe9d519a40351"
1393246276.606945 [2 lua] "expire" "conj:catalog.brand:geo_id=userdata: 0x0&is_active=true" "910"
1393246276.606970 [2 lua] "sadd" "conj:catalog.brand:geo_id=userdata: 0x0&geo_id=userdata: 0x0&is_active=true" "q:8f23cc431f27fd3c2d2fe9d519a40351"
1393246276.607000 [2 lua] "expire" "conj:catalog.brand:geo_id=userdata: 0x0&geo_id=userdata: 0x0&is_active=true" "910"
1393246276.607028 [2 lua] "sadd" "conj:catalog.brand:geo_id=userdata: 0x0&is_active=true" "q:8f23cc431f27fd3c2d2fe9d519a40351"
1393246276.607053 [2 lua] "expire" "conj:catalog.brand:geo_id=userdata: 0x0&is_active=true" "910"
1393246276.607078 [2 lua] "sadd" "conj:catalog.brand:geo_id=userdata: 0x0&geo_id=userdata: 0x0&is_active=true" "q:8f23cc431f27fd3c2d2fe9d519a40351"
1393246276.607108 [2 lua] "expire" "conj:catalog.brand:geo_id=userdata: 0x0&geo_id=userdata: 0x0&is_active=true" "910"
1393246276.607136 [2 lua] "sadd" "conj:catalog.brand:geo_id=userdata: 0x0&geo_id=userdata: 0x0&is_active=true" "q:8f23cc431f27fd3c2d2fe9d519a40351"
1393246276.607166 [2 lua] "expire" "conj:catalog.brand:geo_id=userdata: 0x0&geo_id=userdata: 0x0&is_active=true" "910"
1393246276.607196 [2 lua] "sadd" "conj:catalog.brand:geo_id=userdata: 0x0&geo_id=userdata: 0x0&geo_id=userdata: 0x0&is_active=true" "q:8f23cc431f27fd3c2d2fe9d519a40351"
1393246276.607231 [2 lua] "expire" "conj:catalog.brand:geo_id=userdata: 0x0&geo_id=userdata: 0x0&geo_id=userdata: 0x0&is_active=true" "910"
1393246276.607264 [2 lua] "sadd" "conj:catalog.brand:geo_id=userdata: 0x0&is_active=true" "q:8f23cc431f27fd3c2d2fe9d519a40351"
1393246276.607289 [2 lua] "expire" "conj:catalog.brand:geo_id=userdata: 0x0&is_active=true" "910"
1393246276.607313 [2 lua] "sadd" "conj:catalog.brand:geo_id=userdata: 0x0&geo_id=userdata: 0x0&is_active=true" "q:8f23cc431f27fd3c2d2fe9d519a40351"
1393246276.607346 [2 lua] "expire" "conj:catalog.brand:geo_id=userdata: 0x0&geo_id=userdata: 0x0&is_active=true" "910"
1393246276.607375 [2 lua] "sadd" "conj:catalog.brand:geo_id=userdata: 0x0&geo_id=userdata: 0x0&is_active=true" "q:8f23cc431f27fd3c2d2fe9d519a40351"
1393246276.607405 [2 lua] "expire" "conj:catalog.brand:geo_id=userdata: 0x0&geo_id=userdata: 0x0&is_active=true" "910"
1393246276.607434 [2 lua] "sadd" "conj:catalog.brand:geo_id=userdata: 0x0&geo_id=userdata: 0x0&geo_id=userdata: 0x0&is_active=true" "q:8f23cc431f27fd3c2d2fe9d519a40351"
1393246276.607469 [2 lua] "expire" "conj:catalog.brand:geo_id=userdata: 0x0&geo_id=userdata: 0x0&geo_id=userdata: 0x0&is_active=true" "910"
1393246276.607502 [2 lua] "sadd" "conj:catalog.brand:geo_id=userdata: 0x0&geo_id=userdata: 0x0&is_active=true" "q:8f23cc431f27fd3c2d2fe9d519a40351"
1393246276.607532 [2 lua] "expire" "conj:catalog.brand:geo_id=userdata: 0x0&geo_id=userdata: 0x0&is_active=true" "910"
1393246276.607561 [2 lua] "sadd" "conj:catalog.brand:geo_id=userdata: 0x0&geo_id=userdata: 0x0&geo_id=userdata: 0x0&is_active=true" "q:8f23cc431f27fd3c2d2fe9d519a40351"
1393246276.607596 [2 lua] "expire" "conj:catalog.brand:geo_id=userdata: 0x0&geo_id=userdata: 0x0&geo_id=userdata: 0x0&is_active=true" "910"
1393246276.607635 [2 lua] "sadd" "conj:catalog.brand:geo_id=userdata: 0x0&geo_id=userdata: 0x0&geo_id=userdata: 0x0&is_active=true" "q:8f23cc431f27fd3c2d2fe9d519a40351"
1393246276.607667 [2 lua] "expire" "conj:catalog.brand:geo_id=userdata: 0x0&geo_id=userdata: 0x0&geo_id=userdata: 0x0&is_active=true" "910"
1393246276.607698 [2 lua] "sadd" "conj:catalog.brand:geo_id=userdata: 0x0&geo_id=userdata: 0x0&geo_id=userdata: 0x0&geo_id=userdata: 0x0&is_active=true" "q:8f23cc431f27fd3c2d2fe9d519a40351"
1393246276.607734 [2 lua] "expire" "conj:catalog.brand:geo_id=userdata: 0x0&geo_id=userdata: 0x0&geo_id=userdata: 0x0&geo_id=userdata: 0x0&is_active=true" "910"

from django-cacheops.

MikeVL avatar MikeVL commented on August 15, 2024

Вот еще интересное:

>>> from elec.contrib.catalog.models import Brand
>>> defer_fields = ['text', 'tizer', 'url', 'url_rus', 'keywords']
>>> Brand.objects.exclude(geo__in=[19, 25, 4, 13]).defer(*defer_fields).order_by('title')

redis-cli:

redis 127.0.0.1:6379[2]> keys *
1) "q:2cffc57652a84a521efb20a64730470f"
2) "conj:catalog.brand:"
3) "schemes:catalog.brand"
redis 127.0.0.1:6379[2]> smembers "schemes:catalog.brand"
1) ""

monitor log:

1393246487.573980 [0 127.0.0.1:58639] "SELECT" "2"
1393246487.574107 [2 127.0.0.1:58639] "GET" "q:2cffc57652a84a521efb20a64730470f"
1393246487.590006 [2 127.0.0.1:58639] "SCRIPT" "LOAD" "local key = KEYS[1]\nlocal data = ARGV[1]\nlocal model = ARGV[2]\nlocal dnf = cjson.decode(ARGV[3])\nlocal timeout = ARGV[4]\nlocal inv_timeout = ARGV[5]\n\n-- Update schemes\nlocal schemes = {}\nfor _, conj in ipairs(dnf) do\n    local s = {}\n    for _, eq in ipairs(conj) do\n        table.insert(s, eq[1])\n    end\n    table.insert(schemes, table.concat(s, ','))\nend\nredis.call('sadd', 'schemes:' .. model, unpack(schemes))\n\n-- Write data to cache\nredis.call('setex', key, timeout, data)\n\nlocal conj_cache_key = function (model, conj)\n    local parts = {}\n    for _, eq in ipairs(conj) do\n        table.insert(parts, eq[1] .. '=' .. tostring(eq[2]))\n    end\n\n    return 'conj:' .. model .. ':' .. table.concat(parts, '&')\nend\n\n-- Add new cache_key to list of dependencies for every conjunction in dnf\nfor _, conj in ipairs(dnf) do\n    local conj_key = conj_cache_key(model, conj)\n    redis.call('sadd', conj_key, key)\n    redis.call('expire', conj_key, inv_timeout)\nend\n"
1393246487.590543 [2 127.0.0.1:58639] "EVALSHA" "988c4725c0487b06835d92253314c64fbc0d0607" "1" "q:2cffc57652a84a521efb20a64730470f" "\x80\x02]q\x01(cdjango.db.models.base\nmodel_unpickle\nq\x02X\a\x00\x00\x00catalogq\x03U\x05Brandq\x04\x86]q\x05(U\x05tizerq\x06U\x04textq\aU\bkeywordsq\bU\x03urlq\tU\aurl_rusq\necdjango.db.models.query_utils\ndeferred_class_factory\nq\x0b\x87Rq\x0c}q\r(U\x05titleq\x0eX\x02\x00\x00\x003MU\tis_activeq\x0f\x88U\x06_stateq\x10cdjango.db.models.base\nModelState\nq\x11)\x81q\x12}q\x13(U\x06addingq\x14\x89U\x02dbq\x15U\adefaultq\x16ubU\x04slugq\x17X\x02\x00\x00\x003mU\toffice_idq\x18NU\x0clastmodifiedq\x19cdatetime\ndatetime\nq\x1aU\n\a\xde\x02\x13\x121'\x0e\xd2\xfc\x85Rq\x1bU\x04logoq\x1cX\"\x00\x00\x00files/2010/07/21/brand/3m-logo.gifU\x06geo_idq\x1dM\xdc\x01U\bpub_dateq\x1eh\x1aU\n\a\xda\a\x15\x15\x12\x18\x00\x00\x00\x85Rq\x1fU\x02idq M\xaf\x01ubh\x02h\x03h\x04\x86]q!(h\x06h\ah\bh\th\neh\x0b\x87Rq\"}q#(h\x0eX\x03\x00\x00\x00ABBh\x0f\x88h\x10h\x11)\x81q$}q%(h\x14\x89h\x15h\x16ubh\x17X\x03\x00\x00\x00abbh\x18Nh\x19h\x1aU\n\a\xdd\x0c\x10\x150/\x00\x00\x00\x85Rq&h\x1cX\x13\x00\x00\x00brands/abb/logo.gifh\x1dM\xd7\x01h\x1eh\x1aU\n\a\xd8\a\x03\x15:\x14\x00\x00\x00\x85Rq'h K#ubh\x02h\x03h\x04\x86]q((h\x06h\ah\bh\th\neh\x0b\x87Rq)}q*(h\x0eX\n\x00\x00\x00ABL SURSUMh\x0f\x88h\x10h\x11)\x81q+}q,(h\x14\x89h\x15h\x16ubh\x17X\n\x00\x00\x00abl-sursumh\x18Nh\x19h\x1aU\n\a\xdd\b\x1b\x15\x037\x00\x00\x00\x85Rq-h\x1cX\x1f\x00\x00\x00files/2013/08/27/brand/logo.gifh\x1dK\ah\x1eh\x1aU\n\a\xd8\a\x03\x15:\x14\x00\x00\x00\x85Rq.h K\x90ubh\x02h\x03h\x04\x86]q/(h\x06h\ah\bh\th\neh\x0b\x87Rq0}q1(h\x0eX\x0e\x00\x00\x00ABTECH Limitedh\x0f\x88h\x10h\x11)\x81q2}q3(h\x14\x89h\x15h\x16ubh\x17X\x0e\x00\x00\x00abtech-limitedh\x18Nh\x19h\x1aU\n\a\xdd\x05\x0f\x13\x166\x00\x00\x00\x85Rq4h\x1cX&\x00\x00\x00files/2012/03/05/brand/Abtech-logo.jpgh\x1dM\xd3\x01h\x1eh\x1aU\n\a\xdc\x03\x05\x11\"\x00\x00\x00\x00\x85Rq5h M\xd9\x01ubh\x02h\x03h\x04\x86]q6(h\x06h\ah\bh\th\neh\x0b\x87Rq7}q8(h\x0eX\x13\x00\x00\x00AEG Power Solutionsh\x0f\x88h\x10h\x11)\x81q9}q:(h\x14\x89h\x15h\x16ubh\x17X\x13\x00\x00\x00aeg-power-solutionsh\x18Nh\x19h\x1aU\n\a\xdd\x0c\x05\x0f\x00\x00\x00\x00\x00\x85Rq;h\x1cX\x1f\x00\x00\x00files/2013/02/05/brand/logo.jpgh\x1dK\ah\x1eh\x1aU\n\a\xd9\x06\x19\r.\x1c\x00\x00\x00\x85Rq<h Mo\x01ubh\x02h\x03h\x04\x86]q=(h\x06h\ah\bh\th\neh\x0b\x87Rq>}q?(h\x0eX\x05\x00\x00\x00AEMSAh\x0f\x88h\x10h\x11)\x81q@}qA(h\x14\x89h\x15h\x16ubh\x17X\x05\x00\x00\x00aemsah\x18Nh\x19h\x1aU\n\a\xdd\x03\x04\r:;\x00\x00\x00\x85RqBh\x1cX\x15\x00\x00\x00brands/aemsa/logo.gifh\x1dM\xda\x01h\x1eh\x1aU\n\a\xd8\a\x03\x15:\x14\x00\x00\x00\x85RqCh K\xd1ubh\x02h\x03h\x04\x86]qD(h\x06h\ah\bh\th\neh\x0b\x87RqE}qF(h\x0eX\x04\x00\x00\x00AKSAh\x0f\x88h\x10h\x11)\x81qG}qH(h\x14\x89h\x15h\x16ubh\x17X\x04\x00\x00\x00aksah\x18Nh\x19h\x1aU\n\a\xdd\x06\r\x1507\x00\x00\x00\x85RqIh\x1cX\x1f\x00\x00\x00files/2011/06/21/brand/logo.jpgh\x1dK\x18h\x1eh\x1aU\n\a\xd8\a\a\r\x05*\x00\x00\x00\x85RqJh M\x03\x01ubh\x02h\x03h\x04\x86]qK(h\x06h\ah\bh\th\neh\x0b\x87RqL}qM(h\x0eX\x05\x00\x00\x00ALFRAh\x0f\x88h\x10h\x11)\x81qN}qO(h\x14\x89h\x15h\x16ubh\x17X\x05\x00\x00\x00alfrah\x18Nh\x19h\x1aU\n\a\xdd\t\n\x14\x1d\r\x00\x00\x00\x85RqPh\x1cX\x1f\x00\x00\x00files/2013/02/05/brand/logo.gifh\x1dK\ah\x1eh\x1aU\n\a\xd9\x06\x04\x123\x0b\x00\x00\x00\x85RqQh Mh\x01ubh\x02h\x03h\x04\x86]qR(h\x06h\ah\bh\th\neh\x0b\x87RqS}qT(h\x0eX\x15\x00\x00\x00ALL-BRIGHT TECHNOLOGYh\x0f\x88h\x10h\x11)\x81qU}qV(h\x14\x89h\x15h\x16ubh\x17X\x1c\x00\x00\x00all-bright-technology-co-ltdh\x18Nh\x19h\x1aU\n\a\xdd\b\b\x139\x1e\x00\x00\x00\x85RqWh\x1cX\x1f\x00\x00\x00files/2013/06/17/brand/logo.jpgh\x1dM\xf1\x01h\x1eh\x1aU\n\a\xdd\x06\x11\x14\x051\x00\x00\x00\x85RqXh M\xfe\x01ubh\x02h\x03h\x04\x86]qY(h\x06h\ah\bh\th\neh\x0b\x87RqZ}q[(h\x0eX\x0e\x00\x00\x00ALLIED TELESISh\x0f\x89h\x10h\x11)\x81q\\}q](h\x14\x89h\x15h\x16ubh\x17X\x0e\x00\x00\x00allied-telesish\x18Nh\x19h\x1aU\n\a\xd9\x0b\b\x131:\x00\x00\x00\x85Rq^h\x1cX\x1e\x00\x00\x00brands/allied-telesis/logo.gifh\x1dM\xdc\x01h\x1eh\x1aU\n\a\xd8\a\x03\x15:\x14\x00\x00\x00\x85Rq_h K$ubh\x02h\x03h\x04\x86]q`(h\x06h\ah\bh\th\neh\x0b\x87Rqa}qb(h\x0eX\b\x00\x00\x00ALPPILUXh\x0f\x88h\x10h\x11)\x81qc}qd(h\x14\x89h\x15h\x16ubh\x17X\b\x00\x00\x00alppiluxh\x18Nh\x19h\x1aU\n\a\xdd\x03\x04\x0e\x02\n\x00\x00\x00\x85Rqeh\x1cX \x00\x00\x00files/2013/02/05/brand/logo0.jpgh\x1dK\th\x1eh\x1aU\n\a\xd9\x05\r\x14\x02,\x00\x00\x00\x85Rqfh Mb\x01ubh\x02h\x03h\x04\x86]qg(h\x06h\ah\bh\th\neh\x0b\x87Rqh}qi(h\x0eX\x0c\x00\x00\x00ANAM-Legrandh\x0f\x88h\x10h\x11)\x81qj}qk(h\x14\x89h\x15h\x16ubh\x17X\x0c\x00\x00\x00anam-legrandh\x18Nh\x19h\x1aU\n\a\xdd\x03\x04\x0e\x03\t\x00\x00\x00\x85Rqlh\x1cX\x1c\x00\x00\x00brands/anam-legrand/logo.JPGh\x1dM\xf3\x01h\x1eh\x1aU\n\a\xd9\x06\x1d\x0e\x19.\x00\x00\x00\x85Rqmh Mv\x01ubh\x02h\x03h\x04\x86]qn(h\x06h\ah\bh\th\neh\x0b\x87Rqo}qp(h\x0eX\x06\x00\x00\x00APATORh\x0f\x88h\x10h\x11)\x81qq}qr(h\x14\x89h\x15h\x16ubh\x17X\x06\x00\x00\x00apatorh\x18Nh\x19h\x1aU\n\a\xdd\b\x13\x13\t7\x00\x00\x00\x85Rqsh\x1cX\"\x00\x00\x00files/2013/02/06/brand/Logotip.jpgh\x1dK\x12h\x1eh\x1aU\n\a\xd8\a\x03\x15:\x14\x00\x00\x00\x85Rqth K%ubh\x02h\x03h\x04\x86]qu(h\x06h\ah\bh\th\neh\x0b\x87Rqv}qw(h\x0eX\x03\x00\x00\x00APCh\x0f\x88h\x10h\x11)\x81qx}qy(h\x14\x89h\x15h\x16ubh\x17X\x03\x00\x00\x00apch\x18Nh\x19h\x1aU\n\a\xdd\x02\x06\x12\x02\x12\x00\x00\x00\x85Rqzh\x1cX\x13\x00\x00\x00brands/apc/logo.gifh\x1dM\xdc\x01h\x1eh\x1aU\n\a\xd9\x05\x1a\x13\r\n\x00\x00\x00\x85Rq{h Mg\x01ubh\x02h\x03h\x04\x86]q|(h\x06h\ah\bh\th\neh\x0b\x87Rq}}q~(h\x0eX\x05\x00\x00\x00APE\xd0\x9ch\x0f\x88h\x10h\x11)\x81q\x7f}q\x80(h\x14\x89h\x15h\x16ubh\x17X\x04\x00\x00\x00apemh\x18Nh\x19h\x1aU\n\a\xdd\x04\b\r 2\x00\x00\x00\x85Rq\x81h\x1cX$\x00\x00\x00files/2013/03/29/brand/logo-apem.gifh\x1dM\xd4\x01h\x1eh\x1aU\n\a\xdd\x03\x1d\x10\x031\x00\x00\x00\x85Rq\x82h M\xe3\x01ubh\x02h\x03h\x04\x86]q\x83(h\x06h\ah\bh\th\neh\x0b\x87Rq\x84}q\x85(h\x0eX\x04\x00\x00\x00APPAh\x0f\x88h\x10h\x11)\x81q\x86}q\x87(h\x14\x89h\x15h\x16ubh\x17X\x04\x00\x00\x00appah\x18Nh\x19h\x1aU\n\a\xdd\b\b\x14;\x0b\x00\x00\x00\x85Rq\x88h\x1cX\x1f\x00\x00\x00files/2013/02/06/brand/appa.gifh\x1dM\xf1\x01h\x1eh\x1aU\n\a\xda\x05\x1c\x12-1\x00\x00\x00\x85Rq\x89h M\xa6\x01ubh\x02h\x03h\x04\x86]q\x8a(h\x06h\ah\bh\th\neh\x0b\x87Rq\x8b}q\x8c(h\x0eX\a\x00\x00\x00AUSONIAh\x0f\x88h\x10h\x11)\x81q\x8d}q\x8e(h\x14\x89h\x15h\x16ubh\x17X\a\x00\x00\x00ausoniah\x18Nh\x19h\x1aU\n\a\xdd\x03\x04\x0e\b\x1b\x00\x00\x00\x85Rq\x8fh\x1cX\x17\x00\x00\x00brands/ausonia/logo.gifh\x1dM\xd5\x01h\x1eh\x1aU\n\a\xd8\n\x1c\x10\a'\x00\x00\x00\x85Rq\x90h M\x1b\x01ubh\x02h\x03h\x04\x86]q\x91(h\x06h\ah\bh\th\neh\x0b\x87Rq\x92}q\x93(h\x0eX\n\x00\x00\x00AUSPICIOUSh\x0f\x88h\x10h\x11)\x81q\x94}q\x95(h\x14\x89h\x15h\x16ubh\x17X\n\x00\x00\x00auspicioush\x18Nh\x19h\x1aU\n\a\xdd\n\x1e\x0e+\x1b\x00\x00\x00\x85Rq\x96h\x1cX\x1a\x00\x00\x00brands/auspicious/logo.jpgh\x1dM\xf1\x01h\x1eh\x1aU\n\a\xd8\a\x03\x15:\x14\x00\x00\x00\x85Rq\x97h K\xedubh\x02h\x03h\x04\x86]q\x98(h\x06h\ah\bh\th\neh\x0b\x87Rq\x99}q\x9a(h\x0eX\t\x00\x00\x00Advantechh\x0f\x88h\x10h\x11)\x81q\x9b}q\x9c(h\x14\x89h\x15h\x16ubh\x17X\t\x00\x00\x00advantechh\x18Nh\x19h\x1aU\n\a\xdd\t\n\x13\x1e\"\x00\x00\x00\x85Rq\x9dh\x1cX\x19\x00\x00\x00brands/advantech/logo.gifh\x1dM\xdc\x01h\x1eh\x1aU\n\a\xd9\x01\x1b\x0c *\x00\x00\x00\x85Rq\x9eh MB\x01ubh\x02h\x03h\x04\x86]q\x9f(h\x06h\ah\bh\th\neh\x0b\x87Rq\xa0}q\xa1(h\x0eX\b\x00\x00\x00Aeroflexh\x0f\x88h\x10h\x11)\x81q\xa2}q\xa3(h\x14\x89h\x15h\x16ubh\x17X\b\x00\x00\x00aeroflexh\x18Nh\x19h\x1aU\n\a\xdd\x06\x13\r*\x0b\x00\x00\x00\x85Rq\xa4h\x1cX#\x00\x00\x00files/2013/06/17/brand/Aeroflex.jpgh\x1dM\xdc\x01h\x1eh\x1aU\n\a\xdd\x06\x11\x14\x116\x00\x00\x00\x85Rq\xa5h M\xff\x01ubh\x02h\x03h\x04\x86]q\xa6(h\x06h\ah\bh\th\neh\x0b\x87Rq\xa7}q\xa8(h\x0eX\x14\x00\x00\x00Agilent Technologiesh\x0f\x88h\x10h\x11)\x81q\xa9}q\xaa(h\x14\x89h\x15h\x16ubh\x17X\x14\x00\x00\x00agilent-technologiesh\x18Nh\x19h\x1aU\n\a\xdd\x06\x13\r*\x05\x00\x00\x00\x85Rq\xabh\x1cX \x00\x00\x00files/2013/06/17/brand/logo0.jpgh\x1dM\xdc\x01h\x1eh\x1aU\n\a\xdd\x06\x11\x14&\x16\x00\x00\x00\x85Rq\xach M\x00\x02ube." "catalog.brand" "[[]]" "900" "910"
1393246487.591592 [2 lua] "sadd" "schemes:catalog.brand" ""
1393246487.591612 [2 lua] "setex" "q:2cffc57652a84a521efb20a64730470f" "900" "\x80\x02]q\x01(cdjango.db.models.base\nmodel_unpickle\nq\x02X\a\x00\x00\x00catalogq\x03U\x05Brandq\x04\x86]q\x05(U\x05tizerq\x06U\x04textq\aU\bkeywordsq\bU\x03urlq\tU\aurl_rusq\necdjango.db.models.query_utils\ndeferred_class_factory\nq\x0b\x87Rq\x0c}q\r(U\x05titleq\x0eX\x02\x00\x00\x003MU\tis_activeq\x0f\x88U\x06_stateq\x10cdjango.db.models.base\nModelState\nq\x11)\x81q\x12}q\x13(U\x06addingq\x14\x89U\x02dbq\x15U\adefaultq\x16ubU\x04slugq\x17X\x02\x00\x00\x003mU\toffice_idq\x18NU\x0clastmodifiedq\x19cdatetime\ndatetime\nq\x1aU\n\a\xde\x02\x13\x121'\x0e\xd2\xfc\x85Rq\x1bU\x04logoq\x1cX\"\x00\x00\x00files/2010/07/21/brand/3m-logo.gifU\x06geo_idq\x1dM\xdc\x01U\bpub_dateq\x1eh\x1aU\n\a\xda\a\x15\x15\x12\x18\x00\x00\x00\x85Rq\x1fU\x02idq M\xaf\x01ubh\x02h\x03h\x04\x86]q!(h\x06h\ah\bh\th\neh\x0b\x87Rq\"}q#(h\x0eX\x03\x00\x00\x00ABBh\x0f\x88h\x10h\x11)\x81q$}q%(h\x14\x89h\x15h\x16ubh\x17X\x03\x00\x00\x00abbh\x18Nh\x19h\x1aU\n\a\xdd\x0c\x10\x150/\x00\x00\x00\x85Rq&h\x1cX\x13\x00\x00\x00brands/abb/logo.gifh\x1dM\xd7\x01h\x1eh\x1aU\n\a\xd8\a\x03\x15:\x14\x00\x00\x00\x85Rq'h K#ubh\x02h\x03h\x04\x86]q((h\x06h\ah\bh\th\neh\x0b\x87Rq)}q*(h\x0eX\n\x00\x00\x00ABL SURSUMh\x0f\x88h\x10h\x11)\x81q+}q,(h\x14\x89h\x15h\x16ubh\x17X\n\x00\x00\x00abl-sursumh\x18Nh\x19h\x1aU\n\a\xdd\b\x1b\x15\x037\x00\x00\x00\x85Rq-h\x1cX\x1f\x00\x00\x00files/2013/08/27/brand/logo.gifh\x1dK\ah\x1eh\x1aU\n\a\xd8\a\x03\x15:\x14\x00\x00\x00\x85Rq.h K\x90ubh\x02h\x03h\x04\x86]q/(h\x06h\ah\bh\th\neh\x0b\x87Rq0}q1(h\x0eX\x0e\x00\x00\x00ABTECH Limitedh\x0f\x88h\x10h\x11)\x81q2}q3(h\x14\x89h\x15h\x16ubh\x17X\x0e\x00\x00\x00abtech-limitedh\x18Nh\x19h\x1aU\n\a\xdd\x05\x0f\x13\x166\x00\x00\x00\x85Rq4h\x1cX&\x00\x00\x00files/2012/03/05/brand/Abtech-logo.jpgh\x1dM\xd3\x01h\x1eh\x1aU\n\a\xdc\x03\x05\x11\"\x00\x00\x00\x00\x85Rq5h M\xd9\x01ubh\x02h\x03h\x04\x86]q6(h\x06h\ah\bh\th\neh\x0b\x87Rq7}q8(h\x0eX\x13\x00\x00\x00AEG Power Solutionsh\x0f\x88h\x10h\x11)\x81q9}q:(h\x14\x89h\x15h\x16ubh\x17X\x13\x00\x00\x00aeg-power-solutionsh\x18Nh\x19h\x1aU\n\a\xdd\x0c\x05\x0f\x00\x00\x00\x00\x00\x85Rq;h\x1cX\x1f\x00\x00\x00files/2013/02/05/brand/logo.jpgh\x1dK\ah\x1eh\x1aU\n\a\xd9\x06\x19\r.\x1c\x00\x00\x00\x85Rq<h Mo\x01ubh\x02h\x03h\x04\x86]q=(h\x06h\ah\bh\th\neh\x0b\x87Rq>}q?(h\x0eX\x05\x00\x00\x00AEMSAh\x0f\x88h\x10h\x11)\x81q@}qA(h\x14\x89h\x15h\x16ubh\x17X\x05\x00\x00\x00aemsah\x18Nh\x19h\x1aU\n\a\xdd\x03\x04\r:;\x00\x00\x00\x85RqBh\x1cX\x15\x00\x00\x00brands/aemsa/logo.gifh\x1dM\xda\x01h\x1eh\x1aU\n\a\xd8\a\x03\x15:\x14\x00\x00\x00\x85RqCh K\xd1ubh\x02h\x03h\x04\x86]qD(h\x06h\ah\bh\th\neh\x0b\x87RqE}qF(h\x0eX\x04\x00\x00\x00AKSAh\x0f\x88h\x10h\x11)\x81qG}qH(h\x14\x89h\x15h\x16ubh\x17X\x04\x00\x00\x00aksah\x18Nh\x19h\x1aU\n\a\xdd\x06\r\x1507\x00\x00\x00\x85RqIh\x1cX\x1f\x00\x00\x00files/2011/06/21/brand/logo.jpgh\x1dK\x18h\x1eh\x1aU\n\a\xd8\a\a\r\x05*\x00\x00\x00\x85RqJh M\x03\x01ubh\x02h\x03h\x04\x86]qK(h\x06h\ah\bh\th\neh\x0b\x87RqL}qM(h\x0eX\x05\x00\x00\x00ALFRAh\x0f\x88h\x10h\x11)\x81qN}qO(h\x14\x89h\x15h\x16ubh\x17X\x05\x00\x00\x00alfrah\x18Nh\x19h\x1aU\n\a\xdd\t\n\x14\x1d\r\x00\x00\x00\x85RqPh\x1cX\x1f\x00\x00\x00files/2013/02/05/brand/logo.gifh\x1dK\ah\x1eh\x1aU\n\a\xd9\x06\x04\x123\x0b\x00\x00\x00\x85RqQh Mh\x01ubh\x02h\x03h\x04\x86]qR(h\x06h\ah\bh\th\neh\x0b\x87RqS}qT(h\x0eX\x15\x00\x00\x00ALL-BRIGHT TECHNOLOGYh\x0f\x88h\x10h\x11)\x81qU}qV(h\x14\x89h\x15h\x16ubh\x17X\x1c\x00\x00\x00all-bright-technology-co-ltdh\x18Nh\x19h\x1aU\n\a\xdd\b\b\x139\x1e\x00\x00\x00\x85RqWh\x1cX\x1f\x00\x00\x00files/2013/06/17/brand/logo.jpgh\x1dM\xf1\x01h\x1eh\x1aU\n\a\xdd\x06\x11\x14\x051\x00\x00\x00\x85RqXh M\xfe\x01ubh\x02h\x03h\x04\x86]qY(h\x06h\ah\bh\th\neh\x0b\x87RqZ}q[(h\x0eX\x0e\x00\x00\x00ALLIED TELESISh\x0f\x89h\x10h\x11)\x81q\\}q](h\x14\x89h\x15h\x16ubh\x17X\x0e\x00\x00\x00allied-telesish\x18Nh\x19h\x1aU\n\a\xd9\x0b\b\x131:\x00\x00\x00\x85Rq^h\x1cX\x1e\x00\x00\x00brands/allied-telesis/logo.gifh\x1dM\xdc\x01h\x1eh\x1aU\n\a\xd8\a\x03\x15:\x14\x00\x00\x00\x85Rq_h K$ubh\x02h\x03h\x04\x86]q`(h\x06h\ah\bh\th\neh\x0b\x87Rqa}qb(h\x0eX\b\x00\x00\x00ALPPILUXh\x0f\x88h\x10h\x11)\x81qc}qd(h\x14\x89h\x15h\x16ubh\x17X\b\x00\x00\x00alppiluxh\x18Nh\x19h\x1aU\n\a\xdd\x03\x04\x0e\x02\n\x00\x00\x00\x85Rqeh\x1cX \x00\x00\x00files/2013/02/05/brand/logo0.jpgh\x1dK\th\x1eh\x1aU\n\a\xd9\x05\r\x14\x02,\x00\x00\x00\x85Rqfh Mb\x01ubh\x02h\x03h\x04\x86]qg(h\x06h\ah\bh\th\neh\x0b\x87Rqh}qi(h\x0eX\x0c\x00\x00\x00ANAM-Legrandh\x0f\x88h\x10h\x11)\x81qj}qk(h\x14\x89h\x15h\x16ubh\x17X\x0c\x00\x00\x00anam-legrandh\x18Nh\x19h\x1aU\n\a\xdd\x03\x04\x0e\x03\t\x00\x00\x00\x85Rqlh\x1cX\x1c\x00\x00\x00brands/anam-legrand/logo.JPGh\x1dM\xf3\x01h\x1eh\x1aU\n\a\xd9\x06\x1d\x0e\x19.\x00\x00\x00\x85Rqmh Mv\x01ubh\x02h\x03h\x04\x86]qn(h\x06h\ah\bh\th\neh\x0b\x87Rqo}qp(h\x0eX\x06\x00\x00\x00APATORh\x0f\x88h\x10h\x11)\x81qq}qr(h\x14\x89h\x15h\x16ubh\x17X\x06\x00\x00\x00apatorh\x18Nh\x19h\x1aU\n\a\xdd\b\x13\x13\t7\x00\x00\x00\x85Rqsh\x1cX\"\x00\x00\x00files/2013/02/06/brand/Logotip.jpgh\x1dK\x12h\x1eh\x1aU\n\a\xd8\a\x03\x15:\x14\x00\x00\x00\x85Rqth K%ubh\x02h\x03h\x04\x86]qu(h\x06h\ah\bh\th\neh\x0b\x87Rqv}qw(h\x0eX\x03\x00\x00\x00APCh\x0f\x88h\x10h\x11)\x81qx}qy(h\x14\x89h\x15h\x16ubh\x17X\x03\x00\x00\x00apch\x18Nh\x19h\x1aU\n\a\xdd\x02\x06\x12\x02\x12\x00\x00\x00\x85Rqzh\x1cX\x13\x00\x00\x00brands/apc/logo.gifh\x1dM\xdc\x01h\x1eh\x1aU\n\a\xd9\x05\x1a\x13\r\n\x00\x00\x00\x85Rq{h Mg\x01ubh\x02h\x03h\x04\x86]q|(h\x06h\ah\bh\th\neh\x0b\x87Rq}}q~(h\x0eX\x05\x00\x00\x00APE\xd0\x9ch\x0f\x88h\x10h\x11)\x81q\x7f}q\x80(h\x14\x89h\x15h\x16ubh\x17X\x04\x00\x00\x00apemh\x18Nh\x19h\x1aU\n\a\xdd\x04\b\r 2\x00\x00\x00\x85Rq\x81h\x1cX$\x00\x00\x00files/2013/03/29/brand/logo-apem.gifh\x1dM\xd4\x01h\x1eh\x1aU\n\a\xdd\x03\x1d\x10\x031\x00\x00\x00\x85Rq\x82h M\xe3\x01ubh\x02h\x03h\x04\x86]q\x83(h\x06h\ah\bh\th\neh\x0b\x87Rq\x84}q\x85(h\x0eX\x04\x00\x00\x00APPAh\x0f\x88h\x10h\x11)\x81q\x86}q\x87(h\x14\x89h\x15h\x16ubh\x17X\x04\x00\x00\x00appah\x18Nh\x19h\x1aU\n\a\xdd\b\b\x14;\x0b\x00\x00\x00\x85Rq\x88h\x1cX\x1f\x00\x00\x00files/2013/02/06/brand/appa.gifh\x1dM\xf1\x01h\x1eh\x1aU\n\a\xda\x05\x1c\x12-1\x00\x00\x00\x85Rq\x89h M\xa6\x01ubh\x02h\x03h\x04\x86]q\x8a(h\x06h\ah\bh\th\neh\x0b\x87Rq\x8b}q\x8c(h\x0eX\a\x00\x00\x00AUSONIAh\x0f\x88h\x10h\x11)\x81q\x8d}q\x8e(h\x14\x89h\x15h\x16ubh\x17X\a\x00\x00\x00ausoniah\x18Nh\x19h\x1aU\n\a\xdd\x03\x04\x0e\b\x1b\x00\x00\x00\x85Rq\x8fh\x1cX\x17\x00\x00\x00brands/ausonia/logo.gifh\x1dM\xd5\x01h\x1eh\x1aU\n\a\xd8\n\x1c\x10\a'\x00\x00\x00\x85Rq\x90h M\x1b\x01ubh\x02h\x03h\x04\x86]q\x91(h\x06h\ah\bh\th\neh\x0b\x87Rq\x92}q\x93(h\x0eX\n\x00\x00\x00AUSPICIOUSh\x0f\x88h\x10h\x11)\x81q\x94}q\x95(h\x14\x89h\x15h\x16ubh\x17X\n\x00\x00\x00auspicioush\x18Nh\x19h\x1aU\n\a\xdd\n\x1e\x0e+\x1b\x00\x00\x00\x85Rq\x96h\x1cX\x1a\x00\x00\x00brands/auspicious/logo.jpgh\x1dM\xf1\x01h\x1eh\x1aU\n\a\xd8\a\x03\x15:\x14\x00\x00\x00\x85Rq\x97h K\xedubh\x02h\x03h\x04\x86]q\x98(h\x06h\ah\bh\th\neh\x0b\x87Rq\x99}q\x9a(h\x0eX\t\x00\x00\x00Advantechh\x0f\x88h\x10h\x11)\x81q\x9b}q\x9c(h\x14\x89h\x15h\x16ubh\x17X\t\x00\x00\x00advantechh\x18Nh\x19h\x1aU\n\a\xdd\t\n\x13\x1e\"\x00\x00\x00\x85Rq\x9dh\x1cX\x19\x00\x00\x00brands/advantech/logo.gifh\x1dM\xdc\x01h\x1eh\x1aU\n\a\xd9\x01\x1b\x0c *\x00\x00\x00\x85Rq\x9eh MB\x01ubh\x02h\x03h\x04\x86]q\x9f(h\x06h\ah\bh\th\neh\x0b\x87Rq\xa0}q\xa1(h\x0eX\b\x00\x00\x00Aeroflexh\x0f\x88h\x10h\x11)\x81q\xa2}q\xa3(h\x14\x89h\x15h\x16ubh\x17X\b\x00\x00\x00aeroflexh\x18Nh\x19h\x1aU\n\a\xdd\x06\x13\r*\x0b\x00\x00\x00\x85Rq\xa4h\x1cX#\x00\x00\x00files/2013/06/17/brand/Aeroflex.jpgh\x1dM\xdc\x01h\x1eh\x1aU\n\a\xdd\x06\x11\x14\x116\x00\x00\x00\x85Rq\xa5h M\xff\x01ubh\x02h\x03h\x04\x86]q\xa6(h\x06h\ah\bh\th\neh\x0b\x87Rq\xa7}q\xa8(h\x0eX\x14\x00\x00\x00Agilent Technologiesh\x0f\x88h\x10h\x11)\x81q\xa9}q\xaa(h\x14\x89h\x15h\x16ubh\x17X\x14\x00\x00\x00agilent-technologiesh\x18Nh\x19h\x1aU\n\a\xdd\x06\x13\r*\x05\x00\x00\x00\x85Rq\xabh\x1cX \x00\x00\x00files/2013/06/17/brand/logo0.jpgh\x1dM\xdc\x01h\x1eh\x1aU\n\a\xdd\x06\x11\x14&\x16\x00\x00\x00\x85Rq\xach M\x00\x02ube."
1393246487.592544 [2 lua] "sadd" "conj:catalog.brand:" "q:2cffc57652a84a521efb20a64730470f"
1393246487.592564 [2 lua] "expire" "conj:catalog.brand:" "910"
1393246495.139341 [0 127.0.0.1:58641] "SELECT" "2"
1393246496.918877 [2 127.0.0.1:58641] "keys" "*"
1393246533.685891 [2 127.0.0.1:58641] "smembers" "schemes:catalog.brand"

from django-cacheops.

MikeVL avatar MikeVL commented on August 15, 2024

Обновился до мастера, появилось две ошибки:

Traceback (most recent call last):

File "/usr/local/lib/python2.7/dist-packages/Django-1.5.5-py2.7.egg/django/core/handlers/base.py", line 115, in get_response response = callback(request, *callback_args, **callback_kwargs)
File "/usr/local/lib/python2.7/dist-packages/newrelic-2.12.0.10-py2.7-linux-x86_64.egg/newrelic/hooks/framework_django.py", line 492, in wrapper return wrapped(*args, **kwargs)
File "/usr/local/lib/python2.7/dist-packages/Django-1.5.5-py2.7.egg/django/views/generic/base.py", line 68, in view return self.dispatch(request, *args, **kwargs)
File "/usr/local/lib/python2.7/dist-packages/newrelic-2.12.0.10-py2.7-linux-x86_64.egg/newrelic/hooks/framework_django.py", line 829, in wrapper return wrapped(*args, **kwargs)
File "/usr/local/lib/python2.7/dist-packages/Django-1.5.5-py2.7.egg/django/views/generic/base.py", line 86, in dispatch return handler(request, *args, **kwargs)
File "/usr/local/lib/python2.7/dist-packages/vluki-5.2.3-py2.7.egg/vluki/views/facet.py", line 125, in get context = self.get_context_data()
File "/usr/local/lib/python2.7/dist-packages/vluki-5.2.3-py2.7.egg/vluki/contrib/spravka/views.py", line 23, in get_context_data context = super(OrgFacetView, self).get_context_data(**kwargs)
File "/usr/local/lib/python2.7/dist-packages/vluki-5.2.3-py2.7.egg/vluki/views/facet.py", line 117, in get_context_data context['facet_%s' % name] = self.facet_list(name)
File "/usr/local/lib/python2.7/dist-packages/vluki-5.2.3-py2.7.egg/vluki/views/facet.py", line 75, in facet_list return self.__get_dynamic_attr('facet_%s_list' % name)
File "/usr/local/lib/python2.7/dist-packages/vluki-5.2.3-py2.7.egg/vluki/views/facet.py", line 53, in __get_dynamic_attr return attr(*args, **kwargs)
File "/usr/local/lib/python2.7/dist-packages/vluki-5.2.3-py2.7.egg/vluki/contrib/spravka/views.py", line 58, in facet_spravka_rubrica_list rubricator_set = list(Rubricator.objects.filter(id__in=bulk_id))
File "/usr/local/lib/python2.7/dist-packages/Django-1.5.5-py2.7.egg/django/db/models/query.py", line 108, in __len__ self._result_cache.extend(self._iter)
File "/usr/local/lib/python2.7/dist-packages/cacheops/query.py", line 355, in iterator self._cache_results(cache_key, results)
File "/usr/local/lib/python2.7/dist-packages/cacheops/query.py", line 258, in _cache_results cache_thing(self.model, cache_key, results, cond_dnf, timeout or self._cacheconf['timeout'])
File "/usr/local/lib/python2.7/dist-packages/cacheops/query.py", line 58, in cache_thing model._cacheprofile['timeout'] + 10
File "/usr/local/lib/python2.7/dist-packages/redis/client.py", line 2215, in __call__ return client.evalsha(self.sha, len(keys), *args)
File "/usr/local/lib/python2.7/dist-packages/redis/client.py", line 1626, in evalsha return self.execute_command('EVALSHA', sha, numkeys, *keys_and_args)
File "/usr/local/lib/python2.7/dist-packages/redis/client.py", line 461, in execute_command return self.parse_response(connection, command_name, **options)
File "/usr/local/lib/python2.7/dist-packages/redis/client.py", line 471, in parse_response response = connection.read_response()
File "/usr/local/lib/python2.7/dist-packages/redis/connection.py", line 344, in read_response raise response

ResponseError: Error running script (call to f_988c4725c0487b06835d92253314c64fbc0d0607): @user_script:17: @user_script: 17: Wrong number of args calling Redis command From Lua script

Второй:
Traceback (most recent call last):

File "/usr/local/lib/python2.7/dist-packages/Django-1.6.2-py2.7.egg/django/core/handlers/base.py", line 114, in get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/usr/local/lib/python2.7/dist-packages/newrelic-2.14.0.11-py2.7-linux-x86_64.egg/newrelic/hooks/framework_django.py", line 492, in wrapper
    return wrapped(*args, **kwargs)
File "/usr/local/lib/python2.7/dist-packages/Django-1.6.2-py2.7.egg/django/contrib/admin/options.py", line 432, in wrapper
    return self.admin_site.admin_view(view)(*args, **kwargs)
File "/usr/local/lib/python2.7/dist-packages/Django-1.6.2-py2.7.egg/django/utils/decorators.py", line 99, in _wrapped_view
    response = view_func(request, *args, **kwargs)
File "/usr/local/lib/python2.7/dist-packages/Django-1.6.2-py2.7.egg/django/views/decorators/cache.py", line 52, in _wrapped_view_func
    response = view_func(request, *args, **kwargs)
File "/usr/local/lib/python2.7/dist-packages/Django-1.6.2-py2.7.egg/django/contrib/admin/sites.py", line 198, in inner
    return view(request, *args, **kwargs)
File "/usr/local/lib/python2.7/dist-packages/Django-1.6.2-py2.7.egg/django/utils/decorators.py", line 29, in _wrapper
    return bound_func(*args, **kwargs)
File "/usr/local/lib/python2.7/dist-packages/Django-1.6.2-py2.7.egg/django/utils/decorators.py", line 99, in _wrapped_view
    response = view_func(request, *args, **kwargs)
File "/usr/local/lib/python2.7/dist-packages/Django-1.6.2-py2.7.egg/django/utils/decorators.py", line 25, in bound_func
    return func(self, *args2, **kwargs2)
File "/usr/local/lib/python2.7/dist-packages/Django-1.6.2-py2.7.egg/django/db/transaction.py", line 339, in inner
    return func(*args, **kwargs)
File "/usr/local/lib/python2.7/dist-packages/Django-1.6.2-py2.7.egg/django/contrib/admin/options.py", line 1131, in add_view
    self.save_model(request, new_object, form, False)
File "/usr/local/lib/python2.7/dist-packages/Django-1.6.2-py2.7.egg/django/contrib/admin/options.py", line 860, in save_model
    obj.save()
File "/usr/local/lib/python2.7/dist-packages/Django-1.6.2-py2.7.egg/django/db/models/base.py", line 545, in save
    force_update=force_update, update_fields=update_fields)
File "/usr/local/lib/python2.7/dist-packages/Django-1.6.2-py2.7.egg/django/db/models/base.py", line 582, in save_base
    update_fields=update_fields, raw=raw, using=using)
File "/usr/local/lib/python2.7/dist-packages/Django-1.6.2-py2.7.egg/django/dispatch/dispatcher.py", line 185, in send
    response = receiver(signal=self, sender=sender, **named)
File "/usr/local/lib/python2.7/dist-packages/django_cacheops-1.3.0-py2.7.egg/cacheops/query.py", line 436, in _post_save
    invalidate_obj(instance)
File "/usr/local/lib/python2.7/dist-packages/django_cacheops-1.3.0-py2.7.egg/cacheops/invalidation.py", line 21, in invalidate_obj
    serialize_object(model, obj)
File "build/bdist.linux-x86_64/egg/redis/client.py", line 2215, in __call__
    return client.evalsha(self.sha, len(keys), *args)
File "build/bdist.linux-x86_64/egg/redis/client.py", line 1626, in evalsha
    return self.execute_command('EVALSHA', sha, numkeys, *keys_and_args)
File "build/bdist.linux-x86_64/egg/redis/client.py", line 461, in execute_command
    return self.parse_response(connection, command_name, **options)
File "build/bdist.linux-x86_64/egg/redis/client.py", line 471, in parse_response
    response = connection.read_response()
File "build/bdist.linux-x86_64/egg/redis/connection.py", line 344, in read_response
    raise response

ResponseError: Error running script (call to f_4ec8366cea22a453a31d2dc9de55a5a885192b9b): @user_script:29: user_script:29: too many results to unpack

from django-cacheops.

Suor avatar Suor commented on August 15, 2024

Скорее всего либо что-то не так с редисом, либо с redis-py. Какие версии используются? Используется ли hiredis? Какой версии?

from django-cacheops.

Suor avatar Suor commented on August 15, 2024

Хм. В принципе, первая ошибка может возникать если dnf() выдала пустой список - само по себе ошибка. Можешь сказать на каком запросе это происходит?

Вторая может быть каким-то ограничением lua, с которым я не сталкивался.

from django-cacheops.

Suor avatar Suor commented on August 15, 2024

Мне удалось воспроизвести первую ошибку, возникает при кешировании гарантированно пустого запроса, например Model.objects.filter(pk__in=[]). Починил в fc13ce9

from django-cacheops.

MikeVL avatar MikeVL commented on August 15, 2024

Вторая ошибка проявилась всего один раз. Причём это админка.
Вот такие версии:

hiredis==0.1.2
redis==2.9.1

# Server
redis_version:2.8.6

from django-cacheops.

Suor avatar Suor commented on August 15, 2024

Я исследовал вторую ошибку. Она возникает когда инвалидируется за раз большое количество ключей (граница где-то между 6000 и 8000). Ограничение вшито в Lua. Я добавил workaround.

Но, вообще, нехилая у вас там инвалидация в админке.

from django-cacheops.

MikeVL avatar MikeVL commented on August 15, 2024

Хм. Это добавлялся новый объект. В БД 32000 записей.

127.0.0.1:6379> keys conj:news.news:*
...
1856) "conj:news.news:company_id=8649&is_active=true"

Что делать в большими БД ?

from django-cacheops.

Suor avatar Suor commented on August 15, 2024

Количество записей особого значения не имеет, я использовал cacheops с большими БД. Дело было в количестве выборок инвалидируемых за раз, но сейчас и это будет работать.

Хотя если при обновлении одного объекта стирается кеш для нескольких тысяч запросов, то, возможно, такие запросы кешировать смысла не имеет. Такая ситуация может возникать когда вы делаете неспецифические выборки - без простых условий на равенство или только с очень распространённым условием, вроде is_active = True.

from django-cacheops.

Suor avatar Suor commented on August 15, 2024

Ещё один вариант наделать кучу запросов это так:

# выбрать новости за сутки
News.objects.filter(time_creared__gt=datetime.now() - timedelta(1)) 

datetime.now() каждый раз новый и соответственно все запросы будут разными. Можно либо отключить кеш для таких случаев, либо округлять время.

from django-cacheops.

MikeVL avatar MikeVL commented on August 15, 2024

Повторяющиеся geo_id остались, это норма?

127.0.0.1:6379> smembers schemes:catalog.brand
1) "id"
2) ""
3) "slug"
4) "is_active,geo_id,geo_id,geo_id,geo_id"
5) "is_active"
6) "is_active,geo_id,geo_id,geo_id"
7) "office_id"
8) "is_active,geo_id,geo_id"
9) "is_active,geo_id"

Вызов dnf(queryset)

>>> dnf(Brand.objects.filter(is_active=True).exclude(geo__in=[19, 25, 4, 14]))
[[('is_active', True)], [('geo_id', None), ('is_active', True)], [('geo_id', None), ('is_active', True)], [('geo_id', None), ('geo_id', None), ('is_active', True)], [('geo_id', None), ('is_active', True)], [('geo_id', None), ('geo_id', None), ('is_active', True)], [('geo_id', None), ('geo_id', None), ('is_active', True)], [('geo_id', None), ('geo_id', None), ('geo_id', None), ('is_active', True)], [('geo_id', None), ('is_active', True)], [('geo_id', None), ('geo_id', None), ('is_active', True)], [('geo_id', None), ('geo_id', None), ('is_active', True)], [('geo_id', None), ('geo_id', None), ('geo_id', None), ('is_active', True)], [('geo_id', None), ('geo_id', None), ('is_active', True)], [('geo_id', None), ('geo_id', None), ('geo_id', None), ('is_active', True)], [('geo_id', None), ('geo_id', None), ('geo_id', None), ('is_active', True)], [('geo_id', None), ('geo_id', None), ('geo_id', None), ('geo_id', None), ('is_active', True)]]

from django-cacheops.

Suor avatar Suor commented on August 15, 2024

Это добавляет некоторую неэффективность, но проблем от этого не будет.

from django-cacheops.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.