【redis-demo】使用Jedis api 实现后端缓存优化

本文介绍了在CentOS 7上安装Redis并开启服务,然后在服务层通过Jedis实现缓存优化,详细展示了Service层和RedisDaoByProtostuff类的代码实现。在遇到依赖问题时,提供了下载jar包的解决方案,同时也提到了使用Java自带序列化的替代方式。目前缓存时间为5分钟,但未解决MySQL与Redis数据同步问题,后续会继续优化。
摘要由CSDN通过智能技术生成

安装
在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之间同步性的问题

记录一下,等最近这段项目忙完以后,再来继续优化

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值