mybatis使用redis做二级缓存

来源:互联网 发布:数据归一化啥意思 编辑:程序博客网 时间:2024/05/21 17:33

最近在做项目时需要引入redis做二级缓存,在网上找很多资料,然后尝试遇到很多问题,介绍的参差不齐,最后完成此功能。在此贴入代码,将自己所得贡献出来,希望能帮助到他人,如有问题可留言一起学习讨论。

1、Maven的pom文件

<?xmlversion="1.0"encoding="UTF-8"?>

<projectxmlns="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.0http://maven.apache.org/xsd/maven-4.0.0.xsd">

    <modelVersion>4.0.0</modelVersion>

   

    <groupId>com.lqf.proj</groupId>

    <artifactId>web_proj_parent</artifactId>

    <version>0.0.1-SNAPSHOT</version>

    <packaging>pom</packaging>

     

    <name>web_proj_parent</name>

    <url>http://maven.apache.org</url>

    <description>这是父模块,对子模块进行了集成,子模块对该模块进行了继承

    主要作用是对公共配置的统一管理</description>

     

    <properties>

       <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>

       <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>

        <maven.compiler.encoding>UTF-8</maven.compiler.encoding>

       <junit.version>4.10</junit.version>

        <springframework.version>3.2.10.RELEASE</springframework.version>

    </properties>

   

    <build>

        <plugins>

           <plugin>

              <groupId>org.apache.maven.plugins</groupId>

              <artifactId>maven-compiler-plugin</artifactId>

              <version>3.1</version>

              <configuration>

                <source>1.7</source>

                <target>1.7</target>

              </configuration>

            </plugin>

           <plugin>

              <groupId>org.apache.maven.plugins</groupId>

              <artifactId>maven-resources-plugin</artifactId>

              <version>2.7</version>

              <configuration>

                  <encoding>UTF-8</encoding>

              </configuration>

           </plugin>

           <!-- 生成doc -->

           <plugin> 

               <groupId>org.apache.maven.plugins</groupId> 

               <artifactId>maven-javadoc-plugin</artifactId> 

               <version>2.9.1</version> 

               <configuration> 

               <!-- 聚合项目生成到父级的target目录?-->

                   <aggregate>true</aggregate> 

               </configuration> 

           </plugin> 

        </plugins>

    </build>

   

    <dependencyManagement>

        <dependencies>

        </dependencies>

    </dependencyManagement>

   

    <dependencies>

        <!-- <dependency>

           <groupId>org.springframework</groupId>

           <artifactId>spring-test</artifactId>

           <version>${springframework.version}</version>

           <scope>test</scope>

        </dependency> -->

    <dependency>

       <groupId>commons-fileupload</groupId>

       <artifactId>commons-fileupload</artifactId>

       <version>1.2.1</version>

    </dependency>

   

    <!-- spring framework -->

    <dependency>

       <groupId>org.springframework</groupId>

       <artifactId>spring-web</artifactId>

       <version>${springframework.version}</version>

    </dependency>

    <dependency>

       <groupId>org.springframework</groupId>

       <artifactId>spring-aspects</artifactId>

       <version>${springframework.version}</version>

    </dependency>

    <dependency>

       <groupId>org.springframework</groupId>

       <artifactId>spring-webmvc</artifactId>

       <version>${springframework.version}</version>

    </dependency>

    <dependency>

       <groupId>org.springframework</groupId>

       <artifactId>spring-context</artifactId>

       <version>${springframework.version}</version>

    </dependency>

    <dependency>

       <groupId>org.springframework</groupId>

       <artifactId>spring-context-support</artifactId>

       <version>${springframework.version}</version>

    </dependency>

    <dependency>

       <groupId>org.springframework</groupId>

       <artifactId>spring-tx</artifactId>

       <version>${springframework.version}</version>

    </dependency>

    <dependency>

       <groupId>org.springframework</groupId>

       <artifactId>spring-jdbc</artifactId>

       <version>${springframework.version}</version>

    </dependency>

    <dependency>

       <groupId>org.springframework</groupId>

       <artifactId>spring-test</artifactId>

       <version>${springframework.version}</version>

       <scope>test</scope>

    </dependency>

    <!-- spring framework -->

   

        <dependency>

           <groupId>junit</groupId>

           <artifactId>junit</artifactId>

           <version>${junit.version}</version>

           <scope>test</scope>

        </dependency>

       

        <dependency>

           <groupId>javax.servlet</groupId>

           <artifactId>servlet-api</artifactId>

           <version>2.5</version>

       </dependency>

   

       <dependency>

           <groupId>org.freemarker</groupId>

           <artifactId>freemarker</artifactId>

           <version>2.3.20</version>

       </dependency>

       <dependency>

           <groupId>commons-logging</groupId>

           <artifactId>commons-logging</artifactId>

           <version>1.2</version>

       </dependency>

       <dependency>

           <groupId>commons-lang</groupId>

           <artifactId>commons-lang</artifactId>

           <version>2.6</version>

       </dependency>

       <dependency>

           <groupId>org.springframework</groupId>

           <artifactId>spring-mock</artifactId>

           <version>2.0.8</version>

           <scope>test</scope>

       </dependency>

      

       <!-- mybatis  -->

       <dependency>

           <groupId>org.mybatis</groupId>

           <artifactId>mybatis</artifactId>

           <version>3.4.2</version>

       </dependency>

       <dependency>

           <groupId>org.mybatis</groupId>

           <artifactId>mybatis-spring</artifactId>

           <version>1.3.0</version>

       </dependency>

       <dependency>

           <groupId>mysql</groupId>

           <artifactId>mysql-connector-java</artifactId>

           <version>5.1.32</version>

       </dependency>

       <!-- mybatis page plugins-->

       <dependency>

           <groupId>com.github.pagehelper</groupId>

           <artifactId>pagehelper</artifactId>

           <version>5.0.0</version>

       </dependency>

       <!-- mybatis  -->

      

       <dependency>

           <groupId>org.apache.commons</groupId>

           <artifactId>commons-collections4</artifactId>

           <version>4.0</version>

       </dependency>

       <dependency>

           <groupId>commons-dbcp</groupId>

           <artifactId>commons-dbcp</artifactId>

           <version>1.4</version>

       </dependency>

       <dependency>

           <groupId>commons-pool</groupId>

           <artifactId>commons-pool</artifactId>

           <version>1.6</version>

       </dependency>

       <dependency>

           <groupId>org.quartz-scheduler</groupId>

           <artifactId>quartz</artifactId>

           <version>2.2.3</version>

       </dependency>

       <!--https://mvnrepository.com/artifact/org.apache.poi/poi -->

       <dependency>

           <groupId>org.apache.poi</groupId>

           <artifactId>poi</artifactId>

           <version>3.15</version>

       </dependency>

       <!--https://mvnrepository.com/artifact/com.cloudhopper.proxool/proxool -->

       <dependency>

           <groupId>com.cloudhopper.proxool</groupId>

           <artifactId>proxool</artifactId>

           <version>0.9.1</version>

       </dependency>

   

       <!-- ** **logback** -->

       <!--https://mvnrepository.com/artifact/ch.qos.logback/logback-core -->

       <dependency>

           <groupId>ch.qos.logback</groupId>

           <artifactId>logback-core</artifactId>

           <version>1.1.7</version>

       </dependency>

       <dependency>

           <groupId>ch.qos.logback</groupId>

           <artifactId>logback-classic</artifactId>

           <version>1.1.7</version>

       </dependency>

       <!--https://mvnrepository.com/artifact/org.logback-extensions/logback-ext-spring-->

       <dependency>

           <groupId>org.logback-extensions</groupId>

           <artifactId>logback-ext-spring</artifactId>

           <version>0.1.4</version>

       </dependency>

       <!--https://mvnrepository.com/artifact/org.slf4j/slf4j-api -->

       <dependency>

           <groupId>org.slf4j</groupId>

           <artifactId>slf4j-api</artifactId>

           <version>1.7.21</version>

       </dependency>

       <dependency>

           <groupId>org.slf4j</groupId>

           <artifactId>jcl-over-slf4j</artifactId>

           <version>1.7.12</version>

       </dependency>

       <!-- ** **logback** -->

      

       <!--https://mvnrepository.com/artifact/com.alibaba/fastjson -->

       <dependency>

           <groupId>com.alibaba</groupId>

           <artifactId>fastjson</artifactId>

           <version>1.1.41</version>

       </dependency>

      

       <!-- spring mvcresponsejson -->

       <!-- <dependency>

          <groupId>com.fasterxml.jackson.core</groupId>

           <artifactId>jackson-core</artifactId>

          <version>2.0.0</version>

       </dependency>

       <dependency>

          <groupId>org.codehaus.jackson</groupId>

           <artifactId>jackson-core-asl</artifactId>

          <version>1.9.13</version>

       </dependency>

       -->

       <dependency>

            <groupId>com.fasterxml.jackson.core</groupId>

            <artifactId>jackson-annotations</artifactId>

            <version>2.7.4</version>

        </dependency>

        <dependency>

            <groupId>com.fasterxml.jackson.core</groupId>

            <artifactId>jackson-core</artifactId>

            <version>2.7.4</version>

        </dependency>

        <dependency>

            <groupId>com.fasterxml.jackson.core</groupId>

            <artifactId>jackson-databind</artifactId>

            <version>2.7.4</version>

        </dependency>

        <dependency>

            <groupId>org.codehaus.jackson</groupId>

            <artifactId>jackson-mapper-asl</artifactId>

            <version>1.7.1</version>

        </dependency>

       <!-- spring mvcresponsejson -->

       <dependency>

         <groupId>org.apache.commons</groupId>

         <artifactId>commons-lang3</artifactId>

         <version>3.6</version>

       </dependency>

      

       <!-- redis -->

        <dependency>

            <groupId>org.springframework.data</groupId>

            <artifactId>spring-data-redis</artifactId>

            <version>1.5.2.RELEASE</version>

        </dependency> 

       <dependency>

          <groupId>redis.clients</groupId>

          <artifactId>jedis</artifactId>

          <version>2.8.0</version>

        </dependency>

       <!-- redis -->

             

  </dependencies>

 

 

    <modules>

       <module>web_proj_config</module>

    <module>web_proj_admin</module>

    </modules>

