学习yijun zhang 老师的商品秒杀项目所得(1)——使用Redis做缓存优化的简单实现

主要使用的功能
1.基于java的redis工具——Jedis
2.JDK本身提供的序列化方式——实现Serializable
3.实现序列化要用到的IO流——ByteArrayInputStream,ByteArrayOutputStream,ObjectInputStream,ObjectOutputStream
实现:
1.JavaBean——Seckill.java

import java.io.Serializable;
import java.util.Date;
//秒杀商品的实体类
public class Seckill implements Serializable{
	/**
	 * serilVersionUID  表示该序列化的版本,反序列化的时候,JVM会将传过来的字节流中的serilVersionUID和对应实体类中的进行比较,如果相同,则成功,不同,则失败
	 */
	private static final long serialVersionUID = 1L;
	
	private long seckillId;
	private String name;
	private int number;
	private Date startTime;
	private Date endTime;
	private Date createTime;
	public long getSeckillId() {
		return seckillId;
	}
	public void setSeckillId(long seckillId) {
		this.seckillId = seckillId;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getNumber() {
		return number;
	}
	public void setNumber(int number) {
		this.number = number;
	}
	public Date getStartTime() {
		return startTime;
	}
	public void setStartTime(Date startTime) {
		this.startTime = startTime;
	}
	public Date getEndTime() {
		return endTime;
	}
	public void setEndTime(Date endTime) {
		this.endTime = endTime;
	}
	public Date getCreateTime() {
		return createTime;
	}
	public void setCreateTime(Date createTime) {
		this.createTime = createTime;
	}
	@Override
	public String toString() {
		return "Seckill [seckillId=" + seckillId + ", name=" + name + ", number=" + number + ", startTime=" + startTime
				+ ", endTime=" + endTime + ", createTime=" + createTime + "]";
	}
	
}

2.使用Redis——RedisCache.java

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;

import com.seckill.entity.Seckill;

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;

/**
 * 包含存取两个方法,以二进制的形式将对象进行存取
 * @author Administrator
 *
 */
public class RedisCache {
	private JedisPool jedisPool;
	//初始化jedispool对象
	public  RedisCache(String ip, int port) {
		jedisPool = new JedisPool(ip, port);
	}
	//通过id来获取缓存的seckill对象
	public Seckill getSeckill(Long id) {
	//通过JedisPool提供的getResoure()方法来获取jedis实例
		Jedis jedis = jedisPool.getResource();
		
		//给定key来查找value并进行反序列化
		try {
			String key = "seckill" + id;
			//反序列化的关键代码
			byte[] bytes = jedis.get(key.getBytes());
			if(bytes != null) {
				ByteArrayInputStream bis = new ByteArrayInputStream(bytes);
				ObjectInputStream os = new ObjectInputStream(bis);
				Seckill seckill = (Seckill)os.readObject();
				return seckill;
			}
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		return null;
	}
	
	//通过序列化来将传入的对象保存在redis中
	//使用了ByteArrayOutputStream 和ObjectOutputStream,前者作用是获取对象序列化后的二进制数组
	public String putSeckill(Seckill seckill) {
		try {
			ByteArrayOutputStream bos = new ByteArrayOutputStream();
			ObjectOutputStream oos = new ObjectOutputStream(bos);
			oos.writeObject(seckill);
			byte[] bytes = bos.toByteArray();
			if(bytes != null) {
				Jedis jedis = jedisPool.getResource();
				String i = jedis.set(("seckill"+seckill.getSeckillId()).getBytes(), bytes);
				return i;
			}
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return null;
	}
}

3.Test类——SeckillDaoTest.java

import java.util.Date;
import java.util.List;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import com.seckill.dao.cache.RedisCache;
import com.seckill.entity.Seckill;

@RunWith(SpringJUnit4ClassRunner.class)

@ContextConfiguration({"classpath:spring/spring-dao.xml"})
public class SeckillDaoTest {
	
	//对SeckillDao进行注入
	@Autowired
	private SeckillDao seckillDao;
	
	@Autowired
	private RedisCache redisDao;
	
	@Test
	public void testGetSeckillByRedis() {
		Long seckillId = 1001L;
		//从redis中获取该对象,如果没有就从数据库中获取并且存入redis
		Seckill seckill = redisDao.getSeckill(seckillId);
		//如果缓存中没有就从数据库中获取
		if(seckill == null) {
			seckill = seckillDao.queryById(seckillId);
		}
		redisDao.putSeckill(seckill);
		Seckill seckill1 = redisDao.getSeckill(seckillId);
		System.out.println(seckill1);
	}
	}

4.spring-dao.xml

        <!-- redisDao的bean配置 -->
        <bean id="reidsDao" class="com.seckill.dao.cache.RedisCache">
        	<constructor-arg index="0" value="localhost"/>
        	<constructor-arg index="1" value="6379"/>
        </bean>

这部分代码使用了redis存储显示的列表,代替频繁的数据库查询操作,以提高性能。

第一次写,只当是个人总结。如有错误,请各位尽快指正。

猜你喜欢

转载自blog.csdn.net/weixin_42424720/article/details/82889623