предисловие
Я писал об этом несколько лет назадLRU cache
статья:Сестра crossover.top/2018/04/07/…
В то время он был реализован на Java, и недавно я над ним работал.ptgКак раз тогда, когда вам нужна наименее недавно использованная структура данных для хранения истории.
ptg: инструмент тестирования производительности (Go), инструмент отладки клиента gRPC, реализованный в Go.
В официальной библиотеке Go нет родственной реализации, учитывая простоту программы, я не планирую полагаться на стороннюю библиотеку и писать ее самостоятельно, сама сложность невелика, а строк всего несколько кода.
С этой структурой данных у меня естьptgФункция истории запросов реализована в:
Храните каждую запись запроса в кэше lru, самые последние использованные исторические записи ранжируются первыми, а также предоставляют соответствующие функции поиска; подробности см. на рисунке ниже.
выполнить
О принципе реализации и говорить нечего.Java
такой же как:
- Порядок, в котором двусвязный список хранит данные
- Один
map
хранить окончательные данные - Когда данные достигают верхнего предела, удалите хвостовые данные связанного списка.
- будет использоваться
Node
Перейти к головному узлу связанного списка
Хотя Go относительно лаконичен, хорошая новость заключается в том, что базовая структура двусвязного списка все еще существует.
Итак, исходя из этого, мы определяемLruCache
:
Согласно предыдущему анализу:
-
size
Размер кэша хранилища. - Связанный список хранит порядок данных.
-
map
Хранение данных. -
lock
Используется для управления безопасностью параллелизма.
Следующее внимание уделяется двум функциям: записи и запроса.
При записи оценивайте, достигнут ли верхний предел емкости, и удаляйте хвостовые данные после его достижения, в противном случае записывайте данные в голову.
При выборке данных это переместит запрошенный узел на головной узел.
Эти операции с узлами инкапсулируются в List.
Так удобнее в использовании.
наконец через этоLruCache
Эффект вышеприведенной картинки достигнут.Если вы хотите узнать больше деталей, вы можете обратиться к исходному коду: