1、RedisCache.java

  1. package com.houtai.cache;
  2.  
  3. import java.util.concurrent.locks.ReadWriteLock;
  4. import java.util.concurrent.locks.ReentrantReadWriteLock;
  5.  
  6. import org.apache.ibatis.cache.Cache;
  7. import org.apache.ibatis.logging.Log;
  8. import org.apache.ibatis.logging.LogFactory;
  9.  
  10. import redis.clients.jedis.Jedis;
  11. import redis.clients.jedis.JedisPool;
  12. import redis.clients.jedis.JedisPoolConfig;
  13.  
  14. public class RedisCache implements Cache {
  15. private static Log logger = LogFactory.getLog(RedisCache.class);
  16. private Jedis redisClient = createClient();
  17. /** The ReadWriteLock. */
  18. private final ReadWriteLock readWriteLock = new ReentrantReadWriteLock();
  19.  
  20. private String id;
  21.  
  22. public RedisCache(final String id) {
  23. if (id == null) {
  24. throw new IllegalArgumentException("Cache instances require an ID");
  25. }
  26. logger.debug(">>>>>>>>>>>>>>>>>>>>>>>>MybatisRedisCache:id=" + id);
  27. this.id = id;
  28. }
  29.  
  30. public String getId() {
  31. return this.id;
  32. }
  33.  
  34. public int getSize() {
  35. return Integer.valueOf(redisClient.dbSize().toString());
  36. }
  37.  
  38. public void putObject(Object key, Object value) {
  39. logger.debug(">>>>>>>>>>>>>>>>>>>>>>>>putObject:" + key + "=" + value);
  40. redisClient.set(SerializeUtil.serialize(key.toString()), SerializeUtil
  41. .serialize(value));
  42. }
  43.  
  44. public Object getObject(Object key) {
  45. Object value = SerializeUtil.unserialize(redisClient.get(SerializeUtil
  46. .serialize(key.toString())));
  47. logger.debug(">>>>>>>>>>>>>>>>>>>>>>>>getObject:" + key + "=" + value);
  48. return value;
  49. }
  50.  
  51. public Object removeObject(Object key) {
  52. return redisClient.expire(SerializeUtil.serialize(key.toString()), 0);
  53. }
  54.  
  55. public void clear() {
  56. redisClient.flushDB();
  57. }
  58.  
  59. public ReadWriteLock getReadWriteLock() {
  60. return readWriteLock;
  61. }
  62.  
  63. protected static Jedis createClient() {
  64. try {
  65. JedisPool pool = new JedisPool(new JedisPoolConfig(),
  66. "localhost");
  67. return pool.getResource();
  68. } catch (Exception e) {
  69. e.printStackTrace();
  70. }
  71. throw new RuntimeException("初始化连接池错误");
  72. }
  73.  
  74. }

2、序列化与方序列化工具类

  1. package com.houtai.cache;
  2.  
  3. import java.io.ByteArrayInputStream;
  4. import java.io.ByteArrayOutputStream;
  5. import java.io.ObjectInputStream;
  6. import java.io.ObjectOutputStream;
  7.  
  8. /**
  9. *
  10. * @author 作者: wcy
  11. * @version 创建时间:Mar 20, 2015 3:27:39 PM
  12. * @Description: TODO(用于序列化键值对)
  13. */
  14. public class SerializeUtil {
  15.  
  16. public static byte[] serialize(Object object) {
  17. ObjectOutputStream oos = null;
  18. ByteArrayOutputStream baos = null;
  19. try {
  20. // 序列化
  21. baos = new ByteArrayOutputStream();
  22. oos = new ObjectOutputStream(baos);
  23. oos.writeObject(object);
  24. byte[] bytes = baos.toByteArray();
  25. return bytes;
  26. } catch (Exception e) {
  27. e.printStackTrace();
  28. }
  29. return null;
  30. }
  31.  
  32. public static Object unserialize(byte[] bytes) {
  33. if (bytes == null)
  34. return null;
  35. ByteArrayInputStream bais = null;
  36. try {
  37. // 反序列化
  38. bais = new ByteArrayInputStream(bytes);
  39. ObjectInputStream ois = new ObjectInputStream(bais);
  40. return ois.readObject();
  41. } catch (Exception e) {
  42. e.printStackTrace();
  43. }
  44. return null;
  45. }
  46. }