</project>

 

2、Spring配置文件

Spring主配置文件添加

<import resource="classpath:/spring/spring3-redis.xml"/>

2.1、spring3-redis.xml

<?xmlversion="1.0"encoding="UTF-8"?>

 

<beansxmlns="http://www.springframework.org/schema/beans"

  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

  xmlns:p="http://www.springframework.org/schema/p"

  xsi:schemaLocation="

  http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd">

 

    <beanid="jedisPoolConfig"class="redis.clients.jedis.JedisPoolConfig">

        <propertyname="maxIdle"value="2000"/>

        <propertyname="maxTotal"value="20000"/>

        <propertyname="minEvictableIdleTimeMillis"value="300000"></property>

        <propertyname="numTestsPerEvictionRun"value="3"></property>

        <propertyname="timeBetweenEvictionRunsMillis"value="60000"></property>

        <propertyname="maxWaitMillis"value="20000"/>

        <propertyname="testOnBorrow"value="false"/>

    </bean>

   

    <!-- 在此将sentinel配置集成到redis连接池中 -->

    <beanid="jedisConnectionFactory"

       class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">

        <propertyname="hostName"value="192.168.248.128"/>

       <propertyname="port"value="6379"/>

       <propertyname="timeout"value="15000"/>

       <propertyname="database"value="0"/> 

        <propertyname="password"value="123456"/> 

        <propertyname="usePool"value="true"/> 

        <propertyname="poolConfig"ref="jedisPoolConfig"></property>

    </bean>

   

    <!-- 使用中间类解决RedisCache.jedisConnectionFactory的静态注入,从而使MyBatis实现第三方缓存 -->

    <beanid="redisCacheTransfer"class="com.lqf.utils.redis.RedisCacheTransfer">

        <propertyname="jedisConnectionFactory"ref="jedisConnectionFactory"/>

    </bean>

    <!--

    <bean id="redisTemplate"class="org.springframework.data.redis.core.RedisTemplate">

        <propertyname="connectionFactory"ref="jedisConnectionFactory"/> 

        <propertyname="keySerializer" >

        <beanclass="org.springframework.data.redis.serializer.StringRedisSerializer"/>

        </property>

        <propertyname="valueSerializer">

        <beanclass="org.springframework.data.redis.serializer.JdkSerializationRedisSerializer"/>

        </property>

    </bean>  -->

   

