Redis+Spring+Mybatis的整合

1、 引入jar包

2、 實現Mybatis緩存接口

 public class RedisCache implements Cache {

  private final ReadWriteLock readWriteLock = new ReentrantReadWriteLock();

  private String id;

  private static JedisConnectionFactory jedisConnectionFactory;

  protected static Logger logger = LogManager.getLogger();

  public RedisCache(String id) {

  if (id == null) {

throw new IllegalArgumentException("Cache instances require an ID");

         }

     logger.debug("---------------------Mybatis RedisCache:id=" + id + "---------------------");

    this.id = id;

     }

 

     /**

      * 清除所有數據

    */

     @Override

    public void clear() {

         JedisConnection connection = null;

         try {

             connection = (JedisConnection) jedisConnectionFactory.getConnection();

             connection.flushAll();

         } catch (JedisConnectionException e) {

             e.printStackTrace();

         } finally {

             if (connection != null) {

               connection.close();

             }

        }

     }

 

     /**

     * @return

      */

     @Override

     public String getId() {

         return this.id;

     }

 

     /**

      * 得到指定key的 value

      * @param key

      * @return object

      */

     @Override

     public Object getObject(Object key) {

    

         Object result = null;

         JedisConnection connection = null;

        try {

            connection = (JedisConnection) jedisConnectionFactory.getConnection();

             result = SerializeUtil.unserialize(connection.get(SerializeUtil.serialize(key)));

             //result = SerializeUtil.unserialize(connection.hGet(RedisCache.this.id.toString().getBytes(), key.toString().getBytes()));

         } catch (JedisConnectionException e) {

             e.printStackTrace();

         } finally {

             if (connection != null) {

                 connection.close();

             }

         }

         return result;

     }

 

     /**

      * 得到當前db的key值

     * @return int

      */

     @Override

     public int getSize() {

         int result = 0;

         JedisConnection connection = null;

         try {

             connection = (JedisConnection) jedisConnectionFactory.getConnection();

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

 //            result = Integer.valueOf(connection.hGetAll(RedisCache.this.id.toString().getBytes()).size());

         } catch (JedisConnectionException e) {

             e.printStackTrace();

         } finally {

             if (connection != null) {

                 connection.close();

             }

         }

         return result;

     }

 

     /**

      * 寫入 key-value

      * @param key

     * @param value

      */

     @Override

     public void putObject(Object key, Object value) {

         JedisConnection connection = null;

         try {

             logger.debug("------------------Redis Put Object:" + key.toString() + ":" + value.toString() + "-------------------");

             connection = (JedisConnection) jedisConnectionFactory.getConnection();

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

 //            connection.hSet(RedisCache.this.id.toString().getBytes(),key.toString().getBytes(),SerializeUtil.serialize(value));

         } catch (JedisConnectionException e) {

             e.printStackTrace();

         } finally {

             if (connection != null) {

                 connection.close();

             }

         }

     }

 

     /**

     * 刪除指定key的值

      * @param key

      * @return

     */

     @Override

     public Object removeObject(Object key) {

         JedisConnection connection = null;

         Object result = null;

         try {

             connection = (JedisConnection) jedisConnectionFactory.getConnection();

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

             //或者  result = connection.del(SerializeUtil.serialize(key));

 //            result = connection.hDel(RedisCache.this.id.toString().getBytes(),key.toString().getBytes());

         } catch (JedisConnectionException e) {

             e.printStackTrace();

         } finally {

             if (connection != null) {

               connection.close();

            }

         }

         return result;

     }

 

     @Override

     public ReadWriteLock getReadWriteLock() {

         return this.readWriteLock;

     }

 

     /**

      * 注入jedisConnectionFactory

      * @param jedisConnectionFactory

      */

     public static void setJedisConnectionFactory(JedisConnectionFactory jedisConnectionFactory) {

         RedisCache.jedisConnectionFactory = jedisConnectionFactory;

     }

 }

3、   使用中間類解決RedisCache.jedisConnectionFactory的靜態注入,從而使MyBatis實現第三方緩存

public class RedisCacheTransfer {

 

    @Autowired

    public void setJedisConnectionFactory(JedisConnectionFactory jedisConnectionFactory) {

        RedisCache.setJedisConnectionFactory(jedisConnectionFactory);

    }

}

 

<!-- 使用中間類解決RedisCache.jedisConnectionFactory的靜態注入,從而使MyBatis實現第三方緩存 -->

    <bean id="redisCacheTransfer" class="org.xkp.util.RedisCacheTransfer">

        <property name="jedisConnectionFactory" ref="jedisConnFactory"/>

</bean>

4、使用Spring管理與redis的連接

<bean id="jedisConnFactory"

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

        <property name="hostName" value="192.168.1.111"/>

        <property name="port" value="6379"/>

        <!--<property name="poolConfig" ref="poolConfig"/>-->

        <!--<constructor-arg ref="redisSentinelConfiguration"/>-->

        <property name="timeout" value="10000"/>

</bean>

5、在mapper映射文件中開啓二級緩存

<cache type="org.xkp.util.RedisCache"/>

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章