1. Что такое кеш -кеш
Слово кэш впервые поступил из дизайна процессора
Когда ЦП хочет прочитать данные, он сначала оглядывается из кеша ЦП и немедленно читает их и отправляет в ЦП для обработки, если он найден; Если это не найдено, он читается из относительно медленной памяти и отправляется в процессор для обработки. В то же время, блок данных, в котором расположены эти данные, вызывается в кэш, так что весь блок данных может быть прочитан из кэша в будущем без вызова памяти. Именно этот механизм чтения заставляет процессора считывания кэша очень высокой (большинство процессоров могут достигать 90%), что означает, что 90% данных, которые ЦП будет читать в следующий раз в кэше ЦП, и только около 10% необходимо прочитать из памяти. Это значительно экономит время процессора для непосредственного чтения памяти, а также делает невозможным для процессора читать данные без ожидания. В целом, порядок, в котором ЦП считывает данные сначала кэшируется, а затем память.
Позже мы сначала пошли в кеш жесткого диска, затем в кеш приложений, кеш браузера, веб -кеш и т. Д.!
Кэш - король! !
Весенний кеш
Spring Cache - это полный набор решений для кэширования приложений, приведенных в Spring Applications.
Сам Spring Cache не обеспечивает реализацию кэша, но использует унифицированные интерфейсы и спецификации кода, конфигурации, аннотации и т. Д., чтобы позволить вам использовать различные кэши в весенних приложениях без необходимости уделять слишком много внимания деталям кеша. С пружинным кешем вы можете легко использовать его
Различные реализации кэша, включая COMPURRENTMAP, EHCACHE 2.X, JCACHE, REDIS и т. Д.
Определение кеша весной
Определение кэша весной, в том числе в интерфейсе org.springframework.cache.cache.
В основном предоставляет следующие методы
// Получить значение в соответствии с указанной ключом <T> t get (клавиша объекта, класс <t> type) // Сохранить указанное значение в кэше в соответствии с соответствующей клавиш void put, ключ объекта, значение объекта); // Утилизация указанного значения void evint (ключ объекта)
Из определения нетрудно понять, что кэш на самом деле является структурой ключей. Мы эксплуатируем соответствующее значение через указанный ключ.
Кэш -менеджер
Кэш-это набор ключевых значений, но в нашем проекте могут быть разные кэши по различным темам бизнеса, такие как кэши пользователей, кэши отделения и т. Д. Эти кеши логически разделены. Чтобы различить эти кеши, org.springframework.cache.cachemanager предоставляется для управления различными кэшами. Этот интерфейс содержит только два метода
// Получить кэш соответствующей темы в соответствии с именем cache getCache (String name); // Получить кэш из всех тем коллекции <string> getCachenames ();
В этом интерфейсе добавление и удаление операций не разрешается выполнять в кэше. Эти операции должны быть выполнены внутри различных реализаций Cachemanager и не должны раскрываться.
Кэш на основе аннотаций
Теоретически, операция кэша данных не очень актуальна для самого бизнеса. Мы должны отделить операции чтения и записи кэша от основной логики кода. То, как разделена пружина, основано на аннотации (конечно, как JSR-107 и т. Д. Также основано на аннотации).
Spring предоставляет серию аннотаций, в том числе @Cachable, @Cacheput, @CacheeVict и другие аннотации, чтобы упростить нашу работу кэша. Эти аннотации расположены в пакете org.springframework.cache.annotation.
2. Примеры
Простой пример использования пружинного загрузки с использованием пружинного кеша
Давайте построим пример на основе кэша Spring Boot шаг за шагом
Создайте новый Spring Boot Project и представьте следующие зависимости
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-cache</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId> org.springframework.boot </GroupId> <artifactid> spring-boot-starter-test </artifactid> <cerpope> test </scope> </depertive> </depertive>
Среди них Spring-Boot-Starter-Cache является ключевой зависимостью кеша.
Измените класс приложения и добавьте аннотацию, которая позволяет кэш @enablecaching
@SpringbootApplication@enyablecachingpublic class cachesimpleapplication {public static void main (string [] args) {SpringApplication.run (cachesimpleApplication.class, args); }}@Enablecache аннотация начинает механизм кэширования Spring, который позволит приложению обнаружить все аннотации, связанные с кэшем, и начать работу. Он также создаст боб Cachemanager, который может быть введен и использован в нашем приложении.
Создайте новый класс RestController
@Restcontroller @requestmapping ("/") открытый класс cachecontroller {@autowired private cachetestservice cachetestservice; / ** * Получить информацию на основе идентификатора * * @param id * @return */ @getmapping ("{id}") public String test (@pathvariable ("id") String id) {return cachetestservice.get (id); } / ** * Удалить информацию об идентификаторе * * @param id * @return * / @deletemapping ("{id}") public String delete (@pathvariable ("id") String id) {return cachetestservice.delete (id); } / ** * Сохранить информацию об идентификаторе * * @param id * @return * / @postmapping public String save (@requestparam ("id") идентификатор строки, @requestparam ("value") string value) {return cachetestservice.save (id, value); } / ** * Информация о новом идентификаторе * * @param id * @return * / @UptMapping ("{id}") public String update (@pathvariable ("id") String id, @requestparam ("value") string value) {return cachetestService.update (id, value); }}Этот класс вызывает службу для реализации фактической работы добавления, удаления, изменения и проверки.
Внедрение услуг
Далее мы хотим реализовать наш сервис
@ServicePublic Class SimpleCacheTestServiceImpl реализует CacheTestService {Private Static Logger Logger = loggerFactory.getLogger (SimpleCacheTestServiceImpl.class); Приватная окончательная карта <string, string> entities = new Hashmap <> (); Public SimpleCacheTestServiceImpl () {entities.put ("1", "this no 1"); } @Autowired private cachemanager cachemanager; @Override @cachable (cachenames = "test") public String get (String Id) {// Записывает время генерации данных, используется для тестирования и сравнения LOAL TIME = new Date (). GetTime (); // Распечатать использованный cachemanager logger.info («Cachemanager - + Cachemanager); // Распечатать журнал журнала log.info ("получить значение от id =" + id + ", время" + время); вернуть "получить значение от id =" + id + ", значение" + entities.get (id); } @Override public String Delete (String Id) {return entities.remove (id); } @Override public String Save (String id, string value) {logger.info ("Сохранить значение" + значение + "с ключом" + id); entities.put (id, значение); возвращаемое значение; } @Override public String Update (идентификатор строки, string value) {return entities.put (id, value); }}кеш
Во -первых, добавьте аннотацию @Cachable в метод GET и запустите тест кода.
Мы используем почтальон для тестирования, тестовый адрес http: // localhost: 8080/1, браузер отвечает на получение значения по id = 1, значение № 1, консоль сервера печатает две строки журналов
Получить значение по id = 1, значение no 1 get value от id = 1, время 1516004770216
Но когда мы снова обновляем адрес браузера, браузер возвращается нормально, но консоль больше не печатается. Причина в том, что когда мы называем это во второй раз, пружина больше не выполняет метод, но напрямую получает кэшированное значение. Пружинный кэш кэширует возвращаемое значение функции в качестве ключа в тесте с именем кэша.
Здесь мы используем аннотацию @cachable, и кахеналы в аннотации указывают, какой кэш читается здесь. Здесь мы будем искать объект кэша, чей ключ является идентификатором в cachename = "test".
Удалить кэшированные данные
В приведенной выше программе, если мы удалим указанное значение с помощью запроса Delete и отправим запрос Delete на http: // localhost: 8080/1, в настоящее время значение было удалено с карты, но когда мы получаем запрос на http: // localhost: 8080/1, мы все еще можем получить значение. Это потому, что когда мы удаляем данные, мы не удаляли данные в кэше. В предыдущем методе GET результат работы метода все еще сохраняется. Весна не будет перечитать его, но будет напрямую читать кэш. В настоящее время мы добавляем аннотации перед методом
@Переопределить@cacheevict (cachenames = "test") public String delete (String id) {return entities.remove (id);}После тестирования, сначала вызовите запрос GET, возвращаемое значение будет правильно отображаться как значение GET по ID = 1, значение равно 1
Затем позвоните по запросу удаления. Удалите данные из кеша и карты и снова вызовите запрос GET. В настоящее время значение GET от ID = 1, значение является нулевым, что означает, что значение действительно было удалено из кэша.
Здесь мы используем аннотацию @cacheevict. Cachenames указывает, какие данные кэша удалить. По умолчанию параметры метода будут использоваться в качестве удаленного ключа.
Обновить кэш
Когда программа достигает этой точки, если мы запустим запрос POST, тело запроса ID = 1 & value = new1. В настоящее время консольные принты сохраняют значение новое значение1 с ключом 1, и код сохранит значение на карте, но когда мы запустим запрос GET, мы обнаружим, что возвратное значение все еще находится в предыдущем состоянии. Это то, что мы можем использовать
@Переопределить@cacheput (cachenames = "test", key = "#id") public String save (String id, string value) {logger.info ("Сохранить значение" + value + "с ключом" + id); return entities.put (id, value);}Пересмотрите код, мы сначала отправляем запрос Delete, чтобы удалить данные с карты и кэша. Затем отправьте запрос POST и напишите данные на карту. Наконец, если вы отправите запрос GET, вы обнаружите, что значение можно получить правильно сейчас, и консоль не печатает журнал данных, полученных с карты.
Аннотация @CachePut используется здесь. Функция этой аннотации состоит в том, чтобы записать возвращаемое значение метода в кэш, указанный кахенанами в соответствии с данным ключом.
Точно так же нам нужно добавить аннотацию @CachePut в метод POT, чтобы модификация также могла обновить кэшированные данные.
На этом этапе простое приложение к кешу, включая добавление, удаление, модификацию и запрос, завершено.
3. Ключевые моменты
Несколько заметок
Уведомление
@Cachable и @CachePut будут поместить результат выполнения метода в кэш в соответствии с указанным ключом. Когда @Cachable выполняется, он сначала обнаружит, есть ли данные в кэше. Если это так, это будет прочитан прямо из кеша. Если нет, выполните метод и поместите возвратное значение в кэш, @CachePut сначала выполнит метод, а затем напишите результат выполнения в кэш. Метод с использованием @CachePut определенно будет выполнен
Полный пример кода-https://github.com/ldwqh0/cache-test
Суммировать
Выше приведено метод использования кэша кеша в Spring Boot, представленный вам редактором. Я надеюсь, что это будет полезно для вас. Если у вас есть какие -либо вопросы, пожалуйста, оставьте мне сообщение, и редактор ответит вам вовремя. Большое спасибо за вашу поддержку сайту wulin.com!