Введение
Мы знаем, что узкое место программы лежит в базе данных, и наши знания также знают, что скорость памяти намного быстрее, чем у жесткого диска. Когда нашему департаменту необходимо неоднократно получать те же данные, наш отдел снова и снова запрашивает базу данных или удаленную службу, что приводит к многому времени, затрачиваемому на запрос базы данных или удаленные вызовы метода, что приводит к ухудшению производительности программы, что еще больше является проблемой, которую необходимо решить кэш данных.
Поддержка весеннего кэширования
Spring определяет org.springframework.cache.cachemanager и org.springframework.cache.cache, чтобы объединить различные технологии кэширования. Среди них Cachemanager - это абстрактный интерфейс для различных технологий кэша, предоставляемых весной. Интерфейс кэша включает в себя различные операции кэша (добавление и удаление для получения кэша, наша система, как правило, не имеет непосредственного отношения с этим интерфейсом)
Cachemanager поддерживается весной
Для различных технологий кэширования необходимо реализовать различные кахманагеры. Spring определяет реализацию Cachemanager в следующей таблице.
При внедрении любого Cachemanager вам нужно зарегистрировать бобы, который реализует Cachemanager. Конечно, каждая технология кэширования имеет много дополнительных конфигураций, но настройка CacheManager имеет важное значение.
Декларативная аннотация кеша
Spring предоставляет 4 аннотации для объявления правил кеша (яркий пример AOP с использованием аннотированных формул), как показано в таблице.
Включить декларативный кеш
Включение поддержки декларативного кэширования очень проста, вам нужно только использовать аннотацию @enabelcaching в классе конфигурации.
Поддержка Springboot
Ключом к использованию кеш -технологии в Spring China является настройка Cachemanager. Springbok автоматически настраивает несколько реализаций Cachemanager для нашей двери. В среде загрузки Spring использование технологии кэша требует только импорта пакетов зависимостей связанной технологии кэша в проекте и настройки класса, чтобы включить поддержку кэша с использованием @EnabelCaching.
Небольшие примеры
Небольшой пример реализован с использованием кэша Springboot+JPA+.
Пример шагов каталог
1. Создать проект Maven
Создайте новый файл Maven Project Pom.xml следующим образом:
<? xml version = "1.0" Encoding = "utf-8"?> <project xmlns = "http://maven.apache.org/pom/4.0.0" xmlns: xsi = "http://www.w3.org/2001/xmlschema-instance" xsi: schemalocation = "http://maven.apache.org/pom/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <doliderversion> 4.0.0 </modelversion> <groupid> com.us </GroupId> <mortifactid> springbood> springbootd> <//artifactid> <//artifactid> <//artifactid> <//artifactid> <//artifactid> <//artifactid> <//artifactid> <sersion> 1.0-snapshot </version> <parent> <groupid> org.springframework.boot </GroupId> <ArtifactId> Spring-boot-Starter-parent </artifactid> <sersion> 1.3.0.Release </version> </parent> <properties> <start-class> com.us.application </ressurn> </parent> <properties> <start-class> com.as. <maven.compiler.target> 1.8 </maven.compiler.target> <Maven.compiler.source> 1.8 <strifactid> spring-boot-starter-cache </artifactid> </dependency> <depervice> <groupid> org.springframework.boot </groupid> <artifactid> spring-boot-starter-data-jpa </artifactid> </jepertive> <dygession> <groupid> org.spramework.boot> </gypee> <dehyse> <groupd> org.spramework.boot> </gypective> <dehyse> <groupid> org.sprameword.boot> <artifactid> Spring-boot-starter-web </artifactid> </deperency> <Depective> <groupId> net.sf.ehcache </GroupD> <ratifactid> ehcache </artifactid> </artifactId> mySquid-j <version>6.0.5</version> </dependency> <dependency> <groupId>com.mchange</groupId> <artifactId>c3p0</artifactId> <version>0.9.5.2</version> <exclusions> <exclusion> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> </exclusion> </exclusions> </Зависимость> </зависимости> </project>
2. Конфигурация базы данных
Создайте новый файл приложения.
Application.properties
ms.db.driverclassname = com.mysql.jdbc.driverms.db.url = jdbc: mysql: // localhost: 3306/cach? t = true & useUnicode = true & ancervencoding = utf-8 & usessl = false & allowmultiqueries = truems.db.username = rootms.db.password = xxxxxxms.db.maxactive = 500
Создайте новый файл конфигурации dbconfig.java и настройте источник данных
пакет com.us.example.config;/*** Создан Янгибо 17/1/13. */import java.beans.propertyVetoException; импорт org.springframework.beans.factory.annotation.autowired; импорт org.springframework.context.annotation.bean; импорт org.springframework.context.annotation.configuration; импорт org.springframeword.core.core.core.core.core.core.core.core.core.core.core.core.core.core.core.core.core.core.core.core.core.core.core.core.core.core.core.core.core.core.core. com.mchange.v2.c3p0.combopooleddatasource; @configurationpublic class dbconfig {@autowired private Environment env; @Bean (name = "dataSource") public ComboPooledDataSource DataSource () Throws PropertyVetoException {comboPooledDataSource dataSource = new ComboPooledDataSource (); dataSource.setDriverClass (env.getProperty ("ms.db.driverclassname")); dataSource.setJdbcurl (env.getProperty ("ms.db.url")); dataSource.setUser (env.getProperty ("ms.db.username")); dataSource.setPassword (env.getProperty ("ms.db.password")); dataSource.setMaxPoolsize (20); dataSource.setMinPoolsize (5); dataSource.setInitialPoolsize (10); dataSource.setMaxIdletime (300); dataSource.setAcquireIncrent (5); dataSource.setIdleConnectionTestPeriod (60); вернуть DataSource; }}Дизайн базы данных, база данных имеет только один человек, а дизайн заключается в следующем:
3. JPA Конфигурация
Файл конфигурации Spring-Data-JPA выглядит следующим образом:
пакет com.us.example.config; import java.util.hashmap; import java.util.map; import javax.persistence.entitymanagerfactory; импорт javax.sql.datasource; импорт org.springframework.beans.factory.annotation.autowired; org.springframework.context.annotation.configuration; импорт org.springframework.data.jpa.repository.config.enablejparepositories; import org.springframework.orm.jpa.jpatransactionmanager; import.spramework.orm.ormaneryAnerAranceManager; импорт org.spramework.orm. org.springframework.orm.jpa.vendor.hibernatejpavendoradapter; импорт org.springframework.transaction.platformtransactionmanager; импорт org.springframework.transaction.annotation.enableTransactionManagement;/*** Создан Yangyibo на 17/1/13. */@Configuration@enablejparePositories ("com.us.example.dao")@enabletransactionmanagement@componentscanpublic class jpaconfig {@auutowired private dataSource; @Bean Public EntityManagerFactory EntityManagerFactory () {hibernateJpavendorAdapter vendorAdapter = new hibernatejpavendoradapter (); LocalContainerentItyManagerFactorybean Factory = New LocalContainerTityManagerFactoryBean (); factory.setJpavendorAdapter (VendorAdapter); factory.setpackagestoscan ("com.us.example.bean"); factory.setDataSource (DataSource); Map <string, object> jpaproperties = new hashmap <> (); jpaproperties.put ("hibernate.ejb.naming_strategy", "org.hibernate.cfg.improvednamingstrategy"); jpaproperties.put ("hibernate.jdbc.batch_size", 50); factory.setjpapropertymap (jpaproperties); factory.afterpropertiesset (); вернуть factory.getObject (); } @Bean public platformtransactionManager TransactionManager () {JPatransActionManager txmanager = new JPatransActionManager (); txmanager.setentityManagerFactory (EntityManagerFactory ()); вернуть txmanager; }}4. Напишите бобы и слои DAO
Организация класса. Java
пакет com.us.example.bean; import javax.persistence.entity; импорт javax.persistence.generatedValue; импорт javax.persistence.id; импорт javax.persistence.table;/*** Создан Янгибо 17/13. */ @Entity @table (name = "person") public class person {@id @generatedvalue private long id; Приватное название строки; частный целый возраст; частный строковый адрес; public Person () {super (); } public Perform (Long Id, String name, Integer Age, String Address) {super (); this.id = id; this.name = name; this.age = возраст; this.address = адрес; } public long getId () {return id; } public void setId (long id) {this.id = id; } public String getName () {return name; } public void setName (string name) {this.name = name; } public integer getage () {return Age; } public void setage (целый возраст) {this.age = age; } public String getAddress () {return Adder; } public void setAddress (строковый адрес) {this.address = address; }}DAO Layer, PersonRepository.java
пакет com.us.example.dao; import com.us.example.bean.person; import org.springframework.data.jpa.repository.jparepository;/*** Создан Янгибо 17/1/13. */public interface PersonRepository расширяет jparePository <человек, long> {}5. Напишите уровень обслуживания
сервисный интерфейс
пакет com.us.example.service; import com.us.example.bean.person;/*** Создан Янгибо 17/1/13. */public interface demoservice {public Person Save (Person Person); public void удалить (Long Id); Общественный человек находит (личное лицо);}Реализация: (ключ, добавьте кеш здесь)
пакет com.us.example.service.impl; import com.us.example.bean.person; import com.us.example.dao.personRepository; import com.us.example.service.demoservice; импорт org.springframework.beans.Cauty.Annotation.Autowired; org.springframework.cache.annotation.cacheput; import org.springframework.cache.annotation.cachable; импорт org.springframework.stereotype.service;/*** Создан Янгибо на 17/1/13. */ @ServicePublic Class DemoServiceImpl реализует demoService {@autowired частного лица PersonRepository; @Override //@Cacheput Caches недавно добавлены или обновлены данные в кэш, где имя кэша - люди. Ключом данных является идентификатор человека @cacheput (value = "people", key = "#person.id") Public Save (Person Person) {Person P = PersonRepository.save (человек); System.out.println («Для id, ключ:«+p.getid ()+«кэширован данных»); возврат P; } @Override // @cacheevict Удалить данные с идентификатором ключа из Cache People @cacheevict (value = "people") public void remove (long id) {system.out.println ("Удал кэш данных с помощью идентификатора и ключа"+id+"); // Операция по удалению не выполняется здесь. Указано, параметры метода сохраняются в кэше как ключ.6. Напишите контроллер
Для удобства тестирования GET используется
пакет com.us.example.controller; import com.us.example.bean.person; import com.us.example.service.demoservice; import org.springframework.beans.factory.annotation.autowired; import org.springframework.stereotype.controler; импорт; org.springframework.web.bind.annotation.requestmapping; импорт org.springframework.web.bind.annotation.responsebody; импорт org.springframework.web.bind.annotation.restcontroller;/*** Создан Yangyibo 17/1/13. */ @RestControllerPublic Class CacheController {@Autowired Private DemoService DemoService; // http: // localhost: 8080/put? name = abel & age = 23 & address = shanghai @requestmapping ("/put") public pult (человек) {return demoservice.save (человек); } // http: // localhost: 8080/able? } // http: // localhost: 8080/evit? id = 1 @requestmapping ("/evit") public String evit (long id) {demoservice.remove (id); вернуть "OK"; }}7. Начните кеш
Не забудьте включить конфигурацию кэша в классе запуска.
пакет com.us.example; import org.springframework.boot.autoconfigure.springbootapplication; import org.springframework.cache.annotation.enableCaching; импорт org.springframework.context.configurableplicationcontext; импорт org.springframework.nantetrate.nantation.com org.springframework.boot.springapplication.*;/*** Создан Янгибо 17/1/13. */@Componentscan (basepackages = "com.us.example")@springbootapplication@enablecachingpublic class application {public static void main (string [] args) {configurableApplicalationcontext run = run (application.class, args); }}8. Способность проверки тестирования и проверки:
Запустите класс приложения, и после начала его введите: http: // localhost: 8080/able?
Вывод консоли:
«Данные идентификатора и ключа: 1» были кэшированы для этого запроса. Если вы снова запросите данные, этот оператор не появится, то есть база данных не будет запрошена.
Проверка
Введите в браузере: http: // localhost: 8080/put? Name = abel & age = 23 & address = shanghai (вставьте данные в базу данных и поместите данные в кэш.)
В настоящее время консольная вывода кэширует запись:
Затем снова вызовите способный метод, чтобы запросить данные. База данных больше не будет запрашивать, и данные будут считываться непосредственно из кэша.
Тест выселение
Введите: http: // localhost: 8080/evit? Id = 1 в браузере (очистить запись из кэша, после его очистки, запись снова будет помещена в кэш после доступа к записи.)
Вывод консоли:
Переключить кеш
1. Переключитесь на ehcache как кэш
Добавить зависимости в файле pom.xml
<Depective> <groupid> net.sf.ehcache </GroupId> <artifactId> ehcache </artifactid> </degying>
Создайте файл конфигурации ehcache.xml в папке ресурсов. Содержание нового файла конфигурации EHCache заключается в следующем. Этот загрузочный файл Spring будет автоматически сканировать
<? xml version = "1.0" Encoding = "utf-8"?> <ehcache> <!-используется при переходе на кэш ehcache-> <cache name = "people" maxelementsinmemory = "1000" /> < /ehcache>
2. Переключитесь на гуаву как кеш
Просто добавьте зависимости в POM
<depervice> <groupid> com.google.guava </groupid> <artifactid> guava </artifactid> <sersive> 18.0 </version> </dependency>
3. Переключитесь на Redis как кеш
Пожалуйста, прочитайте следующий блог
Ссылка на эту статью: «Разрушитель Javaee Development: Spring Boot Practical Battle»
Исходный код этой статьи: https://github.com/527515025/springboot.git
Выше всего содержание этой статьи. Я надеюсь, что это будет полезно для каждого обучения, и я надеюсь, что все будут поддерживать Wulin.com больше.