Integração SSM+Redis
A estrutura do SSM já foi construída antes, portanto, nenhuma cópia de código é feita aqui.
Aqui, usamos principalmente o Redis para fazer do cache secundário da Mybatis. Tudo seleciona no arquivo de mapeamento MyBaits atualizará o cache existente. Se não existir, um novo cache será criado. Todas as operações de inserção e atualização atualizarão o cache.
Os benefícios do Redis também são óbvios, o que pode aumentar o desempenho do acesso de dados do sistema. Esta seção mostra apenas os métodos e efeitos de integração e será complementada posteriormente por artigos que compartilham clusters Redis, balanceamento de carga e sessões.
Vamos começar o trabalho de integração:
O back-end é iniciado primeiro (o método de iniciar e conectar remotamente os serviços Linux requer alterar o arquivo Redis.conf) e inicie o comando "./src/redis-sherver ./redis.conf"
Eu o desenvolvi no sistema Windows. Eu recomendo uma ferramenta visual "Redis Desktop Manager". Requer conexão remota ao Redis no Linux e a porta precisa ser aberta ao público no Linux (o método específico é modificar o arquivo/etc/sysconfig/iptables e adicionar comandos de desenvolvimento de porta externa).
Depois que todas as operações acima forem concluídas, a conexão remota será bem -sucedida, como mostrado na figura:
Ainda não há registro de cache. Vamos entrar no estágio do código. Primeiro, adicione o pacote Redis Jar necessário ao pom.xml.
<Depencency> <PuerpId> Redis.clients </frupiD> <TRAFACTID> JEDIS </STIFACTID> <Versão> 2.9.0 </version> </dependency> <pendency> <puperid> org.springframework.data </groupid> <stifactId> spring-data-redis </artefactId> <groupId>org.mybatis</groupId> <artifactId>mybatis-ehcache</artifactId> <version>1.0.0</version> </dependency> <!-- Add druid connection pool package--> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.0.24</version> </dependency>
Depois que o pom.xml é escrito, dois novos arquivos de configuração precisam ser adicionados: redis.properties
redis.host = 192.168.0.109redis.port = 6379redis.pass = 123456redis.maxidle = 200redis.maxactive = 1024redis.maxwait = 10000redis.testonborrow = true
Os campos também são fáceis de entender e, em seguida, adicione o arquivo de configuração: spring-redis.xml
<Beans xmlns = "http://www.springframework.org/schema/beans" xmlns: xsi = "http://www.w.org/2001/xmlschema-innstance" xmlns: p = "http://xmlschema-innstance" xmlns: mvc = "http://www.springframework.org/schema/mvc" xmlns: util = "http://www.springframework.org/schema/util" xmlns: aop = "http://www.springframework.org/schema/aop" xmlns: context = "http://www.springframework.org/schema/Context" Xmlns: "Htttp.org/schema/Context" Xmlns: "Http.org/schema/Context" xmlns: "" xsi: schemalocation = "http://www.springframework.org/schema/beans http://www.springframework.org/schema/util http://www.springframe-schemx.schema http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-43.xsd http://ww.springframework.orgumhema http://www.springframework.org/schema/aop/spring-aop-4.3.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd"> <!-- Basic Configuração de parâmetros do pool de conexões, semelhante ao pool de conexão do banco de dados-> <Contexto: Property-placeholder Location = "ClassPath*: Redis.properties" /> <Bean id = "PoolConfig"> <Nome da propriedade "MAXTOTAL" Value = "$ {Redis.max}" /> <Nome da propriedade = "MaxIDIDLE" name = "testOnBorrow" value = "$ {Redis.testonborrow}"/> </bean> <!-Configuração do pool de conexões, semelhante ao pool de conexão do banco de dados-> <bean id = "jedisconnectionfactory"> <propriedades name = "hostName" = "$ {Redis.host}"> <// <propriedade name = "senha" value = "$ {redis.pass}"> </propriedade> <propriedade name = "poolconfig" ref = "poolconfig"> </property> </bean> <!-ligue para o pool de conexões Configuração de fábrica <disconnection-> <!-<Bean id = "Redistemplate"> <nonnEn Name = "JEdisconnection" Configurado e use a string de forma inteligente ao armazenar. Se você usar o tipo de usuário para armazenar, ele solicitará um erro que o usuário não poderá ser lançado na sequência! ! ! <Propriedade name = "KeySerializer"> <bean/> </Property> <propriedade name = "valoreserializer"> <bean/> </property> </bean> -> <bean id = "RediscacheTransfer"> <Nome da propriedade = "JedisconnectionFactory" = "JedisconnectionFactory"> </bean> </bean>Depois que o arquivo de configuração for escrito, comece a escrever o código Java:
Jedisclusterfactory.java
pacote com.cjl.util; importar java.util.hashset; importar java.util.properties; importar java.util.set; importar java.util.regex.pattern; importação org.apache.commons.pool2.impl.genericObjectPoolConfig; importação ousningFache.Commons.Pool2.impl.genericObjectPoolConfig; import.srgodfrather.srtherflouns.pool2.impl.genericObjectPoolFig; org.springframework.beans.factory.initializandoBean; importar org.springframework.core.io.resource; importar redis.clients.jedis.hostandport; importCluster.cliients.jedis.jediscuster; public class; private string endereçokeyprefix; Privado Jediscluster Jediscluster; tempo inteiro privado; MaxRredirections privados inteiros; Private GenericoBjectPoolConfig GenericoBjectPoolConfig; padrão privado p = padrony.compile ("^.+[:] // d {1,5} // s*$"); public jediscluster getObject () lança exceção {return jediscluster; } classe pública <? estende JEDIScluster> getObjectType () {return (this.jediscluster! = null? this.jediscluster.getclass (): jediscluster.class); } public boolean Issingleton () {return true; } conjunto privado <dostandport> parsehostandport () lança exceção {try {Properties prop = new Properties (); Prop.Load (this.addressConfig.getInputStream ()); Set <dostandport> hasps = new Hashset <dostandport> (); para (chave do objeto: prop.KeySet ()) {if (! ((string) key) .startswith (endereçoeprefix)) {continuação; } String val = (string) prop.get (key); boolean isipport = p.matcher (val) .matches (); if (! isipport) {lança nova ilegalArgumentException ("IP ou porta é ilegal"); } String [] ipandport = val.split (":"); Hostandport hap = new hostandport (ipandport [0], inteiro.parseint (ipandport [1])); haps.add (hap); } retornar hasps; } catch (ilegalargumentException ex) {tiro ex; } catch (Exceção ex) {lança nova exceção ("Parse JEDIS FILEFIGADO DE CONFIGURAÇÃO Falha", Ex); }} public void depoisPropertiESSET () lança a exceção {set <dostandport> hasps = this.parseHostandport (); Jediscluster = New Jediscluster (HAPS, Timeout, MaxRredirections, GenericoBjectPoolConfig); } public void setAddressConfig (Recurso endereçoConfig) {this.addressConfig = endereçoConfig; } public void setTimeout (int timeout) {this.Timeout = timeout; } public void setMaxRedirections (int maxredirections) {this.maxRedirections = maxRedirections; } public void setAddressKeyPrefix (String endereçoKEYPREFIX) {this.addressKeyPrefix = endereçoKeyPrefix; } public void SetGenericObjectPoolConfig (GenericObjectPoolConfig GenericoBjectPoolConfig) {this.geRericObjectPoolConfig = GenericoBjectPoolConfig; }}Rediscache.java
pacote com.cjl.util; importar java.util.concurrent.locks.readwritelock; importar java.util.concurrent.locks.reentrantreadwritelock; importar org.apache.ibatis.cache.cache; import org.slf4j.portgger; import ouslf org.springframework.data.redis.connection.jedis.jedisconnection; importar org.springframework.data.redis.connection.jedis.jedisconnectionFactory; import org.springframework.data.rector org.springframework.data.redis.serializer.redisserializer; importar redis.clients.jedis.exceptions.jedisconnectionException; classe pública rediscache implementa cache {private static logger logger = loggerFactory.getLogger (rediscache.class); Jedisconnection privado JedisconnectionFactory; ID de string final privado; Final Private ReadWritelock RWL = new ReentrantreadWritelock (); public RediscAche (Final String ID) {if (id == null) {lança nova ilegalArgumentException ("instâncias de cache requerem um id"); } logger.debug ("mybatisRediscache: id =" + id); this.id = id; } / *** Limpe todos os caches* / public void clear () {rwl.readlock (). Lock (); Jedisconnection Connection = null; tente {conexão = jedisconnectionFactory.getConnection (); conexão.flushdb (); Connection.flushall (); } catch (jedisconnectionException e) {e.printStackTrace (); } finalmente {if (conexão! = null) {conexão.close (); } rwl.readlock (). Unlock (); }} public string getId () {return this.id; } / *** Obtenha o número total de caches* / public int getSize () {int resultado = 0; Jedisconnection Connection = null; tente {conexão = jedisconnectionFactory.getConnection (); resultado = integer.valueof (conexão.dbsize (). tostring ()); Logger.info ("Adicione o número do cache secundário myBaits:" + resultado); } catch (jedisconnectionException e) {e.printStackTrace (); } finalmente {if (conexão! = null) {conexão.close (); }} Retornar resultado; } public void putObject (chave do objeto, valor do objeto) {rwl.Writelock (). Lock (); Jedisconnection Connection = null; tente {conexão = jedisconnectionFactory.getConnection (); Redisserializer <ject> serializador = new jdkserializationRedisSerializer (); Connection.set (serializeutil.Serialize (Key), Serializeutil.Serialize (Value)); Logger.info ("Adicione o cache secundário myBaits key =" + key + ", value =" + valor); } catch (jedisconnectionException e) {e.printStackTrace (); } finalmente {if (conexão! = null) {conexão.close (); } rwl.writelock (). desbloqueio (); }} public Object getObject (chave do objeto) {// Obtenha dados do cache primeiro, adicione o bloqueio de leitura rwl.readlock (). Lock (); Resultado do objeto = nulo; Jedisconnection Connection = null; tente {conexão = jedisconnectionFactory.getConnection (); Redisserializer <ject> serializador = new jdkserializationRedisSerializer (); resultado = serializer.Deserialize (Connection.get (serializer.Serialize (Key))); Logger.info ("Hit MyBaits Level 2 Cache, value =" + resultado); } catch (jedisconnectionException e) {e.printStackTrace (); } finalmente {if (conexão! = null) {conexão.close (); } rwl.readlock (). Unlock (); } resultado de retorno; } public Object RemepObject (chave do objeto) {rwl.WriteLock (). Lock (); Jedisconnection Connection = null; Resultado do objeto = nulo; tente {conexão = jedisconnectionFactory.getConnection (); Redisserializer <ject> serializador = new jdkserializationRedisSerializer (); resultado = conexão.Expire (serializer.Serialize (chave), 0); } catch (jedisconnectionException e) {e.printStackTrace (); } finalmente {if (conexão! = null) {conexão.close (); } rwl.writelock (). desbloqueio (); } resultado de retorno; } public static void setjedisconnectionFactory (JedisconnectionFactory JedisconnectionFactory) {Rediscache.jedisconnectionFactory = JedisconnectionFactory; } public readWritelock getReadWritelock () {// TODO Método Gerado Auto-Gerado Stub Return RWL; }}RediscacheTransfer.java
pacote com.cjl.util; importar org.springframework.beans.factory.annotation.aUtowired; importar org.springframework.data.redis.connection.jedis.jedisconnectionFactory;/*** injeção estática de classes intermediárias*/public class Redetransfer {*** injeção de publicação intermediária*/public Redetransfer { SetjedisconnectionFactory (JedisconnectionFactory JedisconnectionFactory) {RedisCache.SetJedisconnectionFactory (JedisconnectionFactory); }}Serializeutil.java
pacote com.cjl.util; importar java.io.byteArrayInputStream; importar java.io.bytearrayoutputStream; importar java.io.objectinputStream; importar java.io.ObjectOutStream;/** * * @Author cjl */public class Serializeutil { {ObjectOutputStream ooS = null; BytearrayOutputStream baos = null; tente {// serialização baos = novo bytearrayoutputStream (); OOS = new ObjectOutputStream (Baos); oos.WriteObject (objeto); byte [] bytes = baos.tobytearray (); retornar bytes; } catch (Exceção e) {e.printStackTrace (); } retornar nulo; } / ***Deserialização* / objeto estático público não reiniciam (byte [] bytes) {if (bytes! = Null) {byteArrayInputStream Bais = null; tente {// Deserialize Bais = novo byteArrayInputStream (bytes); ObjectInputStream ois = new ObjectInputStream (Bais); retornar oIS.readObject (); } catch (Exceção e) {}} retornar null; }}Depois que tudo estiver pronto, você precisa modificar o arquivo de mapeamento
Para tornar o cache do MyBaits eficaz, você também precisa ativar o cache secundário, como mostrado na figura acima. O arquivo de configuração também precisa ser carregado no web.xml para entrar em vigor
Quando tudo estiver pronto, comece o serviço
Depois que a startup for bem -sucedida, clicar no formulário do funcionário pode acionar o método de consultar todos os funcionários. Quando a declaração de consulta é executada pela primeira vez, você pode ver que o Mybatis imprimiu a instrução de consulta e atualizou um cache no servidor Redis.
Limpamos o console e clicamos no botão de funcionário da consulta para executar o método de consulta. Podemos ver que nenhuma declaração de consulta é executada, provando que a segunda consulta recebe o valor diretamente do cache e não há conexão com o MySQL para consulta.
Resumir
O acima é o método de integração do Redis e SSM (cache do nível 2 do Mybatis) introduzido a você pelo editor. Espero que seja útil para todos. Se você tiver alguma dúvida, deixe -me uma mensagem e o editor responderá a todos a tempo. Muito obrigado pelo seu apoio ao site wulin.com!