3、自定义缓存的入口,继承MyBatis的loggingCache类

  1. package com.houtai.cache;
  2.  
  3. import org.apache.ibatis.cache.decorators.LoggingCache;
  4.  
  5. public class LoggingRedisCache extends LoggingCache{
  6.  
  7. public LoggingRedisCache(String id) {
  8. super(new RedisCache(id));
  9. // TODO Auto-generated constructor stub
  10. }
  11.  
  12. }

4、同时配置MyBatis的配置文件

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  3. "http://mybatis.org/dtd/mybatis-3-config.dtd">
  4. <configuration>
  5. <settings>
  6. <!-- 这个配置使全局的映射器启用或禁用缓存 -->
  7. <setting name="cacheEnabled" value="true" />
  8. <!-- 对于未知的SQL查询,允许返回不同的结果集以达到通用的效果 -->
  9. <setting name="multipleResultSetsEnabled" value="true" />
  10. <!-- 配置默认的执行器。SIMPLE 执行器没有什么特别之处。REUSE 执行器重用预处理语句。BATCH 执行器重用语句和批量更新 -->
  11. <setting name="defaultExecutorType" value="REUSE" />
  12. <!-- 全局启用或禁用延迟加载。当禁用时,所有关联对象都会即时加载。 -->
  13. <setting name="lazyLoadingEnabled" value="false" />
  14. <setting name="aggressiveLazyLoading" value="true" />
  15. <!-- <setting name="enhancementEnabled" value="true"/> -->
  16. <!-- 设置超时时间,它决定驱动等待一个数据库响应的时间。 -->
  17. <setting name="defaultStatementTimeout" value="25000" />
  18. </settings>
  19. <typeAliases>
  20. <package name="com.houtai.model" />
  21. </typeAliases>
  22.  
  23. <mappers>
  24. <mapper resource="sqlmap/houtai/accountMapper.xml" />
  25. <mapper resource="sqlmap/houtai/categoryMapper.xml" />
  26. <mapper resource="sqlmap/houtai/goodsMapper.xml" />
  27. <mapper resource="sqlmap/houtai/sorderMapper.xml" />
  28. <mapper resource="sqlmap/houtai/forderMapper.xml" />
  29. </mappers>
  30. </configuration>

5、因为使用MyBatis的二级缓存,所以要缓存的类,必须开启<cache/>

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  3. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  4. <mapper namespace="com.houtai.model.Account">
  5. <!-- redis缓存 -->
  6. <cache eviction="LRU" type="com.houtai.cache.LoggingRedisCache"/>
  7. <select id="loginAccount" parameterType="account" resultType="account" useCache="true">
  8. select * from account a where a.login=#{login} and a.pass=#{pass}
  9. </select>
  10. </mapper>

6、最后测试通过。

