学习淘淘商城第六十六课(商品详情缓存的实现)
2017-05-15 00:05
399 查看
上节课我们一起分析了下商品详情缓存策略,这节课我们一起实现商品详情缓存的添加。
首先,我们要想清楚缓存应该加到哪个工程当中,现在我们有两个工程可以选择,第一个工程是taotao-item-web(商品详情工程),如果把缓存加到这个工程的话,由于该工程是个web工程,不被其它工程所共用,那么这块缓存的功能只能被它自己使用。第二个工程是taotao-manager(商品工程),由于多个工程都依赖taotao-manager,因此缓存的功能可以被多个工程所共用。显然,我们应该选择第二个工程来添加缓存。
要使用Redis缓存技术,就要先添加Redis的依赖,如下图所示。
依赖代码如下:
添加完依赖之后,需要添加对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。
配置文件中的内容如下:
添加了配置文件,要让Spring容器能够扫描到,因此我们打开applicationContext-dao.xml文件,把关于加载配置文件的配置由原来的db.properties修改为*.properties,这样properties目录下的所有配置文件都可以被扫描到了。
下面我们真正开始写缓存代码,在ItemServiceImpl类中的获取商品基本信息方法(getItemById)和获取商品描述信息方法(getItemDescById)中添加缓存代码,添加完缓存后,ItemServiceImplement类的所有代码如下:
其中新注入的内容如下图蓝色标注所示。
代码写好了,下面我们便要进行测试,由于我们修改了taotao-manager工程,最好我们重新打包taotao-manager工程到本地Maven仓库,然后我们重启taotao-manager工程,重启后,我们再来访问商品详情页面,第一次访问是查询数据库,然后我们再刷新页面,第二次访问就是查询的缓存了。缓存中存储的信息如下图所示。
首先,我们要想清楚缓存应该加到哪个工程当中,现在我们有两个工程可以选择,第一个工程是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工程,重启后,我们再来访问商品详情页面,第一次访问是查询数据库,然后我们再刷新页面,第二次访问就是查询的缓存了。缓存中存储的信息如下图所示。
相关文章推荐
- 学习淘淘商城第六十四课(实现商品详情页面展示)
- 学习淘淘商城第六十五课(查询商品详情添加缓存分析)
- 学习淘淘商城第六十三课(搭建商品详情页面工程)
- 淘淘商城系列——商品详情页面展示添加缓存
- 淘淘商城系列——实现商品详情页面展示
- 带你逐步深入了解SSM框架——淘淘商城项目之商品详情页面实现
- ThinkPHP 静态缓存 实现商品详情页PC版、手机版静态+SEO优化(未完待续。。。)
- 学习淘淘商城第二十三课(添加商品的实现)
- 淘淘商城系列——查询商品详情添加缓存分析
- 学习淘淘商城第二十三课(添加商品的实现)
- 学习淘淘商城第十八课(商品分类选择的实现)
- 学习淘淘商城第九十七课(商品详情页面对加入购物车进行改造)
- 学习淘淘商城第四十八课(商品搜索功能Controller实现)
- 学习淘淘商城第十八课(商品分类选择的实现)
- cc_美团 商品详情页面分享页面实现
- 实现淘宝商品详情页面的viewPager滑动到最后一张图片跳转的功能
- android 自定义ViewGroup实现仿淘宝的商品详情页
- java教程、java学习:Java数据缓存实现的核心机制
- Django 学习小组:博客开发实战第二周教程 —— 实现博客详情页面和分类页面
- ActionScript 3.0 学习(八) AS3 简单的缓存功能实现之SharedObject类