</beans>

3、RedisCache.java文件

package com.lqf.utils.redis;

 

 

importjava.util.concurrent.locks.ReadWriteLock;

import java.util.concurrent.locks.ReentrantReadWriteLock;

 

import org.apache.ibatis.cache.Cache;

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

importorg.springframework.data.redis.connection.jedis.JedisConnection;

importorg.springframework.data.redis.connection.jedis.JedisConnectionFactory;

importorg.springframework.data.redis.serializer.JdkSerializationRedisSerializer;

importorg.springframework.data.redis.serializer.RedisSerializer;

 

importredis.clients.jedis.exceptions.JedisConnectionException;

 

/**

 *

 * @描述: 使用第三方内存数据库Redis作为二级缓存

 */

public class RedisCache implements Cache

{

   private static final Logger logger =LoggerFactory.getLogger(RedisCache.class);

 

   private static JedisConnectionFactory jedisConnectionFactory;

 

   private final String id;

 

   /**

    * The {@code ReadWriteLock}.

    */

   private final ReadWriteLock readWriteLock = newReentrantReadWriteLock();

 

   public RedisCache(final String id) {

       if (id == null) {

           throw new IllegalArgumentException("Cache instances require anID");

       }

       logger.debug("MybatisRedisCache:id=" + id);

       this.id = id;

    }

 

