一:正在开发的项目是电商APP的,因为现在的使用人数还不多,同时在线多的话有个二三十个人,创业之路艰辛啊。
二:业务开发的差不多,下一步就是如何优化了,一般能够想到的优化首先是在DB层级。由于现在数据库规模还小,优化也优化不出什么东西来,但是依据二八法则,最多使用的可以做一个缓存优化。缓存方案就是采用的redis。
三:查看mybatis的代码可以知道我们需要将缓存加入进去,只要实现了cache接口即可
大概从网上参考一下代码复制过来哈哈哈哈。
缓存类
package com.nico.utils.RedisUtil; 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 redis.clients.jedis.Jedis; import redis.clients.jedis.JedisPool; import redis.clients.jedis.JedisPoolConfig; 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 == null) { throw new IllegalArgumentException("Cache instances require an ID"); } logger.debug(">>>>>>>>>>>>>>>>>>>>>>>>MybatisRedisCache:id=" + id); this.id = id; } @Override public String getId() { return this.id; } @Override public int getSize() { return Integer.valueOf(redisClient.dbSize().toString()); } @Override public void putObject(Object key, Object value) { logger.debug(">>>>>>>>>>>>>>>>>>>>>>>>putObject:" + key + "=" + value); redisClient.set(SerializeUtil.serialize(key.toString()), SerializeUtil.serialize(value)); } @Override public Object getObject(Object key) { Object value = SerializeUtil.unserialize(redisClient.get(SerializeUtil.serialize(key.toString()))); logger.debug(">>>>>>>>>>>>>>>>>>>>>>>>getObject:" + key + "=" + value); return value; } @Override public Object removeObject(Object key) { return redisClient.expire(SerializeUtil.serialize(key.toString()), 0); } @Override public void clear() { redisClient.flushDB(); } @Override public ReadWriteLock getReadWriteLock() { return readWriteLock; } protected static Jedis createReids() { JedisPool pool = new JedisPool(new JedisPoolConfig(), "139.129.9.107"); return pool.getResource(); } }
序列化类
package com.nico.utils.RedisUtil; 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 = null; ByteArrayOutputStream baos = null; try { //序列化 baos = new ByteArrayOutputStream(); oos = new ObjectOutputStream(baos); oos.writeObject(object); byte[] bytes = baos.toByteArray(); return bytes; } catch (Exception e) { e.printStackTrace(); } return null; } public static Object unserialize(byte[] bytes) { ByteArrayInputStream bais = null; try { //反序列化 bais = new ByteArrayInputStream(bytes); ObjectInputStream ois = new ObjectInputStream(bais); return ois.readObject(); } catch (Exception e) { } return null; } }
然后我们开始在配置文件中加入
mybatis.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"/> settings> <typeAliases> <typeAlias alias="Account" type="com.nico.entities.Account"/> <typeAlias alias="PagerEx" type="com.nico.entities.PagerEx"/> <typeAlias alias="PageEx" type="com.nico.entities.PageEx"/> <typeAlias alias="PubSource" type="com.nico.entities.PubSource"/> <typeAlias alias="Usershaidan" type="com.nico.entities.Usershaidan"/> <typeAlias alias="Nextperiod" type="com.nico.entities.Nextperiod"/> typeAliases> configuration>
在需要缓存的mapper文件中加入配置
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="com.nico.dao.AccountMapper"> <cache eviction="LRU" type="com.nico.utils.RedisUtil.MybatisRedisCache" /> <mapper>
这样来实现缓存,那么我们现在来测试下效果到底如何呢
四:测试
@Test public void testRedis(){ String url="http://localhost:8090/accounts/list_wish_user?u=87"; Date start=new Date(); String s = UtilSelf.sendGet(url); Date end=new Date(); logger.info(end.getTime()-start.getTime()); }
写出我们的测试方法
这个时间是整个请求的时间加起来,我们去具体的数据库访问层再去计算时间
Date start=new Date(); wishUserList = accountMapper.getWishUserT(reqMap); Date end=new Date(); System.out.println("数据层消耗的时间:"+ end.getTime()-start.getTime());
加入缓存消耗的时间:
DEBUG - Returning cached instance of singleton bean 'accountService'
DEBUG - Returning cached instance of singleton bean 'accountMapper'
五月 06, 2016 3:53:28 下午 org.glassfish.jersey.filter.LoggingFilter log
数据库消耗的时间:16
发现并没有连接数据库
DEBUG - Returning cached instance of singleton bean 'accountService'
DEBUG - Returning cached instance of singleton bean 'accountMapper'
数据库消耗的时间:18
现在我们把缓存去掉,然后来计算时间:
DEBUG - Fetching JDBC Connection from DataSource
DEBUG - Returning JDBC Connection to DataSource
数据库消耗的时间:74
发现有DB连接,
第二次
DEBUG - Returning JDBC Connection to DataSource
数据库消耗的时间:18
只用数据库连接时间也是很少了,mysql默认也是有缓存的啊
现在只测试还是没啥差别的,哈哈哈。
今天暂时先到这一段,改天在了解其中的个别原理等。