淘淘商城25_商品详情页面实现02_商品详情

一、展示商品详情

1. dao层

2. Service层

3. serviceImpl

/**
	 * 查询商品详情
	 * @param itemId
	 * @return
	 */
	@Override
	public TbItemDesc getItemDescByItemId(long itemId) {
		TbItemDesc itemDesc = itemDescMapper.getTbItemDescByItemId(itemId);
		return itemDesc;
	}

4. Controller

/**
	 * 获取商品的详情
	 * 此处的参数来源是taotao-search-web下面的search.jsp页面
	 * @param itemId
	 * @return
	 */
	@RequestMapping("/item/desc/{itemId}")
	@ResponseBody
	public String getItemDescByItemId(@PathVariable long itemId){
		TbItemDesc itemDesc = itemService.getItemDescByItemId(itemId);
		String desc = itemDesc.getItemDesc();//获取商品的详情
		return desc;
	}

二、展示规格参数

直接在Controller层里,使用httpclient调用taotao-manager-service里这个方法

http://localhost:8081/item/param/itemParamItems/{itemid}

/**
	 * 展示商品规格参数
	 * 直接用HttpClientUtil这个工具类调用taotao-manager-web
	 * @param itemId
	 * @return
	 */
	@RequestMapping("/item/param/{itemId}")
	@ResponseBody
	public String getItemParamByItemId(@PathVariable long itemId){
		String param = HttpClientUtil.doGet("http://localhost:8081/item/param/itemParamItems/"+itemId);
		return param;
	}

测试:出现乱码

解决乱码问题:在ItemParamController.java中修改

@RequestMapping(value="/itemParamItems/{itemId}", produces=MediaType.APPLICATION_JSON_VALUE+"; charset=utf-8;")

三、添加缓存逻辑

1.需求分析

  1. 从solr库查询出的商品(减轻数据库的压力)
  2. 查看商品的详情,基本信息,和商品描述,....放到redis缓存里,减轻数据库的压力
  3. 问题: 只要有用户查询完某一件商品,redis库中就会存储这个商品的信息,(热点数据),非热点数据,
  4. 比如:7月份,搜索羽绒服,  把羽绒服信息保存到redis库中, 一直占用redis缓存,浪费硬盘空间,
  5. 生命周期,   可以给这个缓存设置一个生命周期,  24小时

2. 添加缓存逻辑

Redis的hash类型中的key是不能设置过期时间。如果还需要对key进行分类可以使用折中的方案。

Key的命名方式:

cctv:javaee16:01=李刚       cctv:javaee16:02=张三  

cctv:javaee17:01=张龙       cctv:javaee17:02=张飞

3. 配置文件

3.1 在taotao-manager-service

3.2 将taotao-content-service中的applicationContext-jedis.xml复制到在taotao-manager-service中

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p"
	xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
	http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd
	http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd
	http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.2.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.2.xsd
	http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.2.xsd">
	
	     <!-- 连接池配置 可以不加-->
	    <bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
			<!-- 最大连接数 -->
			<property name="maxTotal" value="30" />
			<!-- 最大空闲连接数 -->
			<property name="maxIdle" value="10" />
			<!-- 每次释放连接的最大数目 -->
			<property name="numTestsPerEvictionRun" value="1024" />
			<!-- 释放连接的扫描间隔(毫秒) -->
			<property name="timeBetweenEvictionRunsMillis" value="30000" />
			<!-- 连接最小空闲时间 -->
			<property name="minEvictableIdleTimeMillis" value="1800000" />
			<!-- 连接空闲多久后释放, 当空闲时间>该值 且 空闲连接>最大空闲连接数 时直接释放 -->
			<property name="softMinEvictableIdleTimeMillis" value="10000" />
			<!-- 获取连接时的最大等待毫秒数,小于零:阻塞不确定的时间,默认-1 -->
			<property name="maxWaitMillis" value="1500" />
			<!-- 在获取连接的时候检查有效性, 默认false -->
			<property name="testOnBorrow" value="true" />
			<!-- 在空闲时检查有效性, 默认false -->
			<property name="testWhileIdle" value="true" />
			<!-- 连接耗尽时是否阻塞, false报异常,ture阻塞直到超时, 默认true -->
			<property name="blockWhenExhausted" value="false" />
		</bean>
		
		 <!-- 单机版jedis配置 -->
		<bean id="redisClient" class="redis.clients.jedis.JedisPool">
			<constructor-arg name="host" value="192.168.1.105"></constructor-arg>
			<constructor-arg name="port" value="6379"></constructor-arg>
	        <constructor-arg name="poolConfig" ref="jedisPoolConfig"></constructor-arg>
		</bean>
		
		<bean id="jedisClient" class="com.taotao.dao.impl.JedisClientSingle"/>
</beans>

3.3 将taotao-content-service中的dao和daoImpl复制到在taotao-manager-service中

JedisClient.java

package com.taotao.dao;

public interface JedisClient {
	//set方法
	public String set(String key, String value);
	//get方法
	public String get(String key);
	//删除key      del
	public long del(String key);
	//hset方法
	public long hset(String hkey, String key, String value);
	//hget方法
	public String hget(String hkey, String key);
	//删除Hashkey    hdel
	public long hdel(String hkey, String key);
	//生命周期
	public long expire(String key, int second);
	//查询剩余生命周期
	public long ttl(String key);
	//自增
	public long incr(String key);
}

