您的位置:首页 > 数据库 > Redis

mybatis使用redis做二级缓存

2017-09-11 21:04 417 查看

最近在做项目时需要引入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 mvcresponse转json -->
       <!-- <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 mvcresponse转json -->
       <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包的版本问题

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java mybatis redis