Introdução
Nosso conhecimento é que o gargalo de um programa está no banco de dados e nosso conhecimento também sabe que a velocidade da memória é muito mais rápida que a do disco rígido. Quando nosso departamento precisa obter os mesmos dados repetidamente, nosso departamento solicita ao banco de dados ou serviço remoto repetidamente, resultando em muito tempo gasto em consultas de banco de dados ou chamadas de método remoto, resultando em deterioração no desempenho do programa, o que é ainda mais um problema que o cache de dados precisa resolver.
Suporte de cache de primavera
Spring define o org.springframework.cache.cachemanager e org.springframework.cache.cache interfaces para unificar diferentes tecnologias de cache. Entre eles, o Cachemanager é uma interface abstrata para várias tecnologias de cache fornecidas pela primavera. A interface do cache inclui várias operações de cache (adicionando e excluindo para obter cache, nosso sistema geralmente não lida diretamente com essa interface)
Cachemanager apoiado pela primavera
Para diferentes tecnologias de cache, diferentes cachemanagers precisam ser implementados. Spring define a implementação do Cachemanager na tabela a seguir.
Ao implementar qualquer Cachemanager, você precisa registrar um feijão que implementa o Cachemanager. Obviamente, cada tecnologia de cache tem muitas configurações adicionais, mas a configuração do Cachemanager é essencial.
Anotação declarativa de cache
A Spring fornece 4 anotações para declarar regras de cache (um exemplo vívido de AOP usando fórmulas anotadas), como mostrado na tabela.
Ligue o cache declarativo
A ativação do suporte declarativo em cache é muito simples, você só precisa usar a anotação @enabelcaching na classe de configuração.
Apoio ao Springboot
A chave para o uso da tecnologia de cache na China da primavera é configurar o Cachemanager. O Springbok configura automaticamente várias implementações de Cachemanager para nossa porta. No ambiente de inicialização da primavera, o uso da tecnologia de cache requer apenas a importação dos pacotes de dependência da tecnologia de cache relacionados no projeto e configurando a classe para ativar o suporte ao cache usando o @enabelcaching.
Pequenos exemplos
Um pequeno exemplo é implementado usando o cache Springboot+JPA+.
Exemplo de diretório de etapas
1. Crie um projeto Maven
Crie um novo arquivo Maven Project Pom.xml da seguinte forma:
<? xml versão = "1.0" coding = "utf-8"?> <Projeto xmlns = "http://maven.apache.org/pom/4.0.0" xmlns: xsi = "http://www.ww3.org/2001/xmlschaMance xsi: schemalocation = "http://maven.apache.org/pom/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion> 4.0.0 </modelversion> <broupId> com.usd </GroupIdid </Groupidrsion> 4.0.0 </modelversion> <vroupId> com.ius </grupo <Versão> 1.0-SNAPSHOT </Version> <Dor> <Puperid> org.springframework.boot </foupid> <stifactId> primavera-boot-starter-parent </artifactId> <sipers> 1.3.0.release </sipers> </erstys> <sictties> <articl> com.us.us.us.us.release </versão> </erstess> <sict> <articl> com.us.us.us.us.us.us.us. <maven.compiler.target>1.8</maven.compiler.target> <maven.compiler.source>1.8</maven.compiler.source> </properties> <!-- Add typical dependencies for a web application --> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-cache</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <TRAFACTID> Spring-Boot-Starter-Web </starfactId> </dependency> <pendence> <puperid> net.sf.ehcache </groupiD> <ArtifactId> ehcache </ArtifactId> </dependency> <!-db-> <pendência> <puadeid> mysql </groupid> <artifactId>mysql-connector-java</artifactId> <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> <TarifactId> Commons-Logging </starfactId> </clusion> </cllusions> </pendence> </dependências> </Project>
2. Configuração do banco de dados
Crie um novo arquivo Application.Properties no diretório SRC/Main/Esouches, e o Conteúdo são as informações de conexão do banco de dados, como segue:
Application.Properties
ms.db.driverclassName = com.mysql.jdbc.driverms.db.url = jdbc: mysql: // localhost: 3306/cache? Prepstmtcachesize = 517 & cachePrepmts = trueConnec t = true & useUnicode = true & caracterEncoding = utf-8 & usessl = false & alipliCultiqueries = truems.db.username = rootms.db.password = xxxxxxms.db.maxactive = 500
Crie um novo arquivo de configuração dbconfig.java e configure a fonte de dados
pacote com.us.example.config;/*** Criado por Yangyibo em 17/1/13. */importar java.beans.propertyvetoException; importar org.springframework.beans.factory.annotation.autowired; importar org.springframework.context.annotation.bean; import org.sringFramework.Context.annotation.conofinciation; importação; import ou; com.mchange.v2.c3p0.combopooledDataSource; @configurationpublic classe dbconfig {@AUTOWIRed Private Environment Env; @Bean (name = "DataSource") public CombopooledDataSource DataSource () lança PropertyVeToException {CombopooledDataSource DataSource = new CombopooledDataSource (); DataSource.SetDriverClass (Env.getProperty ("ms.db.driverclassName")); DataSource.setJdbcurl (Env.getProperty ("ms.db.url")); dados DataSource.SetPassword (Env.getProperty ("ms.db.password")); DataSource.SetMaxPoolSize (20); DataSource.SetMinpoolSize (5); DataSource.setInitialPoolSize (10); DataSource.setMaxidLetime (300); DataSource.setAcquireincrement (5); DataSource.setIdleConnectionTestPeriod (60); return DataSource; }}Design do banco de dados, o banco de dados tem apenas uma tabela de pessoas, e o design é o seguinte:
3.JPA Configuração
O arquivo de configuração Spring-Data-JPA é o seguinte:
pacote com.us.example.config; importar java.util.hashmap; importar java.util.map; importar javax.persistence.entityManagerFactory; import javax.sql.dataSource; imported org.springframe.beanS.Factory.annOnCon.aUTOWIRCE; Importwird; org.springframework.context.annotation.configuration; importar org.springframework.data.jpa.repository.config.enablejparepositions; org.springframework.orm.jpa.localContaiRentityManagerFactoryBean; importar org.springframework.orm.jpa.vendor.hibernateJPavendorAdapter; importação org.springframework.transaction.platformTransactionManager; importação org.springframework.transaction.annotation.enableTransactionManagement;/*** Criado por Yangyibo em 17/1/13. */@Configuration@enableJParePositories ("com.us.example.dao")@enabetransactionManagement@componentsCanCublic Classe jpaconfig {@AUTOWIRED DATASEURCE DATASOURCE DATASOURCE; @Bean Public entityManagerFactory entityManagerFactory () {HibernateJPavendorAdapter VendorAdapter = new HibernateJPavendorAdapter (); LocalContainerEntityManagerFactoryBean Factory = New LocalContainerEntityManagerFactoryBean (); Factory.SetJPavendorAdapter (VendorAdapter); Factory.SetPackagestoscan ("com.us.example.bean"); Factory.SetDataSource (DataSource); Mapa <string, objeto> 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 (); retornar factory.getObject (); } @Bean Public PlatformTransactionManager transactionManager () {jpatransactionManager txManager = new jpatransactionManager (); txManager.SetEntityManagerFactory (entityManagerFactory ()); retornar txManager; }}4. Escreva feijão e camadas dao
Pessoa de classe de entidade. Java
pacote com.us.example.bean; importar javax.persistence.Entity; importar javax.persistence.GeneratedValue; importar javax.persistence.id; importar javax.persistence.table;/*** criado por yangyibo em 17/1/13. */ @Entity @tabela (name = "pessoa") public class Pessoa {@id @GeneratedValue Private Long Id; nome de string privado; idade inteira privada; endereço de string privado; public Person () {super (); } Pessoa pública (ID longo, nome da string, idade inteira, endereço da string) {super (); this.id = id; this.name = nome; this.age = idade; this.address = endereço; } public long getId () {return id; } public void setId (longo id) {this.id = id; } public string getName () {return name; } public void setName (nome da string) {this.name = name; } public integer getage () {retorna idade; } public void setage (idade inteira) {this.age = Age; } public string getAddress () {retornar endereço; } public void setAddress (endereço da string) {this.address = endereço; }}DAO Camada, PersonRepository.java
pacote com.us.example.dao; import com.us.example.bean.person; importar org.springframework.data.jpa.repository.jparepository;/*** criado por yangyibo em 17/1/13. */interface pública PersonRepository estende jparepository <pessoa, long> {}5. Escreva a camada de serviço
Interface de serviço
pacote com.us.example.service; import com.us.example.bean.person;/*** Criado por Yangyibo em 17/1/13. */Public Interface Demoservice {Public Person Save (pessoa da pessoa); Public Void Remover (Long Id); pessoa pública FindOne (pessoa da pessoa);}Implementação: (chave, adicione cache aqui)
pacote com.us.example.service.impl; import com.us.example.bean.person; importar com.us.example.dao.personRepository; importar com.us.example.service.demoservice; importar org.springframework.beaning.Anation.aUtowled; org.springframework.cache.annotation.cacheput; importar org.springframework.cache.annotation.cacheable; importar org.springframework.stereotype.service;/*** Criado por Yangyibo em 17/1/13. */ @ServicePublic Classe DemosServiceImpl implementa DemosService {@AUTOWIRED PERSONEPOSITE PERSONEPOSITEMENTE; @Override //@cache de cacheput Os dados recentemente adicionados ou atualizados ao cache, onde o nome do cache é pessoas. A chave dos dados é o ID da pessoa @cacheput (value = "pessoas", key = "#PERSON.ID") PESSOAL PESSOA DE System.out.println ("Para ID, a chave é:"+p.getId ()+"Data cache"); retornar p; } @Override // @CacheeVict Remova os dados com o ID da chave do cache People @cacheevict (value = "pessoas") public void remover (longo id) {System.out.println ("excluiu o cache de dados com a chave e a chave de @ @ @ @cache // cache @cache @cache @cache @cache p. Especificado os parâmetros de método são salvos no cache como chave.6. Escreva controlador
Para a conveniência dos testes, o get é usado
pacote com.us.example.controller; importar com.us.example.bean.person; importar com.us.example.service.demoservice; importar org.springframework.beans.actory.annotation.aUtowired; importar org.springFramework.teretypeype.Controller; org.springframework.web.bind.annotation.requestmapping; importar org.springframework.web.bind.annotation.Responsebody; importar org.springframework.web.bind.annotation.restcontroller; */ @RestControllerPublic Class CacheController {@AUTOWIRED PRIVADO DEMOSERVICE DE DEMOSERVICE; // http: // localhost: 8080/put? nome = abel & idade = 23 & endereço = shanghai @RequestMapping ("/put") Pessoa pública (pessoa) {return Demoservice.Save (pessoa); } // http: // localhost: 8080/capaz? id = 1 @RequestMapping ("/ABLE") @ResponseBody Public Pessoa Cache (pessoa de pessoa) {return Demoservice.findone (pessoa); } // http: // localhost: 8080/evit? id = 1 @RequestMapping ("/evit") public string evit (longo id) {demoservice.remove (id); retornar "ok"; }}7. Iniciar o cache
Lembre -se de ativar a configuração do cache na classe de inicialização.
pacote com.us.example; importar org.springframework.boot.autoconfigure.springbootapplication; importar org.springframework.cache.annotation.enableCaching; importomptspringframework.Contet.ConfigurablacticationConxtOntents oug.springFramework.Contet.ConfigurablacticationConxtOnTentsring.springframework org.springframework.boot.springApplication.*;/*** Criado por Yangyibo em 17/1/13. */@ComponentsCan (bashEpackages = "com.us.example")@springbootApplication@enabetCachingpublic Classe aplicativo {public static void main (string [] args) {configurableApplicationContext run = run (application.class, args); }}8. Capacidade de verificação e verificação de teste:
Inicie a classe de aplicativo e depois de iniciá -la, digite: http: // localhost: 8080/ABLE? ID = 1 No navegador (primeiro a inicializar vários dados no banco de dados.)
Saída do console:
"Os dados de ID e chave é: 1" foi armazenado em cache para esta consulta. Se você consultar os dados novamente, essa instrução não aparecerá, ou seja, o banco de dados não será consultado.
Inspeção colocada
Digite no navegador: http: // localhost: 8080/put? Nome = abel & idade = 23 & endereço = shanghai (insira um dados no banco de dados e coloque os dados no cache.)
Neste momento, o console de saída cache o registro:
Em seguida, ligue para o método ABLE novamente para consultar os dados. O banco de dados não será mais consultado e os dados serão lidos diretamente do cache.
Teste evit
Digite: http: // localhost: 8080/evit? Id = 1 no navegador (limpe o registro do cache, depois de limpá -lo, o registro será colocado no cache novamente após o acesso ao registro.)
Saída do console:
Switch Cache
1. Mude para Ehcache como cache
Adicione dependências no arquivo pom.xml
<Depencency> <GrupidId> net.sf.ehcache </groupiD> <TRAFACTID> ehcache </stutifactId> </pendencency>
Crie o arquivo de configuração ehcache.xml na pasta de recursos. O conteúdo do novo arquivo de configuração do ehcache são os seguintes. Esta bota de mola de arquivo vai digitalizar automaticamente
<? xml versão = "1.0" coding = "utf-8"?> <ehcache> <!-usado ao alternar para ehcache cache-> <cache name = "pessoas" maxElementsinMemory = "1000" /> < /ehcache>
2. Mude para goiaba como cache
Basta adicionar dependências no POM
<Depencency> <voundid> com.google.guava </frupid> <TRAFACTID> goiAVA </stutifactId> <versão> 18.0 </sisters> </pendence>
3. Mude para Redis como cache
Por favor, leia o próximo blog
Referência para este artigo: "O disruptor do Javaee Development: Spring Boot Practical Battle"
Código -fonte deste artigo: https://github.com/527515025/springboot.git
O exposto acima é todo o conteúdo deste artigo. Espero que seja útil para o aprendizado de todos e espero que todos apoiem mais o wulin.com.