redis学习总结-redis作为MyBatis的自定义缓存的更多相关文章

  1. Redis学习笔记~Redis主从服务器,读写分离

    回到目录 Redis这个Nosql的存储系统一般会被部署到linux系统中,我们可以把它当成是一个数据服务器,对于并发理大时,我们会使用多台服务器充当Redis服务器,这时,各个Redis之间也是分布 ...

  2. redis学习笔记-redis的安装

    Window 下安装 下载地址:https://github.com/MSOpenTech/redis/releases Redis 支持 32 位和 64 位.这个需要根据你系统平台的实际情况选择, ...

  3. Redis学习-redis概述

    最近刚刚接触了redis技术,对此有一些了解,这是简单做一点总结. Redis简介 首先,简单了解一下NoSQL(Not only sql),不要错误的理解为:没有SQL,而是不仅仅是SQL.NoSQ ...

  4. Redis学习笔记-Redis内部数据结构

    Redis内部数据结构 Redis和其他key-value数据库的很大区别是它支持非字符串类型的value值.它支持的value值的类型如下: sds (simple dynamic string) ...

  5. redis学习之——redis.conf配置(基本)文件学习

    # Redis configuration file example # Note on units: when memory size is needed, it is possible to sp ...

  6. Redis集成到Spring做mybatis做二级缓存

    一.原理: 要缓存的 Java 对象必须实现 Serializable 接口,因为 Spring 会将对象先序列化再存入 Redis,比如本文中的 com.defonds.bdp.city.bean. ...

  7. Redis学习笔记--Redis配置文件Sentinel.conf参数配置详解

    redis-sentinel.conf配置项说明如下: 1.port 26379 sentinel监听端口,默认是26379,可以修改. 2.sentinel monitor <master-n ...

  8. redis学习笔记——Redis过期键的删除策略

    Redis过期键的删除策略 对于过期键一般有三种删除策略 定时删除:在设置键的过期时间的同时,创建一个定时器(timer),让定时器在键的过期时间来临时,立即执行对键的删除操作: 惰性删除:放任键过期 ...

  9. [转载] redis学习入门 Redis 3.2.100

    参考博客: https://blog.csdn.net/flyer_tang/article/details/80320974 https://blog.csdn.net/weixin_3077313 ...

随机推荐

  1. 【信号与线性系统】为什么求解零输入响应时转移算子H(p)不能约分,但计算单位冲激响应时却可以约分?

    为什么求零输入响应rZI时转移算子H(p)不能约分? . . . 我们知道,求零输入响应rZI的实质其实是求解微分方程 D(p)r(t) = N(p)e(t) 的解.由于这里 e(t)=0 ,所以这是 ...

  2. 运用SharedPreferences“偷取”输入的信息

    运用SharedPreferences"偷取"输入的信息 本次的任务是 利用SharedPreferences来完成信息的保存和读取 就是你输入什么 手机就可以把输入的内容&quo ...

  3. 别人的Linux私房菜(21)基础系统设置与备份策略

    网络设置,手动设置IP,DHCP自动获取. 以太网协议开发出来的网卡ethN,N为数字. CentOS7对网卡命名的规则:eno代表由主板BIOS内建立的网卡,ens1由主板BIOS内建的PCI-E界 ...

  4. WPF一组Radio与enum绑定

    工作中用到了一组RadioButton对应一组数据的情况,这个时候最好能将一组RadioButton绑定Enum. 步骤 1.MyControl库中Type.cs中定义Enum namespace M ...

  5. swagger 参数

    http://www.mamicode.com/info-detail-2213514.html

  6. ScrollView无法滚动

    ScrollView视图无法滚动 箭头所指地方应该用dp单位的数值

  7. Win7 VS2017 NASM编译FFMPEG(2018.12.22)

    今天无意中在gayhub发现个牛逼工程,全VS工程编译FFMPEG库,包括依赖库全是VS生成的,无需Mingw等Linux环境. 简单记录下过程,以防将来重装系统等情况,备忘. https://git ...

  8. POJ2947-Widget Factory

    工厂里每件期间的生产时间为3-9天,告诉你有N个器件和M个计划,每个计划都是说明生产1-N号器件的时间,最后问你每件器件的生产时间.或者多解或没有解. 例如样例 2 3 2 MON THU 1 2 3 ...

  9. future项目上报

    private String name;//预警名称 private String detail;//详细 用于定义位置和报错信息,越多越好private String code;//编码 1001是 ...

  10. MATLAB2016a安装破解教程

    首先,下载软件:下面是某博主的分享,可以下载软件. 链接:https://pan.baidu.com/s/1i6BgD8p       密码:17gg  第一步:安装软件 1,下载文件,得到R2016 ...