安装
在centos 7 版本上 输入yum install redis
下载安装
安装完以后,需要将/etc/ 下的 redis.conf
打开
将bind 127.0.0.1 改为 0.0.0.0 方便外网访问(当然也可以设置指定ip访问)
优化统计模块
关联网址:
《SoloBug - bug管理系统》-Echarts+Ajax实现图表数据异步加载
2017年中国大学生计算机设计大赛参赛作品《SoloBug - bug管理系统》
将此次的读操作加入缓存优化,在每次读时,如果未设置查询条件,直接从redis中读取(在redis中存在对应数据时,如果redis中未存在,则从mysql中查取,并将结果传入redis中)
Service层代码:
public class StatisticsServiceimp implements StatisticsService {
@Autowired
private Statistics Statistics;
@Autowired
private RedisDaoByProtostuff redisDaoByProtostuff;
@Override
public StaUtil queryStatistics(String id, String date, String date1) {
if (("".equals(date) || date == null)&& ("".equals(date1) || date1 == null)) {
StaUtil staUtil = redisDaoByProtostuff.getStaUtil(id,"queryStatistics");
if (staUtil == null) {
staUtil = Statistics.queryStatistics(id, date, date1);
redisDaoByProtostuff.putStaUtil(id, "queryStatistics", staUtil);
}
return staUtil;
}
return Statistics.queryStatistics(id, date, date1);
}
.....
}
RedisDaoByProtostuff 类代码
package bug.frontstage.statistics.dao;
import org.springframework.stereotype.Repository;
import com.dyuproject.protostuff.LinkedBuffer;
import com.dyuproject.protostuff.ProtostuffIOUtil;
import com.dyuproject.protostuff.runtime.RuntimeSchema;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import bug.frontstage.statistics.dto.StaUtil;
@Repository
public class RedisDaoByProtostuff {
private JedisPool jedisPool = new JedisPool("XXX",6379);//xxx代表对应ip
private RuntimeSchema<StaUtil> schema = RuntimeSchema.createFrom(StaUtil.class);
public StaUtil getStaUtil(String id, String type) {
try {
Jedis jedis = jedisPool.getResource();
try {
String keyString = type + id;
byte[] bytes = jedis.get(keyString.getBytes());
if (bytes != null) {
StaUtil staUtil = schema.newMessage();
ProtostuffIOUtil.mergeFrom(bytes, staUtil, schema);
return staUtil;
}
} finally {
jedis.close();
}
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
public void putStaUtil(String id, String type, StaUtil staUtil) {
try {
Jedis jedis =jedisPool.getResource();
try {
String keyString=type+id;
byte[] bytes =ProtostuffIOUtil.toByteArray(staUtil, schema,LinkedBuffer.allocate(LinkedBuffer.DEFAULT_BUFFER_SIZE));
//缓存5分钟
jedis.setex(keyString.getBytes(), 5*60, bytes);
} finally {
jedis.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
此段代码参照:慕课网-Java高并发秒杀API之高并发优化
这里我看见很多慕课网视频下的朋友提问说,按照老师的要求的jar下载后,代码仍然报错
是因为:缺少依赖的jar包
下载地址:http://download.csdn.net/download/yangdongchuan1995/10133781
再介绍一种不需要下载jar包的方式,使用java自带的序列化
package bug.frontstage.statistics.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 = 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;
}
}
对应的redisDao代码:
package bug.frontstage.statistics.dao;
import org.springframework.stereotype.Repository;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import bug.frontstage.statistics.dto.StaUtil;
import bug.frontstage.statistics.util.SerializeUtil;
@Repository
public class RedisDao {
private JedisPool jedisPool=new JedisPool("XXX",6379);
public StaUtil getStaUtil(String id,String type){
try {
Jedis jedis = jedisPool.getResource();
try {
String key = type + id;
byte[] bytes = jedis.get(key.getBytes());
if (bytes != null) {
StaUtil staUtil=(StaUtil) SerializeUtil.unserialize(bytes);
return staUtil;
}
} finally {
jedis.close();
}
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
public void putStaUtil(String id,String type,StaUtil staUtil){
Jedis jedis = jedisPool.getResource();
try {
String key = type + id;
// jedis.set(key.getBytes(), SerializeUtil.serialize(staUtil));
jedis.setex(key.getBytes(),5*60 , SerializeUtil.serialize(staUtil));
} catch (Exception e) {
e.printStackTrace();
} finally {
jedis.close();
}
}
}
public class StaUtil implements Serializable{
........
}
这里使用的是只缓存5分钟,也未进行如何确保 mysql数据库与redis之间同步性的问题
记录一下,等最近这段项目忙完以后,再来继续优化