`

未完成的redis集成

阅读更多


springmvc + mybatis +redis  没有调研完成的 缓存引入,
查找了各种资料,包括【Iteye上的大神:http://liuyieyer.iteye.com/blog/2081382
【github上的大神:https://github.com/mybatis/redis-cache

package xx.redis;

import java.io.IOException;
import java.io.InputStream;
import java.util.Map;
import java.util.Properties;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;

import org.apache.ibatis.cache.Cache;

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
import redis.clients.jedis.exceptions.JedisConnectionException;

public final class RedisCache implements Cache {

 private final ReadWriteLock readWriteLock = new ReentrantReadWriteLock();

 private String id;

 public RedisCache(final String id) {
  if (id == null) {
   throw new IllegalArgumentException("Cache instances require an ID");
  }
  this.id = id;
 }

 private Object execute(RedisCallback callback) {
  Jedis jedis = CachePool.getInstance().getJedis();
  try {
   return callback.doWithRedis(jedis);
  } finally {
   // jedis.close();
   jedis.quit();
  }
 }

 public String getId() {
  return this.id;
 }

 public int getSize() {
  return (Integer) execute(new RedisCallback() {
   public Object doWithRedis(Jedis jedis) {
    Map<byte[], byte[]> result = jedis.hgetAll(id.toString().getBytes());
    return result.size();
   }
  });
 }

 public void putObject(final Object key, final Object value) {
  execute(new RedisCallback() {
   public Object doWithRedis(Jedis jedis) {
    jedis.hset(id.toString().getBytes(), key.toString().getBytes(), SerializeUtil.serialize(value));
    return null;
   }
  });
 }

 public Object getObject(final Object key) {
  return execute(new RedisCallback() {
   public Object doWithRedis(Jedis jedis) {
    Object val = SerializeUtil.unserialize(jedis.hget(id.toString().getBytes(), key.toString().getBytes()));
    System.out.println("get from redis:id=" + key + ",val=" + val);
    return val;
   }
  });
 }

 public Object removeObject(final Object key) {
  return execute(new RedisCallback() {
   public Object doWithRedis(Jedis jedis) {
    return jedis.hdel(id.toString(), key.toString());
   }
  });
 }

 public void clear() {
  execute(new RedisCallback() {
   public Object doWithRedis(Jedis jedis) {
    jedis.del(id.toString());
    return null;
   }
  });

 }

 public ReadWriteLock getReadWriteLock() {
  return readWriteLock;
 }

 @Override
 public String toString() {
  return "Redis {" + id + "}";
 }

 /**
  *
  * @ClassName: CachePool
  * @Description: TODO(单例Cache池)
  * @author LiuYi
  */
 public static class CachePool {
  JedisPool pool;
  private static final CachePool cachePool = new CachePool();

  public static CachePool getInstance() {
   return cachePool;
  }

  private CachePool() {
   JedisPoolConfig config = new JedisPoolConfig();
   Properties p = new Properties();
   InputStream f = CachePool.class.getClassLoader().getResourceAsStream("redis.properties");
   try {
    p.load(f);
   } catch (IOException e) {
    e.printStackTrace();
   }
   config.setMaxIdle(Integer.valueOf(p.getProperty("redis.maxIdle")));
   config.setMaxWait(Integer.valueOf(p.getProperty("redis.maxWait")));
   pool = new JedisPool(config, p.getProperty("redis.host"));
  }

  public Jedis getJedis() {
   Jedis jedis = null;
   boolean borrowOrOprSuccess = true;
   try {
    jedis = pool.getResource();
   } catch (JedisConnectionException e) {
    borrowOrOprSuccess = false;
    if (jedis != null)
     pool.returnBrokenResource(jedis);
   } finally {
    if (borrowOrOprSuccess)
     pool.returnResource(jedis);
   }
   jedis = pool.getResource();
   return jedis;
  }

  public JedisPool getJedisPool() {
   return this.pool;
  }

 }
}

================================================

package xx.redis;
import redis.clients.jedis.Jedis;

public interface RedisCallback {

 Object doWithRedis(Jedis jedis);
}

================================================

package xx.redis;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;

import org.apache.ibatis.cache.CacheException;

public final class SerializeUtil {

 public static byte[] serialize(Object object) {
  ObjectOutputStream oos = null;
  ByteArrayOutputStream baos = null;
  try {
   baos = new ByteArrayOutputStream();
   oos = new ObjectOutputStream(baos);
   oos.writeObject(object);
   byte[] bytes = baos.toByteArray();
   return bytes;
  } catch (Exception e) {
   throw new CacheException(e);
  }
 }

 public static Object unserialize(byte[] bytes) {
  if (bytes == null) {
   return null;
  }
  ByteArrayInputStream bais = null;
  try {
   bais = new ByteArrayInputStream(bytes);
   ObjectInputStream ois = new ObjectInputStream(bais);
   return ois.readObject();
  } catch (Exception e) {
   throw new CacheException(e);
  }
 }

}

================================================
redis.properties 文件:

#redis configuration
redis.host=172.16.180.75
redis.port=6379
redis.pass=
redis.default.db=0
redis.timeout=100000
redis.maxActive=300
redis.maxIdle=100
redis.maxWait=1000
DBSync.testOnBorrow=true

====================================================
mybatis-config.xml 文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
 <settings>
  <setting name="cacheEnabled" value="true" />
<!--   <setting name="lazyLoadingEnabled" value="true" /> -->
<!--   <setting name="multipleResultSetsEnabled" value="true" /> -->
<!--   <setting name="useColumnLabel" value="true" /> -->
<!--   <setting name="useGeneratedKeys" value="false" /> -->
<!--   <setting name="enhancementEnabled" value="false" /> -->
<!--   <setting name="defaultExecutorType" value="SIMPLE" /> -->
 </settings>
</configuration>

 

spring-mybatis文件
<!-- mybatis文件配置,扫描所有mapper文件 -->
 <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
  <property name="mapperLocations">
   <array>
    <value>classpath:conf-mybatis/ext/*Mapper.xml</value>
    <value>classpath:conf-mybatis/*Mapper.xml</value>
   </array>
  </property>
  <property name="configLocation" value="classpath:conf-mybatis/mybatis-config.xml" />
  <property name="dataSource" ref="dataSource" />
  <property name="plugins">
   <ref bean="pageHelper" />
  </property>
 </bean>
=============================================================

 

 

 

 


 

分享到:
评论

相关推荐

    Thinkphp6 redis队列 消息事件 gatewayworker聊天打通版

    Thinkphp6 redis队列 消息事件 gatewayworker聊天打通版

    JAVA用户、角色、权限、菜单、工作流管理系统

    目前系统已经基本集成的功能包含有,用户管理,角色管理,菜单管理,组织管理,数据字典,日志管理,接口管理(暂时未完成实际应用),流程配置,运行流程管理,消息管理(暂无实际应用),业务模块没有做。后台是基于...

    基于B/S架构的课程在线学习与测试系统

    基于B/S架构的课程在线学习与测试系统 项目为maven管理,最近集成了redis,所以在运行项目是先要下载redis并启动客户端,方可正常运行项目,由于只需要下载redis...拦截器实现统一登录和权限校验(相关重构还未完成)。

    知识库系统(牛客论坛改进版)

    草稿箱系统: 允许用户存储未完成的帖子,增强了用户体验和操作的灵活性。 敏感词过滤机制: 使用前缀树作为过滤算法,用于过滤帖子中的敏感词,保证论坛内容的合法性和健康性。 用户功能: 注册:允许用户注册论坛...

    服务器全能环境UPUPW ANK 64位版.zip

    05、优化删除虚拟主机状态按钮,由“完成”改成“确定”便于理解。  06、优化Apache错误日志,由warn改成crit以减少日志文件大小。  07、优化Apache证书端口监听配置防止http和https混淆。  ...

    ThinkPHP3.2仿京东商城视频教程实战课程,ThinkPHP3.2开发大型商城项目实战视频

    7.QQ登录集成完成 第十二天 1.后台分类筛选属性的添加 2.后台分类筛选属性修改完成 3.搜索页面中获取搜索的分类下的筛选属性 4.搜索页面价格与属性的获取完成 5.获取商品销量和评论数并根据价格和分类搜索商品 6....

    Distributed-Development-Handset

    1.admin未加集群监控 3.jekens 4.Docker打包项目 5.Nepxion Discovery集成 6.pom.xml文件包需要整理到父类 已完成 1.基础的mybatis,统一异常处理机制(ok) 2.jedis + redis (ok) 3. rabbit通信(ok) 4.zuul路由过于...

    一,性能方案设计.pdf

    发压⼯具准备 Jmeter⼯具介绍 集成包,解压即可使⽤,windows,linux通⽤(依赖java环境) jmx脚本未xml⽂件,win,linux环境均可直接运⾏ 多线程并发 运⾏完脚本会⽣成jtl⽇志,可在win环境界⾯⼯具中查看,统计 2...

    php开源框架 CmlPHP.zip

    支持composer、分布式数据库、分布式缓存,支持文件、memcache、redis、apc等缓存,支持多种url模式、URL路由[RESTful],支持多项目集成、第三方扩展、支持插件。 CmlPHP V2.x 在底层数据库查询模块做了缓存集成...

    java开源包1

    WebSocket4J 并未实现客户端通讯协议,所以不能用它来连接 WebSocket 服务器。 Struts验证码插件 JCaptcha4Struts2 JCaptcha4Struts2 是一个 Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 ...

    java开源包11

    WebSocket4J 并未实现客户端通讯协议,所以不能用它来连接 WebSocket 服务器。 Struts验证码插件 JCaptcha4Struts2 JCaptcha4Struts2 是一个 Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 ...

    java开源包2

    WebSocket4J 并未实现客户端通讯协议,所以不能用它来连接 WebSocket 服务器。 Struts验证码插件 JCaptcha4Struts2 JCaptcha4Struts2 是一个 Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 ...

    java开源包3

    WebSocket4J 并未实现客户端通讯协议,所以不能用它来连接 WebSocket 服务器。 Struts验证码插件 JCaptcha4Struts2 JCaptcha4Struts2 是一个 Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 ...

    java开源包6

    WebSocket4J 并未实现客户端通讯协议,所以不能用它来连接 WebSocket 服务器。 Struts验证码插件 JCaptcha4Struts2 JCaptcha4Struts2 是一个 Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 ...

    java开源包5

    WebSocket4J 并未实现客户端通讯协议,所以不能用它来连接 WebSocket 服务器。 Struts验证码插件 JCaptcha4Struts2 JCaptcha4Struts2 是一个 Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 ...

    java开源包10

    WebSocket4J 并未实现客户端通讯协议,所以不能用它来连接 WebSocket 服务器。 Struts验证码插件 JCaptcha4Struts2 JCaptcha4Struts2 是一个 Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 ...

    java开源包4

    WebSocket4J 并未实现客户端通讯协议,所以不能用它来连接 WebSocket 服务器。 Struts验证码插件 JCaptcha4Struts2 JCaptcha4Struts2 是一个 Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 ...

    java开源包8

    WebSocket4J 并未实现客户端通讯协议,所以不能用它来连接 WebSocket 服务器。 Struts验证码插件 JCaptcha4Struts2 JCaptcha4Struts2 是一个 Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 ...

    java开源包7

    WebSocket4J 并未实现客户端通讯协议,所以不能用它来连接 WebSocket 服务器。 Struts验证码插件 JCaptcha4Struts2 JCaptcha4Struts2 是一个 Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 ...

    java开源包9

    WebSocket4J 并未实现客户端通讯协议,所以不能用它来连接 WebSocket 服务器。 Struts验证码插件 JCaptcha4Struts2 JCaptcha4Struts2 是一个 Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 ...

Global site tag (gtag.js) - Google Analytics