
Matwey
29.06.2016
20:48:34
Так что ты уже можешь начинать писать питон 3 реди код

Andrey
29.06.2016
20:50:41
да я не говорю, что не могу писать под третий, просто у меня пригар от хипстоты "ой у тебя проджект на второй ветке, ебать ты динозавр".

⬗VLAD⌶K⬖
29.06.2016
20:51:19
мужики давайте за теорию дарвина перетрем , мне вот оппоннент утверждает что нет переходных форм человека, вообще все лабуда и мы произошли от каких то там богов

dmks
29.06.2016
20:51:39

Google

⬗VLAD⌶K⬖
29.06.2016
20:52:31

Matwey
29.06.2016
20:52:36

⬗VLAD⌶K⬖
29.06.2016
20:53:01
просто сам доказать обратное не могу

Matwey
29.06.2016
20:53:22
Например, могу вспомнить что с collectd такое безобразие, что там платины только на втором питоне можно было писать.

dmks
29.06.2016
20:53:39

⬗VLAD⌶K⬖
29.06.2016
20:54:12

Matwey
29.06.2016
20:54:45
Ну "мы произошли от богов " это уже нефальсифицируемая гипотеза. Вести логический дискурс далее бессмысленно

Ivan
29.06.2016
20:55:10

Andrey
29.06.2016
20:55:50

dmks
29.06.2016
20:56:22

⬗VLAD⌶K⬖
29.06.2016
20:56:24

Matwey
29.06.2016
20:57:25

Andrey
29.06.2016
20:59:16

Google

abc
29.06.2016
21:00:47
Опциональная типизация

Matwey
29.06.2016
21:01:40

Andrey
29.06.2016
21:05:20
@abc @Ox2207 пожалуй погружусь в тему трешки посерьезней, спасибо

⬗VLAD⌶K⬖
29.06.2016
21:15:55
ссылка на архив обновлена , забираем коллекцию со всего интернета=)https://www.dropbox.com/sh/tbtps8r0i5hsfua/AACWPocw-YdYCGcLB9fGciYKa?dl=0

Meent
29.06.2016
21:49:37

Roman
29.06.2016
22:27:53

drjackild
29.06.2016
22:39:57
@pragus писать асинхронный код?

Costel Salanders
29.06.2016
22:49:38

⬗VLAD⌶K⬖
29.06.2016
22:50:06

Costel Salanders
29.06.2016
22:53:23
Попробую собрать

Maxim
29.06.2016
22:54:46
Хей, ночной. Как в Редисе сделать атомарный инкремент с проверкой, что ключ не заэкспайрился?
Короче, нужно делать инкремент только для существующего ключа и не заэкспайреного.
Watch-exec не катит, потому что watch не срабатывать на expire от сервера.

⬗VLAD⌶K⬖
29.06.2016
22:55:25

Maxim
29.06.2016
22:55:30
Думаю, может Луа скрипт туда пихнуть.
Он вроде тоже атомарно выполняется, можно еще логику туда насовать типа проверки ttl.
Но пока не знаю.

Roman
29.06.2016
23:05:13

Maxim
29.06.2016
23:06:25
Батч?
В смысле батч? Был вариант с транзакцией, вешать watch на ключ. Но watch ругается только когда конкурентное изменение ключа происходит. В моем случае ключ экспайрится самим сервером и watch это пропускает.

Google

Maxim
29.06.2016
23:06:52
Причем incr на ключ в Редисе, если ключ заэкспайрился, создаст новый, но с ttl -1.
То есть уже не volatile key.
^ кусок кода к проблеме. Там race condition, вот думаю как бы ее избежать.

Roman
29.06.2016
23:08:49

Maxim
29.06.2016
23:09:32
Зачем вешать watch?
Я думал сначала, что watch отлавливает expire ключа. Оказалось, что нет, watch только отлавливает конкурентные изменения.
http://redis.io/topics/transactions

Roman
29.06.2016
23:12:16
а что ты хочешь сделать?

