Хорошие ресурсы:
https://www.youtube.com/watch?v=TGl81wr8lz8 (кеш памяти Google)
https://en.wikipedia.org/wiki/Linearizability (атомарное объяснение)
https://www.linkedin.com/pulse/memcached-vs-redis-what-one-pick-ranjeet-vimal (memcache против Redis)
https://en.wikipedia.org/wiki/Transactional_memory
https://en.wikipedia.org/wiki/Thread_safety
Что такое кэш памяти
Техническая — это память, которая хранится в ОЗУ, является энергозависимой (данные сохраняются при включении питания и теряются при перезапуске), но имеет более быстрый доступ, чем постоянное / энергонезависимое хранилище (т. е. диск).
Хранится как — пары ключ-значение в семействе noSQL
Уровни — Доступны таким образом, что люди могут присваивать «уровень важности» различным данным, подлежащим кэшированию. (Действительно важные хранятся ближе к верху для более быстрого доступа, а менее важные — ниже)
Зачем использовать кэш памяти
- Сократите количество одних и тех же звонков в 10 000 раз (уменьшите расходы, улучшите производительность)
- Производительность для часто используемых элементов, таких как токены, сеансы или даже HTML-коды (страница загружается быстрее без повторной загрузки кодов, работает в автономном режиме).
- Тяжелые вычислительные функции, которые могут вызываться много раз. Представьте, что требуется много времени, чтобы вычислить ответ на этот сложный вопрос. Когда это, наконец, будет сделано и возвращено первому пользователю, который спросит об этом, вы хотите, чтобы оно было уничтожено и перестроено, когда кто-то другой спросит? Или сохранить, чтобы уменьшить трату энергии мозга
- Совместное использование данных между экземплярами приложения
Пример использования — хранение огромных данных, возвращаемых из SQL. 1. попытаться получить огромные данные. 2. Если существует, используйте его, иначе запустите запрос и установите его.
Почему НЕ используйте кэш памяти
- volatile — может вылететь, исчезнет при перезапуске
- не транзакционные, а атомарные - данные могут быть неверными (см. объяснение побочных понятий), но есть методы решения нетранзакционных с помощью определенных операций, например. putIfUntouched (используйте отметку времени для запуска потоков по порядку), инкремент (атомарные операции)
- ограничено в пространстве — предназначено для быстрого доступа
Дополнительные концепции
- В параллельном программировании мы пытаемся в полной мере использовать ЦП, доступные для запуска кода, вместо того, чтобы работать в одном потоке и перегружать этот единственный поток. Но с несколькими потоками (или параллельным программированием) у нас есть проблема 1. сбоя — чтение и запись одновременно и 2. с порядком потоков (кто знает, что должно идти первым?)
- атомарное программирование — возвращаемое значение должно быть возвращено либо до завершения транзакции (следовательно, не удалось и можно попробовать), либо после завершения транзакции (успех ). Не на полпути, что сделало бы значение неверным и трудным для исправления (как изменить, когда вы не знаете, как далеко процесс зашел). Атом, будучи неделимым или базовыми блоками вещей, должен сделать вашу операцию неделимой. Либо это сделано, либо не сделано. Один из способов сделать операцию атомарной — это «блокировать» ЦП, когда что-то обращается к нему.
- например когда вы Dr 100 PnL, Cr 100 BS. Вы не можете прервать программу на полпути и показывать только файлы Dr.
- транзакционная память/безопасность потоков/непротиворечивость — обеспечение того, чтобы одновременные/множественные потоки, обращающиеся к хранимой памяти, происходили в правильном порядке, чтобы чтение было правильным значением. (это может быть достигнуто путем чтения всех других потоков для обеспечения согласованности или использования атомарных операций для предотвращения доступа других потоков или других методов)
- например 3 потока (добавить 100, прочитать, минус 20), если вышеприведенное не имело порядка, каким должно быть значение чтения? 0? 100? 80? -20?
Memcache и Redis (параллельная многопоточность и кластеры)
- Подобно многопоточному (memcache) Python и кластерам узлов. (нужен родитель, который будет порождать дочерние процессы)
- Многопоточность Python будет иметь одну и ту же общую память (и может взаимодействовать таким образом), кластеры не имеют общей памяти (следовательно, взаимодействуют, отправляя информацию друг другу).
- Кредит: http://www.acuriousanimal.com/2017/08/12/understanding-the-nodejs-cluster-module.html
- продолжение следует в отдельном посте….