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

       上节课我们一起分析了下商品详情缓存策略,这节课我们一起实现商品详情缓存的添加。

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

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

学习淘淘商城第六十六课(商品详情缓存的实现)_第1张图片

         依赖代码如下:

    
      
        redis.clients  
        jedis  
     

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

学习淘淘商城第六十六课(商品详情缓存的实现)_第2张图片

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

学习淘淘商城第六十六课(商品详情缓存的实现)_第3张图片

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

学习淘淘商城第六十六课(商品详情缓存的实现)_第4张图片

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

学习淘淘商城第六十六课(商品详情缓存的实现)_第5张图片

        配置文件中的内容如下:

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

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

学习淘淘商城第六十六课(商品详情缓存的实现)_第6张图片

        下面我们真正开始写缓存代码,在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  list = itemMapper.selectByExample(example);
		//获取查询结果
		PageInfo 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);
	}

}

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

学习淘淘商城第六十六课(商品详情缓存的实现)_第7张图片

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

学习淘淘商城第六十六课(商品详情缓存的实现)_第8张图片



你可能感兴趣的:(redis,淘淘商城,淘淘商城)