数据层缓存优化

一:正在开发的项目是电商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默认也是有缓存的啊

 

现在只测试还是没啥差别的,哈哈哈。

 

今天暂时先到这一段,改天在了解其中的个别原理等。

转载于:https://www.cnblogs.com/wuwulalala/p/5465983.html

你可能感兴趣的:(数据层缓存优化)