Maxim
29.06.2016
23:12:32
Там даже в камментах к WATCH неправильная инфа написана
> I did an experiment on 2.6.16 and it seems that expiration of WATCHed keys does count as modification that would prevent EXEC from executing queued commands.
http://redis.io/commands/WATCH
Я написал коммент, что мол это типа не так, но у них там модерирование коментов и его до сих пор не зааппрувили.

Roman
29.06.2016
23:12:42
Исходная задача какая?

Maxim
29.06.2016
23:13:03
а что ты хочешь сделать?
Скинул выше скриншот. Проблема в том, что между проверкой существования и incr ключ может заэкспайриться.
Соответственно, задача — избежать race condition.

Roman
29.06.2016
23:13:39

Maxim
29.06.2016
23:13:46
В данном случае гонка с сервером, который безжалостно экспайрит ключи.
При таком решении как на скриншоте возможна ситуация:
- ключ существует
- ключ экспайрится
- ключ инкрементится -> создается новый ключ со значением 1 и ttl -1.

Roman
29.06.2016
23:15:56

Maxim
29.06.2016
23:16:19
^ так ведь это и делается
Но после того как он проверится есть ms, во время которых ключ может заэкспайриться.

Roman
29.06.2016
23:16:58
Ну и?

Maxim
29.06.2016
23:17:20
Ну и мы получим
- ключ экспайрится
- ключ инкрементится -> создается новый ключ со значением 1 и ttl -1.

Google

Roman
29.06.2016
23:17:31
Ну создастся заново
В чем трабл?

Maxim
29.06.2016
23:17:43
То есть мы получим вообще левую фигню вместо значения и без ttl.

Roman
29.06.2016
23:18:22
Зачем тебе ттл
?

Maxim
29.06.2016
23:19:23
Потому что ключ временный.

Roman
29.06.2016
23:20:02
Я пытаюсь подтолкнуть к мысли, что если что кажется слишком сложным, то ты делаешь что-то не то или не так

Admin
ERROR: S client not available

Maxim
29.06.2016
23:20:06
В данном коде можно получить что временный ключ превратится в постоянный из-за race condition.

Roman
29.06.2016
23:20:37
Как у тебя формируется ключ?

Maxim
29.06.2016
23:20:45
В данном случае у меня есть конкретная задача: как сделать инкремент в Редисе только для существующего ключа, чтобы избежать race condition.
Как угодно. Это open source библиотека с определенными гарантиями.
Не моя, если что) Я просто хотел пофиксить один из issue, так как задача показалась мне интересной.
Автор предложил watch + exec, но это не работает по вышеуказанным причинам.

Roman
29.06.2016
23:22:19

Maxim
29.06.2016
23:23:05
Хотя нужно еще разобраться получше, как ключи экспайрятся в Луа-скриптах.

Roman
29.06.2016
23:24:37

Maxim
29.06.2016
23:25:23
Но я не знаю, как в Луа-скриптах это отрабатывается. Если они атомарно выполняются, то такого быть не должно.

Google

Maxim
29.06.2016
23:26:12
Исходный issue, если интересно
https://github.com/niwinz/django-redis/issues/181

Roman
29.06.2016
23:26:58

Maxim
29.06.2016
23:27:37

Roman
29.06.2016
23:27:59

Maxim
29.06.2016
23:29:32
С фига ли?
Мы про луа скрипты? Если про них, то они атомарные. Если не про них, то я уже приводил пример.

Roman
29.06.2016
23:30:50

Maxim
29.06.2016
23:31:21
А. Тогда да, не должно быть конфликта.
Хотя меня дико смущает ситуация, что WATCH на ключ не ловит expire.
Просто дичайше. Это так нелогично выглядит.

Roman
29.06.2016
23:34:48

Maxim
29.06.2016
23:35:45

Roman
29.06.2016
23:36:54

Maxim
29.06.2016
23:37:26
Потому что пользователь может сам создать ключ со значением 0 и выставленным или нет ttl.

Roman
29.06.2016
23:40:55
А может не создать

Alexey
30.06.2016
04:24:01

Dim
30.06.2016
04:24:11

Alexey
30.06.2016
04:24:18

finkel
30.06.2016
05:57:35

Teddy
30.06.2016
05:58:52