JedisClientSingle.java

package com.taotao.dao.impl;

import org.springframework.beans.factory.annotation.Autowired;

import com.taotao.dao.JedisClient;

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

public class JedisClientSingle implements JedisClient {

	@Autowired
	private JedisPool jedisPool;
	
	/**
	 * set
	 */
	@Override
	public String set(String key, String value) {
		Jedis jedis = jedisPool.getResource();
		String str = jedis.set(key, value);
		jedis.close();
		return str;
	}

	/**
	 * get
	 */
	@Override
	public String get(String key) {
		Jedis jedis = jedisPool.getResource();
		String str = jedis.get(key);
		jedis.close();
		return str;
	}

	/**
	 * hash
	 * hset
	 */
	@Override
	public long hset(String hkey, String key, String value) {
		Jedis jedis = jedisPool.getResource();
		Long ss = jedis.hset(hkey, key, value);
		jedis.close();
		return ss;
	}

	/**
	 * hash  hget
	 */
	@Override
	public String hget(String hkey, String key) {
		Jedis jedis = jedisPool.getResource();
	   String str = jedis.hget(hkey, key);
	   jedis.close();
		return str;
	}

	/**
	 * expire
	 */
	@Override
	public long expire(String key, int second) {
		Jedis jedis = jedisPool.getResource();
		Long ss = jedis.expire(key, second);
		jedis.close();
		return ss;
	}

	/**
	 * ttl
	 */
	@Override
	public long ttl(String key) {
		Jedis jedis = jedisPool.getResource();
		Long ss = jedis.ttl(key);
		jedis.close();
		return ss;
	}

	/**
	 * incr
	 */
	@Override
	public long incr(String key) {
		Jedis jedis = jedisPool.getResource();
		Long ss = jedis.incr(key);
		jedis.close();
		return ss;
	}

	/**
	 * 删除key
	 */
	@Override
	public long del(String key) {
		Jedis jedis = jedisPool.getResource();
		Long ss = jedis.del(key);
		jedis.close();
		return ss;
	}

	/**
	 * 删除hashkey
	 */
	@Override
	public long hdel(String hkey, String key) {
		Jedis jedis = jedisPool.getResource();
		Long ss = jedis.hdel(hkey, key);
		jedis.close();
		return ss;
	}

}

3.4.  添加缓存逻辑,定义一个配置文件resource.properties

商品key的定义:

基本信息:

REDIS_ITEM_KEY:商品id:base=json

描述:

REDIS_ITEM_KEY:商品id:desc=json

规格参数:

REDIS_ITEM_KEY:商品id:param=json

#商品信息在redis中保存的key

REDIS_ITEM_KEY=REDIS_ITEM_KEY

#商品信息在缓存中的过期时间   60*60*24(60秒*60分钟*24小时)

REDIS_ITEM_EXPIRE=86400

3.5 修改applicationContext-dao.xml

4、代码的编写

4.1. 查询单个商品信息   ItemServiceImpl.java

@Autowired
	private JedisClient jedisClient;
	
	@Value("${REDIS_ITEM_KEY}")
	private String REDIS_ITEM_KEY;//商品key值
	@Value("${REDIS_ITEM_EXPIRE}")
	public Integer REDIS_ITEM_EXPIRE;//生命周期
/**
	 * 根据商品id查询商品
	 */
	@Override
	public TbItem getItemById(long itemId) {
		//3.从缓存中获取数据,若缓存中有数据,则取,若无数据,则执行1、2的步骤
		String jedis = jedisClient.get(REDIS_ITEM_KEY+":"+itemId+": base");
		if (StringUtils.isNotEmpty(jedis)) {
			TbItem tbitem = JsonUtils.jsonToPojo(jedis, TbItem.class);
			return tbitem;
		}
		TbItem item = itemMapper.getItemById(itemId);
		//1.把查询到的数据放入到缓存中
		jedisClient.set(REDIS_ITEM_KEY+":"+itemId+": base", JsonUtils.objectToJson(item));
		//2.设置生命周期
		jedisClient.expire(REDIS_ITEM_KEY+":"+itemId+": base", REDIS_ITEM_EXPIRE);
		return item;
	}

4.2 查询商品详情

/**
	 * 查询商品详情
	 * @param itemId
	 * @return
	 */
	@Override
	public TbItemDesc getItemDescByItemId(long itemId) {
		//3.从缓存中获取数据,若缓存中有数据,则取,若无数据,则执行1、2的步骤
		String jedis = jedisClient.get(REDIS_ITEM_KEY+":"+itemId+": base");
		if (StringUtils.isNotEmpty(jedis)) {
			TbItemDesc tbitem = JsonUtils.jsonToPojo(jedis, TbItemDesc.class);
			return tbitem;
		}
		TbItemDesc itemDesc = itemDescMapper.getTbItemDescByItemId(itemId);
		//1.把查询到的数据放入到缓存中
		jedisClient.set(REDIS_ITEM_KEY+":"+itemId+": base", JsonUtils.objectToJson(itemDesc));
		//2.设置生命周期
		jedisClient.expire(REDIS_ITEM_KEY+":"+itemId+": base", REDIS_ITEM_EXPIRE);
		return itemDesc;
	}

猜你喜欢

转载自blog.csdn.net/fjz_lihuapiaoxiang/article/details/85264261