redis扩展ibatis缓存

来源:互联网 发布:大数据融合技术 kettle 编辑:程序博客网 时间:2024/06/02 02:19

ibaits缓存介绍:
1、 http://www.cnblogs.com/yongze103/archive/2011/07/25/2116593.html
2、http://blog.csdn.net/woshixuye/article/details/8062038
3、http://www.cnblogs.com/phoebus0501/archive/2011/05/17/2048462.html

redis介绍:
http://blog.csdn.net/u012385190/article/details/53424931

jedis介绍:
Jedis是redis的java版本的客户端实现
http://blog.csdn.net/u012385190/article/details/53464621

下面开始使用ibatis缓存

部分代码:

sqlMapConfig.xml

<!-- 扩展缓存 -->    <typeAlias alias="CMCF_CACHE" type="com.cmcf.web.base.controller.RedisController" />

顺便提一句,要使用缓存注意SqlMapConfig.xml文件中settings节点配置cacheModelsEnabled为true!

<settings      cacheModelsEnabled="true"      useStatementNamespaces="true"       ...   />  

实体类sql.xml

    <!-- 缓存配置 -->    <cacheModel id="pmcache" readOnly="true" serialize="false" type="CMCF_CACHE">        <!-- 当下面方法执行时刷新缓存 -->        <flushOnExecute statement="com.cmcf.model.entity.sf.SfInfoEntity.save" />        <flushOnExecute statement="com.cmcf.model.entity.sf.SfInfoEntity.insert" />        <flushOnExecute statement="com.cmcf.model.entity.sf.SfInfoEntity.update" />        <flushOnExecute statement="com.cmcf.model.entity.sf.SfInfoEntity.delete" />        <flushOnExecute statement="com.cmcf.model.entity.sf.SfInfoEntity.deleteByIds" />    </cacheModel>    <!--利用缓存 配置cacheModel="pmcache"   pmcache为缓存配置的id值-->    <!-- 根据公司id查询旗下基金信息 -->    <select id="queryOrgDeputyPro" resultClass="hashmap" cacheModel="pmcache">        SELECT * FROM sfinfo where id=#id#    </select>

这样一配置,当数据库调用id为queryOrgDeputyPro的查询时将会在redis中缓存sql语句(调用实现了CacheController的putObject方法),下次再查询会调用getObject方法,同时如果调用SfInfoEntity这个对象的增删改方法会清空redis缓存(调用CacheController的flush方法)。




redis.properties 配置:

redis.pool.maxActive=10000redis.pool.maxIdle=500redis.pool.maxWait=1000redis.pool.testOnBorrow=falseredis.pool.testOnReturn=falseredis.host=你的ip地址redis.port=6379redis.db.pk=ztolredis.password=myRedis




redis java客户端代码

pom.xml

<dependency>    <groupId>redis.clients</groupId>    <artifactId>jedis</artifactId>    <version>2.8.2</version></dependency>

RedisController 类

