CouchDB ‣ Постепенно мигрируем с CouchDB в Redis ‣ Активно используем Redis для очередей ‣ Активно используем для Pub/Sub ‣ Акционные предложения целиком в Redis
данные на запись (в памяти) База вызывает write (данные в буфере ядра) Ядро сбрасывает буферы на диск (данные попадают в кеш диска) Диск физически записывает данные
данные на запись (в памяти) База вызывает write (данные в буфере ядра) Ядро сбрасывает буферы на диск (данные попадают в кеш диска) Диск физически записывает данные POWER OUTAGE PROCESS KILL
в редисе ‣ Создает снимок во времени при достижении определенных условий: таймаута и количество измененных ключей. Напр. 100 новых записей и последний снимок создан более, чем 2 минуты назад
Гарантирует, что запись будет целостной в конкретный момент времени (в append-only режиме) ‣ Все, что записано до создания следующего снимка будет утеряно
основная система персистентности в Redis ‣ Суть туповата – если операция записи модифицирует данные, эта операция записывается в AOF ‣ Лог точно в том же формате, что и клиентская команда
если он становится слишком большим - Redis пересоздает его целиком ‣ Вместо чтения старого файла, Redis создает минимальный набор команд для воспроизведения данных, которые находятся в памяти
не выполняется вовсе, в AOF запись выполняется с помощью write ‣ appendfsync everysec – данные записываются с помощью write и синхронизируются с диском раз в секунду с помощью fsync ‣ appednfsync always – самый меденный способ записи. Fsync + write, но делается group commit
messages while True: message = p.get_message() if not message: sleep(1) continue # .. do something with message ### Sending messages r.publish('my-first-channel', 'some data')
Redis не будут выполнены до конца обработки скрипта. Медленные скрипты нет смысла запускать ‣ Та же история с MULTI/EXEC – команды выполняются атомарно ‣ Если процесс redis убит посреди транзакции, файл AOF может быть поврежден, для починки есть тулза redis-check-aof
All models to be handled by rom # must derived from rom.Model class User(rom.Model): email = rom.String( required=True, unique=True, suffix=True) salt = rom.String() hash = rom.String() created_at = rom.Float(default=time.time)
works too user = User.get_by(email_address='[email protected]') user = User.get(5) users = User.get([2, 6, 1, 7]) user = User.get_by(email_address='[email protected]') # gets up to 25 users created in the last 24 hours users = User.get_by( created_at=(time.time()-86400, time.time()), _limit=(0, 25))