您的位置:首页 > 其它

学习淘淘商城第六十六课(商品详情缓存的实现)

2017-05-15 00:05 399 查看
上节课我们一起分析了下商品详情缓存策略,这节课我们一起实现商品详情缓存的添加。

首先,我们要想清楚缓存应该加到哪个工程当中,现在我们有两个工程可以选择,第一个工程是taotao-item-web(商品详情工程),如果把缓存加到这个工程的话,由于该工程是个web工程,不被其它工程所共用,那么这块缓存的功能只能被它自己使用。第二个工程是taotao-manager(商品工程),由于多个工程都依赖taotao-manager,因此缓存的功能可以被多个工程所共用。显然,我们应该选择第二个工程来添加缓存。

要使用Redis缓存技术,就要先添加Redis的依赖,如下图所示。



依赖代码如下:

<!-- Redis客户端 -->
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
</dependency>


添加完依赖之后,需要添加对Redis操作的接口及实现类,由于我们在taotao-content工程已经实现过了,因此我们只需要把taotao-content-interface工程中关于jedis接口的包及接口类拷贝过来,然后把taotao-content-service工程中jedis的包及实现类拷贝过来,如下图所示。



下面还需要把taotao-conent-service工程中关于jedis的配置文件给复制过来,如下图所示。



我们打开applicationContext-jedis.xml文件,如下图所示,可以看到有单机版和集群版两种配置,现在我用的是单机版redis,因此我们打开的是单机版的redis配置。



在上节课中我们制定了通过添加redis缓存前缀来区分key的策略,而这个key我们是不能写死到代码当中的,应该配置到配置文件当中,还有就是商品的过期时间,这个也应该是可配置的,因此我们需要在taotao-manager-service工程添加一个配置文件resource.properties,如下图所示。不过需要提醒的是,刚建的配置文件默认编码是iso8859-1,是不能写中文注释的,因此为了能够写中文注释,我们把该文件的编码改成UTF-8。



配置文件中的内容如下:

#商品数据在redis中缓存的前缀
ITEM_INFO=ITEM_INFO
#商品缓存的过期时间,默认设置成一天,可以根据实际情况修改
ITEM_EXPIRE=86400


添加了配置文件,要让Spring容器能够扫描到,因此我们打开applicationContext-dao.xml文件,把关于加载配置文件的配置由原来的db.properties修改为*.properties,这样properties目录下的所有配置文件都可以被扫描到了。



下面我们真正开始写缓存代码,在ItemServiceImpl类中的获取商品基本信息方法(getItemById)和获取商品描述信息方法(getItemDescById)中添加缓存代码,添加完缓存后,ItemServiceImplement类的所有代码如下:

package com.taotao.service.impl;

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

import javax.annotation.Resource;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.Session;
import javax.jms.TextMessage;

import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.jms.core.JmsTemplate;
import org.springframework.jms.core.MessageCreator;
import org.springframework.stereotype.Service;

import com.alibaba.fastjson.JSON;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.taotao.common.pojo.EasyUIDataGridResult;
import com.taotao.common.pojo.TaotaoResult;
import com.taotao.common.utils.IDUtils;
import com.taotao.jedis.service.JedisClient;
import com.taotao.mapper.TbItemDescMapper;
import com.taotao.mapper.TbItemMapper;
import com.taotao.pojo.TbItem;
import com.taotao.pojo.TbItemDesc;
import com.taotao.pojo.TbItemExample;
import com.taotao.service.ItemService;