/* * Description: redis扩展ibatis缓存       * History: //修改记录 * <author>      <time>      <version>    <desc> * 修改人姓名             修改时间            版本号                  描述 */package com.cmcf.web.base.controller;import java.util.Properties;import org.apache.commons.lang3.StringUtils;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import redis.clients.jedis.Jedis;import redis.clients.jedis.JedisPool;import redis.clients.jedis.JedisPoolConfig;import redis.clients.jedis.Protocol;import com.cmcf.utils.SerializeUtil;import com.ibatis.sqlmap.engine.cache.CacheController;import com.ibatis.sqlmap.engine.cache.CacheModel;/** * redis扩展ibatis缓存<br> * @see [相关类/方法](可选) * @since [产品/模块版本] (可选) */public class RedisController implements CacheController {    /**     * 日志记录器     */    private static final Logger LOGGER = LoggerFactory.getLogger(RedisController.class);    /**     * 默认redis属性配置文件     */    private static final String DEFAULT_REDIS_PROP = "properties/redis.properties";    /**     * 数据库唯一标识     */    private String dbPk = "/";    /**     * redis java客户端连接池     */    private JedisPool pool;    @Override    public void flush(CacheModel cacheModel) {        Jedis jedis = null;        try {            jedis = getJedis();            jedis.flushDB();        } catch (Exception e) {            LOGGER.error(e.getMessage(), e);        } finally {            if (null != jedis) {                // 释放redis对象                pool.returnResource(jedis);            }        }    }    @Override    public Object getObject(CacheModel cacheModel, Object key) {        String keyString = key.toString();        Object value = null;        Jedis jedis = null;        try {            jedis = getJedis();            byte[] byteArray = jedis.hget(SerializeUtil.serialize(buildId(cacheModel)),                    SerializeUtil.serialize(keyString));            if (null != byteArray) {                value = SerializeUtil.unserialize(byteArray);                if (CacheModel.NULL_OBJECT.equals(value)) {                    value = null;                }            }        } catch (Exception e) {            LOGGER.error(e.getMessage(), e);        } finally {            if (null != jedis) {                pool.returnResource(jedis);            }        }        return value;    }    @Override    public void putObject(CacheModel cacheModel, Object key, Object value) {        String keyString = key.toString();        Jedis jedis = null;        try {            jedis = getJedis();            jedis.hset(SerializeUtil.serialize(buildId(cacheModel)), SerializeUtil.serialize(keyString),                    SerializeUtil.serialize(value));        } catch (Exception e) {            LOGGER.error(e.getMessage(), e);        } finally {            if (null != jedis) {                pool.returnResource(jedis);            }        }    }    /**     * 功能描述: <br>     * 创建id     */    private String buildId(CacheModel cacheModel) {        return this.dbPk + cacheModel.getId();    }    @Override    public Object removeObject(CacheModel cacheModel, Object key) {        String keyString = key.toString();        Jedis jedis = null;        try {            jedis = getJedis();            Object result = jedis.expire(SerializeUtil.serialize(keyString), 0);            if (CacheModel.NULL_OBJECT.equals(result)) {                return null;            } else {                return result;            }        } catch (Exception e) {            LOGGER.error(e.getMessage(), e);            return null;        } finally {            if (null != jedis) {                pool.returnResource(jedis);            }        }    }    @Override    public void setProperties(Properties props) {        rebuildProperties(props);        JedisPoolConfig config = configJedisPoolConfig(props);        pool = buildJedisPool(props, config);    }    /**     * 功能描述: <br>     * 重建属性信息,将默认配置进行填充     */    private void rebuildProperties(Properties props) {        Properties defaultProperties = new Properties();        try {            defaultProperties.load(RedisController.class.getClassLoader().getResourceAsStream(DEFAULT_REDIS_PROP));        } catch (Exception ex) {            LOGGER.warn("load redis.properties failed", ex);        }        defaultProperties.putAll(props);        props.clear();        props.putAll(defaultProperties);    }    /**     * 功能描述: <br>     * 构建jedis pool     */    private JedisPool buildJedisPool(Properties props, JedisPoolConfig config) {        String host = props.getProperty("redis.host");        String portStr = props.getProperty("redis.port");        // String password = props.getProperty("redis.password");        int port = Protocol.DEFAULT_PORT;        if (StringUtils.isNumeric(portStr)) {            port = Integer.parseInt(portStr);        }        int timeout = Protocol.DEFAULT_TIMEOUT;        String timeoutStr = props.getProperty("redis.timeout");        if (StringUtils.isNumeric(timeoutStr)) {            timeout = Integer.parseInt(timeoutStr);        }        String dbPkStr = props.getProperty("redis.db.pk", "/");        if (dbPkStr.endsWith("/")) {            this.dbPk = dbPkStr;        } else {            this.dbPk = dbPkStr + "/";        }        // return new JedisPool(config, host, port, timeout, password);        return new JedisPool(config, host, port, timeout);    }    /**     * 功能描述: <br>     * 配置jedis pool config     */    private JedisPoolConfig configJedisPoolConfig(Properties props) {        JedisPoolConfig config = new JedisPoolConfig();        String maxActive = props.getProperty("redis.pool.maxActive");        if (StringUtils.isNumeric(maxActive)) {            config.setMaxActive(Integer.valueOf(maxActive));        }        String maxIdle = props.getProperty("redis.pool.maxIdle");        if (StringUtils.isNumeric(maxIdle)) {            config.setMaxIdle(Integer.valueOf(maxIdle));        }        String maxWait = props.getProperty("redis.pool.maxWait");        if (StringUtils.isNumeric(maxWait)) {            config.setMaxWait(Long.valueOf(maxWait));        }        String testOnBorrow = props.getProperty("redis.pool.testOnBorrow");        if (StringUtils.isNotBlank(testOnBorrow)) {            config.setTestOnBorrow(Boolean.valueOf(testOnBorrow));        }        String testOnReturn = props.getProperty("redis.pool.testOnReturn");        if (StringUtils.isNotBlank(testOnReturn)) {            config.setTestOnReturn(Boolean.valueOf(testOnBorrow));        }        String minEvictableIdle = props.getProperty("redis.pool.minEvictableIdle");        if (StringUtils.isNumeric(minEvictableIdle)) {            config.setMinEvictableIdleTimeMillis(Long.valueOf(minEvictableIdle));        }        String softMinEvictableIdle = props.getProperty("redis.pool.softMinEvictableIdle");        if (StringUtils.isNumeric(softMinEvictableIdle)) {            config.setSoftMinEvictableIdleTimeMillis(Long.valueOf(softMinEvictableIdle));        }        return config;    }    /**     *      * 功能描述: <br>     * 获取Jedis实例     */    private Jedis getJedis() {        return pool.getResource();    }}



SerializeUtil类代码

/** * 序列化工具类<br> * 使用JDK自带方式进行序列化和反序列化 */public class SerializeUtil {    /**     *      * 功能描述: <br>     * 序列化 成byte数组     */    public static byte[] serialize(Object object) throws Exception {        ByteArrayOutputStream baos = new ByteArrayOutputStream();        ObjectOutputStream oos = new ObjectOutputStream(baos);        oos.writeObject(object);        return baos.toByteArray();    }    /**     *      * 功能描述: <br>     * 反序列化     */    public static Object unserialize(byte[] byteArray) throws Exception {        ByteArrayInputStream bais = new ByteArrayInputStream(byteArray);        ObjectInputStream ois = new ObjectInputStream(bais);        return ois.readObject();    }}

ibatis缓存的不是一个对象,而是该sql语句

0 0
原创粉丝点击