2012-02-10 1 views
1

Я только что прочитал исходный код файла dict.c для реализации dict. У меня есть буквальное различие между безопасным и небезопасным итератором dict, но пока не понимаю, зачем вводить новую концепцию небезопасного итератора.В чем разница безопасного и небезопасного dict itereator в redis 'dict реализации?

Говорят, что «новый итератор может выполнять менее бесполезную COW». Но я не могу понять, как это работает, поэтому обратитесь за помощью.

Оценка за любую помощь, объяснение с примером было бы лучше.

ответ

1

Целью безопасных и небезопасных итераторов является четкое определение того, происходит ли итерация в изменяемой или неизменяемой структуре данных. В реализации dict она предотвращает выполнение некоторых операций (например, повторная запись) в словаре, когда продолжается безопасная итерация.

Теперь безопасные итераторы имеют недостаток: им нужно увеличить счетчик ссылок в самом итерированном объекте, чтобы объект знал, происходит ли безопасная итерация или нет.

Redis использует механизм копирования копий ОС (COW) для работы с фоновым дампом. Когда возникает дамп, fork вызывается для клонирования экземпляра Redis и создания второго процесса. Этот процесс будет перебирать все данные для сериализации всего в файл дампа. Благодаря механизму COW большинство страниц разделены между двумя процессами, поэтому Redis не занимает дважды RAM, пока он сбрасывает данные.

Теперь страницы доступны только в том случае, если они доступны в режиме только для чтения. Когда один из двух процессов записывает что-то в память, соответствующая страница автоматически дублируется ОС.

Если безопасный итератор систематически использовался для итерации по всем словарям, было бы дублировано большое количество страниц (из-за обновлений счетчика ссылок). В клонированном процессе данные считаются неизменяемыми, поэтому использование небезопасного итератора имеет смысл уменьшить активность COW. Это в основном актуально, когда у вас много объектов set/hash/zset в Redis.

Смежные вопросы