一、展示商品详情
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.需求分析
- 从solr库查询出的商品(减轻数据库的压力)
- 查看商品的详情,基本信息,和商品描述,....放到redis缓存里,减轻数据库的压力
- 问题: 只要有用户查询完某一件商品,redis库中就会存储这个商品的信息,(热点数据),非热点数据,
- 比如:7月份,搜索羽绒服, 把羽绒服信息保存到redis库中, 一直占用redis缓存,浪费硬盘空间,
- 生命周期, 可以给这个缓存设置一个生命周期, 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;
}