Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Redis. Как мы боролись со сложностью

1,205 views

Published on

Redis – это инструмент, который должен быть в арсенале любого разработчика. В докладе Роман расскажет, как Redis помогает Todoist обслуживать сотни тысяч пользователей и подкупает простотой и изяществом своих решений.

Автор: Роман Иманкулов (компания Doist.io).

Published in: Technology
  • Be the first to comment

Redis. Как мы боролись со сложностью

  1. 1.  /   /  REDIS. КАК МЫ БОРОЛИСЬ СО СЛОЖНОСТЬЮ Minsk Python Meetup, март 2014 Роман Иманкулов Doist Inc @rdotpy
  2. 2. реализация — linked lists REDIS LISTS Python Redis >>>foo[1]="val" LSETfoo1val >>>len(foo) LLENfoo >>>foo.append("val") LPUSHfooval ... и так далее
  3. 3. REDIS SETS Python Redis >>>foo={1,2,3,4} SADDfoo1234 >>>set1&set2 SINTERset1set2 >>>set1+set2 SUNIONset1set2 >>>set3=set1+set2 SUNIONSTOREset3set1set2 ... и так далее
  4. 4. REDIS HASHES Python Redis >>>foo={"spam":1,"egg":2} HMSETfoospam1egg2 >>>foo['spam'] HGETfoospam >>>'spam'infoo HEXISTSfoospam >>>foo.setdefault('spam',1) HSETNXfoospam1 ... и так далее
  5. 5. USER TIMELINE И ЭКСПОНЕНЦИАЛЬНЫЙ РОСТ ДАННЫХ
  6. 6. USER TIMELINE И ЭКСПОНЕНЦИАЛЬНЫЙ РОСТ ДАННЫХ
  7. 7. USER TIMELINE И ЭКСПОНЕНЦИАЛЬНЫЙ РОСТ ДАННЫХ
  8. 8. USER TIMELINE И ЭКСПОНЕНЦИАЛЬНЫЙ РОСТ ДАННЫХ fixedlist: решение в пару строк кода defadd_to_timeline(user_id,record,max_records=100): """добавитьновуюзаписьвtimelineпользователя""" redis.lpush('timeline:%s'%user_id,record) redis.ltrim('timeline:%s'%user_id,0,max_records) defget_timeline(user_id): """вернутьвсезаписиизtimeline""" returnredis.lrange("timeline:%s"%user_id,0,-1) .
  9. 9. АСИНХРОННОЕ ВЫПОЛНЕНИЕ КОМАНД ускорение загрузки веб-страниц выравнивание нагрузки на сервер горизонтальное масштабирование
  10. 10. АСИНХРОННОЕ ВЫПОЛНЕНИЕ КОМАНД simple_queue: ещё одно решение в пару строк кода defenqueue(func,*args,**kwargs): """помещаемфункциювместесаргументамивочередь""" queue_name=kwargs.pop('_queue','simple_queue') redis.lpush(queue_name,pickle.dumps([func,args,kwargs])) defworker(queue='simple_queue'): """получаемиисполняемэлементыизочереди""" whileTrue: _,value=redis.brpop(queue) func,args,kwargs=pickle.loads(value) printfunc(*args,**kwargs) .
  11. 11. СБОР И АНАЛИЗ СТАТИСТИКИ. RETENTION ANALYSIS как понять, что вы на правильном пути Кто из пользователей, активных в последнюю неделю/месяц/ год, по-прежнему активен? Кто из сделавших действие X также выполнил действие Y? Как это изменилось после того, как вы реализовали новую фишку Z?
  12. 12. СБОР И АНАЛИЗ СТАТИСТИКИ. RETENTION ANALYSIS битовые операции со строками #отметимактивностьпользователя12328.03.2014 SETBITactive-2014-03-281231 #проверим,былили123активен1января2014 GETBITactive-2014-01-01123 #посчитемобщееколичествоактивныхпользователей1янв BITCOUNTactive-2014-01-01 #ктозарегистрировалсявчера,азаплатилсегодня? BITOPANDpaid-reportsigned-up-2014-03-27paid-2014-03-28 .
  13. 13. СБОР И АНАЛИЗ СТАТИСТИКИ. RETENTION ANALISYS bitmapist: сбор статистики в Redis #отметимактивностьпользователя >>>bitmapist.mark_event('active',123) #проверим,былли123активен1января2014 >>>activity=bitmapist.DayEvents('active',2014,1,1) >>>123inactivity True #ктозарегистрировалсявчера,азаплатилсегодня? >>>signed_up=bitmapist.DayEvents('signed_up',2014,3,27) >>>paid=bitmapist.DayEvents('paid',2014,3,28) >>>report=bitmapist.BitOpAnd(signed_up,paid) >>>len(report) 5
  14. 14. СБОР И АНАЛИЗ СТАТИСТИКИ. RETENTION ANALYSIS bitmapist.cohort: красивые таблички >>>dates_data=get_dates_data(select1='task:updated', select2='task:completed', time_group='days') >>>html_data=render_html_data(dates_data,time_group='days') .
  15. 15. БОЛЬШЕ ИНФОРМАЦИИ Официальная документация Redis Redis-клиент для Python Блог автора Redis. Salvatore Sanfilippo aka Antirez Redis. The Hacker's Database. Выступление Amir S. на pycon.ru Releasing bitmapist.cohort - or how we saved over $2000/month!
  16. 16.  /   /  СПАСИБО! ВОПРОСЫ? Роман Иманкулов Doist Inc @rdotpy

×