   @Override

   public void clear()

    {

       JedisConnection connection = null;

       try

       {

           connection = jedisConnectionFactory.getConnection();

           connection.flushDb();

           connection.flushAll();

       }

       catch (JedisConnectionException e)

       {

           e.printStackTrace();

       }

       finally

       {

           if (connection != null) {

                connection.close();

           }

       }

    }

 

   @Override

   public String getId()

    {

       return this.id;

    }

 

   @Override

   public Object getObject(Object key)

    {

       Object result = null;

       JedisConnection connection = null;

       try

       {

           connection = jedisConnectionFactory.getConnection();

           RedisSerializer<Object> serializer = newJdkSerializationRedisSerializer();

           result = serializer.deserialize(connection.get(serializer.serialize(key)));

       }

       catch (JedisConnectionException e)

       {

           e.printStackTrace();

       }

       finally

       {

           if (connection != null) {

                connection.close();

           }

       }

       return result;

    }

 

   @Override

   public ReadWriteLock getReadWriteLock()

    {

       return this.readWriteLock;

    }

 

   @Override

   public int getSize()

    {

       int result = 0;

       JedisConnection connection = null;

       try

       {

           connection = jedisConnectionFactory.getConnection();

           result = Integer.valueOf(connection.dbSize().toString());

       }

       catch (JedisConnectionException e)

       {

           e.printStackTrace();

       }

       finally

       {

           if (connection != null) {

                connection.close();

           }

       }

       return result;

    }

 

   @Override

   public void putObject(Object key, Object value)

    {

       JedisConnection connection = null;

       try

       {

           connection = jedisConnectionFactory.getConnection();

           RedisSerializer<Object> serializer = new JdkSerializationRedisSerializer();

           connection.set(serializer.serialize(key), serializer.serialize(value));

       }

       catch (JedisConnectionException e)

       {

           e.printStackTrace();

       }

       finally

       {

           if (connection != null) {

                connection.close();

           }

       }

    }

 

   @Override

   public Object removeObject(Object key)

    {

       JedisConnection connection = null;

       Object result = null;

       try

       {

           connection = jedisConnectionFactory.getConnection();

           RedisSerializer<Object> serializer = newJdkSerializationRedisSerializer();

           result =connection.expire(serializer.serialize(key), 0);

       }

       catch (JedisConnectionException e)

       {

           e.printStackTrace();

       }

       finally

       {

           if (connection != null) {

                connection.close();

           }

       }

       return result;

    }

 

   public static void setJedisConnectionFactory(JedisConnectionFactoryjedisConnectionFactory) {

       RedisCache.jedisConnectionFactory = jedisConnectionFactory;

    }

 

}

4、RedisCacheTransfer.java文件

package com.lqf.utils.redis;

 

 

importorg.springframework.beans.factory.annotation.Autowired;

importorg.springframework.data.redis.connection.jedis.JedisConnectionFactory;

 

/**

 *

 * @描述: 静态注入中间类

 */

public class RedisCacheTransfer

{

 

   @Autowired

   public void setJedisConnectionFactory(JedisConnectionFactoryjedisConnectionFactory) {

       RedisCache.setJedisConnectionFactory(jedisConnectionFactory);

    }

 

}

 

5、menuMapper.xml文件添加全局缓存

<cache type="com.lqf.utils.redis.RedisCache"/>

6、注意事项

各个依赖jar包的版本问题

 

原创粉丝点击