«Кошелек или деньги: сложный выбор между памятью и процессором» Алексеенко Иг...
View как чистая функция от состояния базы данных - Илья Беда, bro.agency
1. View как чистая функция
от состояния базы
данных
Илья Беда / bro.agency
2. Кто я?
● Тимлид и один из основателей bro.agency
● Разрабатываю веб-формочки на python в течении 7
лет
● Специализируюсь на аутсорс-разработке
● Продвигаю функциональное программирование в
массы
● Провожу воркшопы и мастер-классы
● С недавнего времени выступаю на конференциях
2
3. There are only two hard things in Computer
Science: cache invalidation and naming things.
Phil Karlton
3
7. Инвалидация по умолчанию (по таймауту)
7
Слишком часто Слишком редко
Кэш становится не
актуальным, но сами
данные остались
неизменными
Пользователь увидит не
актуальную версию
страницы
8. Инвалидация по умолчанию (по таймауту)
8
Слишком часто Слишком редко
Кэш становится не
актуальным, но сами
данные остались
неизменными
Пользователь увидит не
актуальную версию
страницы
20. В чем преимущества чистых функций?
Для одного и того же набора аргументов она
возвращает одно и тоже значение.
Что упрощает проблему инвалидации
20
21. Давайте сделаем наш ВЕБ функционально
чистым и забудем про проблемы
инвалидации кэша.
21
22. Как это выглядит в реальности (Django)
22
1
2
3
4
5
def some_view(request, url_param):
items = SomeModel.objects.filter(some_field=url_param)
c = Context({'items': items})
response = Template("my_template.html").render(c)
return HttpResponse(response)
23. Как это выглядит в реальности (Django)
23
1
2
3
4
5
def some_view(request, url_param):
items = SomeModel.objects.filter(some_field=url_param)
c = Context({'items': items})
response = Template("my_template.html").render(c)
return HttpResponse(response)
24. Как это выглядит в реальности (Django)
24
1
2
3
4
5
def some_view(request, url_param):
items = SomeModel.objects.filter(some_field=url_param)
c = Context({'items': items})
response = Template("my_template.html").render(c)
return HttpResponse(response)
25. Как это выглядит в реальности (Django)
25
1
2
3
4
5
def some_view(request, url_param):
items = SomeModel.objects.filter(some_field=url_param)
c = Context({'items': items})
response = Template("my_template.html").render(c)
return HttpResponse(response)
26. Проанализируем с точки зрения чистоты
26
1
2
3
4
5
def some_view(request, url_param):
items = SomeModel.objects.filter(some_field=url_param)
c = Context({'items': items})
response = Template("my_template.html").render(c)
return HttpResponse(response)
27. Проанализируем с точки зрения чистоты
27
1
2
3
4
5
def some_view(request, url_param):
items = SomeModel.objects.filter(some_field=url_param)
c = Context({'items': items})
response = Template("my_template.html").render(c)
return HttpResponse(response)
37. def get_database_state_from_magic():
Если пренебречь тем, что база данных может
вернуться в предыдущее состояние, то можно
использовать индекс поколений.
И это практичное решение проблемы, которое можно
использовать.
37
55. 55
В реальности очень много таблиц, поэтому это будет
прекрасно работать.
News Comment Page Event User
56. Можно пойти дальше и инвалидировать кэш,
зависящий от определенной части состояния базы
данных.
Тогда нам нужен инструмент для описания этой
части.
56