mybatis结合redis实战二级缓存(六)

一:自定义mybatis缓存

我们知道任何mybatis二级缓存都需要实现一个接口,这个接口就是org.apache.ibatis.cache.Cache,代码如下:

package com.demo.spring.mybatis.cache;
import java.util.concurrent.locks.ReadWriteLock;import java.util.concurrent.locks.ReentrantReadWriteLock;import org.apache.ibatis.cache.Cache;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import com.demo.spring.mybatis.util.SerializeUtil;import redis.clients.jedis.Jedis;import redis.clients.jedis.JedisPool;public class MybatisRedisCache implements Cache {private static Logger logger = LoggerFactory.getLogger(MybatisRedisCache.class);private Jedis redisClient = createReids;private final ReadWriteLock readWriteLock = new ReentrantReadWriteLock;private String id;public MybatisRedisCache(final String id) {if (id == ) {throw new IllegalArgumentException("Cache instances require an ID");}logger.debug(">>>>>>>>>>>>>>>>>>>>>>>>MybatisRedisCache:id=" + id);this.id = id;}@Overridepublic String getId {return this.id;}@Overridepublic int getSize {return Integer.valueOf(redisClient.dbSize.toString);}@Overridepublic void putObject(Object key, Object value) {logger.debug(">>>>>>>>>>>>>>>>>>>>>>>>putObject:" + key + "=" + value);redisClient.set(SerializeUtil.serialize(key.toString), SerializeUtil.serialize(value));}@Overridepublic Object getObject(Object key) {Object value = SerializeUtil.unserialize(redisClient.get(SerializeUtil.serialize(key.toString)));logger.debug(">>>>>>>>>>>>>>>>>>>>>>>>getObject:" + key + "=" + value);return value;}@Overridepublic Object removeObject(Object key) {return redisClient.expire(SerializeUtil.serialize(key.toString), 0);}@Overridepublic void clear {redisClient.flushDB;}@Overridepublic ReadWriteLock getReadWriteLock {return readWriteLock;}protected static Jedis createReids {JedisPool pool = new JedisPool("127.0.0.1", 6379);
return pool.getResource;}}

以上代码很简单就是基本的Cache实现,在定义一个序列化的工具类

 package com.demo.spring.mybatis.util;
import java.io.ByteArrayInputStream;import java.io.ByteArrayOutputStream;import java.io.ObjectInputStream;import java.io.ObjectOutputStream;public class SerializeUtil {public static byte serialize(Object object) {ObjectOutputStream oos = ;ByteArrayOutputStream baos = ;try {// 序列化baos = new ByteArrayOutputStream;oos = new ObjectOutputStream(baos);oos.writeObject(object);byte bytes = baos.toByteArray;return bytes;} catch (Exception e) {e.printStackTrace;}return ;}public static Object unserialize(byte[] bytes) {ByteArrayInputStream bais = ;try {// 反序列化bais = new ByteArrayInputStream(bytes);ObjectInputStream ois = new ObjectInputStream(bais);return ois.readObject;} catch (Exception e) {}return ;}}

然后在mapper.xml配置

<cache eviction="LRU" type="com.demo.spring.mybatis.cache.MybatisRedisCache"/>

当然在主配置文件里面还需要配置如下代码,代表开启二级缓存,默认是不开启的

<setting name="cacheEnabled" value="true" />

所以得配置和代码都已经完成了运行结果如下:

mybatis结合redis实战二级缓存(六)

为什么第二次走的是一级缓存呢?

这个在讲二级缓存源码的时候分析过,只有当执行commit的时候才把之前查询的结果放入缓存。

打开吗redis查看如下,因为存入的是序列化的结果,不过我们隐约还是能看到一些信息到下图

mybatis结合redis实战二级缓存(六)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值