主要使用的功能:
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存储显示的列表,代替频繁的数据库查询操作,以提高性能。