(spring-data-redis)SSM框架下使用redis作为mybatis的二级缓存

来源:互联网 发布:ubuntu给予文件夹权限 编辑:程序博客网 时间:2024/05/19 04:03

为了使查询更高效所以本文采用redis作为二级缓存

开发环境:maven3.5+eclipse4.5.2+jdk1.7+tomcat1.7

操作系统:win7 64

spring 4.2.4 mybatis 3.4.2  spring-data-redis 1.6.2 


redis如果没有linux服务器或者虚拟机(关于linux安装redis请查看文章)

可以下载一个window版 下载地址  https://github.com/MicrosoftArchive/redis/releases


设置redis密码

下载解压后。打开 redis.windows-service.conf 的文件

修改#requirepass foobared

requirepass 123456 及开启redis权限密码为123456


cmd命令到redis跟路径,redis-server.exe  redis.windows-service.conf 启动redis服务端


另外再打开一个cmd命令到redis跟路径,redis-cli.exe 启动redis客户端,auth 密码(123456) 表示赋了权限

就可以在cmd窗口进行redis的简单key value的操作了



回到正题。进入项目

在pom.xml 添加redis配置

1、添加jar依赖

<jedis.verison>2.6.2</jedis.verison><spring-data-redis.version>1.6.2.RELEASE</spring-data-redis.version>
<dependency><groupId>org.springframework.data</groupId><artifactId>spring-data-redis</artifactId><version>${spring-data-redis.version}</version><exclusions><exclusion><artifactId>log4j</artifactId><groupId>log4j</groupId></exclusion><exclusion><artifactId>slf4j-log4j12</artifactId><groupId>org.slf4j</groupId></exclusion></exclusions></dependency><dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>${jedis.verison}</version></dependency>


2、spring配置


添加spring-redis.xml

<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"xmlns:context="http://www.springframework.org/schema/context"xmlns:mongo="http://www.springframework.org/schema/data/mongo"xsi:schemaLocation="        http://www.springframework.org/schema/beans         http://www.springframework.org/schema/beans/spring-beans.xsd        http://www.springframework.org/schema/context           http://www.springframework.org/schema/context/spring-context.xsd        http://www.springframework.org/schema/data/mongo        http://www.springframework.org/schema/data/mongo/spring-mongo.xsd        "><bean id="poolConfig" class="redis.clients.jedis.JedisPoolConfig">    <property name="maxIdle" value="${redis.maxIdle}" />    <property name="maxWaitMillis" value="${redis.maxWaitMillis}" />    <property name="testOnBorrow" value="${redis.testOnBorrow}" /></bean><bean id="jedisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory"    p:host-name="${redis.host}" p:port="${redis.port}"     p:password="${redis.password}" p:pool-config-ref="poolConfig" />   <!-- 使用中间类解决RedisCache.jedisConnectionFactory的静态注入,从而使MyBatis实现第三方缓存 --><bean id="redisCacheTransfer" class="cn.erp.commons.cache.RedisCacheTransfer">    <property name="jedisConnectionFactory" ref="jedisConnectionFactory"/></bean> </beans>


spring-dataSource.xml

<!-- 创建SQLSESSIONFACTYORY,同时制定数据源 --><bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"><property name="dataSource" ref="dataSource" /><property name="mapperLocations" value="classpath:mapper/**/*.xml"/><property name="plugins">            <array>                <bean class="com.github.pagehelper.PageHelper">                    <property name="properties">                        <value>                            dialect=mysql                        </value>                    </property>                </bean>            </array>        </property>        <!-- 开启缓存支持 -->        <property name="configurationProperties">            <props>                <prop key="cacheEnabled">true</prop>                <!-- 查询时,关闭关联对象即时加载以提高性能 -->                <prop key="lazyLoadingEnabled">false</prop>                <!-- 设置关联对象加载的形态,此处为按需加载字段(加载字段由SQL指定),不会加载关联表的所有字段,以提高性能 -->                <prop key="aggressiveLazyLoading">true</prop>                <!-- 对于未知的SQL查询,允许返回不同的结果集以达到通用的效果 -->                <prop key="multipleResultSetsEnabled">true</prop>                <!-- 允许使用列标签代替列名 -->                <prop key="useColumnLabel">true</prop>                <!-- 允许使用自定义的主键值(比如由程序生成的UUID 32位编码作为键值),数据表的PK生成策略将被覆盖 -->                <prop key="useGeneratedKeys">true</prop>                <!-- 给予被嵌套的resultMap以字段-属性的映射支持 -->                <prop key="autoMappingBehavior">FULL</prop>                <!-- 对于批量更新操作缓存SQL以提高性能 -->                <prop key="defaultExecutorType">BATCH</prop>                <!-- 数据库超过25000秒仍未响应则超时 -->                <prop key="defaultStatementTimeout">25000</prop>            </props>       </property></bean>

3、创建对应的创建RedisCache类

/** * 使用第三方内存数据库Redis作为二级缓存 * @author leeclick * 2017-10-02 15:00:36 */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 = new ReentrantReadWriteLock();    public RedisCache(final String id) {        if (id == null) {            throw new IllegalArgumentException("Cache instances require an ID");        }        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 = new JdkSerializationRedisSerializer();            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 = new JdkSerializationRedisSerializer();            result =connection.expire(serializer.serialize(key), 0);        }        catch (JedisConnectionException e)        {            e.printStackTrace();        }        finally        {            if (connection != null) {                connection.close();            }        }        return result;    }    public static void setJedisConnectionFactory(JedisConnectionFactory jedisConnectionFactory) {        RedisCache.jedisConnectionFactory = jedisConnectionFactory;    }}

创建RedisCacheTransfer类

/** *  * 静态注入中间类 * @author leeclick * 2017-10-02 15:02:44 */public class RedisCacheTransfer {    @Autowired    public void setJedisConnectionFactory(JedisConnectionFactory jedisConnectionFactory) {        RedisCache.setJedisConnectionFactory(jedisConnectionFactory);    }}

4、在需要缓存的Mapper.xml配置文件中开启二级缓存

<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" ><mapper namespace="cn.hlhdj.duoji.erp.model.dao.goods.CategoryMapper" > <cache type="cn.erp.commons.cache.RedisCache"/><select id="findbyPropertyNameId" parameterType="int" resultType="cn.erp.model.entity.goods.Category">SELECT*FROMt_goods_categoryWHEREid IN (SELECTcategory_idFROMr_goods_categoryWHEREproperty_name_id = #{id})</select></mapper>

在页面上查询一次后

在redis客户端redis-cli.exe 输入keys * 

发现查询结果已经存入redis




阅读全文
0 0
原创粉丝点击