@Service
public class ItemServiceImpl implements ItemService {

@Autowired
private TbItemMapper itemMapper;
@Autowired
private TbItemDescMapper itemDescMapper;
@Autowired
private JedisClient jedisClient;
@Value("${ITEM_INFO}")
private String ITEM_INFO;
@Value("${ITEM_EXPIRE}")
private Integer ITEM_EXPIRE;

@Autowired
private JmsTemplate jmsTemplate;
@Resource(name="itemAddTopic")
private Destination destination;

@Override
public TbItem getItemById(long itemId) {
//查询数据库之前先查询缓存
try {
String json = jedisClient.get(ITEM_INFO+":"+itemId+":BASE");
if(!StringUtils.isBlank(json)){
//把json转换成对象
return JSON.parseObject(json, TbItem.class);
}
} catch (Exception e) {
e.printStackTrace();
}
TbItem tbItem = itemMapper.selectByPrimaryKey(itemId);
//把查询结果添加到缓存
try {
//把查询结果添加到缓存
jedisClient.set(ITEM_INFO+":"+itemId+":BASE", JSON.toJSONString(tbItem));
//设置过期时间,提高缓存的利用率
jedisClient.expire(ITEM_INFO+":"+itemId+":BASE", ITEM_EXPIRE);
} catch (Exception e) {
e.printStackTrace();
}
return tbItem;
}

@Override
public TbItemDesc getItemDescById(long itemId) {
//查询数据库之前先查询缓存
try {
String json = jedisClient.get(ITEM_INFO+":"+itemId+":DESC");
if(!StringUtils.isBlank(json)){
//把json转换成对象
return JSON.parseObject(json, TbItemDesc.class);
}
} catch (Exception e) {
e.printStackTrace();
}
TbItemDesc tbItemDesc = itemDescMapper.selectByPrimaryKey(itemId);
//把查询结果添加到缓存
try {
//把查询结果添加到缓存
jedisClient.set(ITEM_INFO+":"+itemId+":DESC", JSON.toJSONString(tbItemDesc));
//设置过期时间,提高缓存的利用率
jedisClient.expire(ITEM_INFO+":"+itemId+":DESC", ITEM_EXPIRE);
} catch (Exception e) {
e.printStackTrace();
}
return tbItemDesc;
}

@Override
public EasyUIDataGridResult getItemList(int page, int rows) {
//设置分页信息
PageHelper.startPage(page, rows);
//执行查询
TbItemExample example = new TbItemExample();
List<TbItem>  list = itemMapper.selectByExample(example);
//获取查询结果
PageInfo<TbItem> pageInfo = new PageInfo<>(list);
EasyUIDataGridResult result = new EasyUIDataGridResult();
result.setRows(list);
result.setTotal(pageInfo.getTotal());
//返回结果
return result;
}

@Override
public TaotaoResult createItem(TbItem tbItem, String desc) throws Exception{
//生成商品ID
long itemId = IDUtils.genItemId();
//补全item的属性
tbItem.setId(itemId);
//商品状态,1-正常,2-下架,3-删除
tbItem.setStatus(((byte) 1));
tbItem.setCreated(new Date());
tbItem.setUpdated(new Date());
itemMapper.insert(tbItem);
//添加商品描述
insertItemDesc(itemId, desc);
//发送activemq消息
jmsTemplate.send(destination,new MessageCreator() {

@Override
public Message createMessage(Session session) throws JMSException {
TextMessage textMessage = session.createTextMessage(itemId+"");
return textMessage;
}
});
return TaotaoResult.ok();
}

//添加商品描述
private void insertItemDesc(long itemId,String desc){
//创建一个商品描述表对应的pojo
TbItemDesc itemDesc = new TbItemDesc();
//补全pojo的属性
itemDesc.setItemId(itemId);
itemDesc.setItemDesc(desc);
itemDesc.setCreated(new Date());
itemDesc.setUpdated(new Date());
//向商品描述表插入数据
itemDescMapper.insert(itemDesc);
}

}


其中新注入的内容如下图蓝色标注所示。



代码写好了,下面我们便要进行测试,由于我们修改了taotao-manager工程,最好我们重新打包taotao-manager工程到本地Maven仓库,然后我们重启taotao-manager工程,重启后,我们再来访问商品详情页面,第一次访问是查询数据库,然后我们再刷新页面,第二次访问就是查询的缓存了。缓存中存储的信息如下图所示。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: