一、分析
每次展示商品详情都要查询数据。如果网站访问量很大,查询商品,所有的压力都压到数据库上。就需要用缓存来减轻数据库的压力。
缓存可以加在表现层和服务层。如果加在某个表现层,就只有这个表现层能用。所以,不如加到服务层去。
把e3-content-service的applicationContext-redis.xml复制过来。
缓存里面应该存放热点数据。不热的数据就不要放进来。所以,设置缓存的有效期。一般是一天的时间,可以根据实际情况跳转。
要设置过期时间,只能用string类型来存。
那么,我们以商品id作为key。在缓存中可能还存了其他类型的数据。其他类型的id可能会和商品的id冲突,怎么办?
可以加前缀方法对象redis中的key进行归类。
ITEM_INFO:123456:BASE
ITEM_INFO:123456:DESC
在redis客户操作,试试看。
用冒号对key进行归类。
二、业务逻辑添加
对ItemServiceImpl的getItemById和getItemDescById添加缓存的逻辑
@Override
public TbItem getItemById(long itemId) {
// 查询缓存
try {
String json = jedisClient.get(REDIS_ITEM_PRE + ":" + itemId + ":BASE");
if (StringUtils.isNotBlank(json)) {
TbItem tbItem = JsonUtils.jsonToPojo(json, TbItem.class);
return tbItem;
}
} catch (Exception e) {
e.printStackTrace();
}
// 缓存中没有,查询数据库
// 根据主键查询
// TbItem tbItem = itemMapper.selectByPrimaryKey(itemId);
TbItemExample example = new TbItemExample();
Criteria criteria = example.createCriteria();
// 设置查询条件
criteria.andIdEqualTo(itemId);
// 执行查询
List<TbItem> list = itemMapper.selectByExample(example);
if (list != null && list.size() > 0) {
// 把结果添加到缓存
try {
jedisClient.set(REDIS_ITEM_PRE + ":" + itemId + ":BASE", JsonUtils.objectToJson(list.get(0)));
// 设置过期时间
jedisClient.expire(REDIS_ITEM_PRE + ":" + itemId + ":BASE", ITEM_CACHE_EXPIRE);
} catch (Exception e) {
e.printStackTrace();
}
return list.get(0);
}
return null;
}
@Override
public TbItemDesc getItemDescById(long itemId) {
// 查询缓存
try {
String json = jedisClient.get(REDIS_ITEM_PRE + ":" + itemId + ":DESC");
if (StringUtils.isNotBlank(json)) {
TbItemDesc tbItemDesc = JsonUtils.jsonToPojo(json, TbItemDesc.class);
return tbItemDesc;
}
} catch (Exception e) {
e.printStackTrace();
}
TbItemDesc itemDesc = itemDescMapper.selectByPrimaryKey(itemId);
// 把结果添加到缓存
try {
jedisClient.set(REDIS_ITEM_PRE + ":" + itemId + ":DESC", JsonUtils.objectToJson(itemDesc));
// 设置过期时间
jedisClient.expire(REDIS_ITEM_PRE + ":" + itemId + ":DESC", ITEM_CACHE_EXPIRE);
} catch (Exception e) {
e.printStackTrace();
}
return itemDesc;
}
三、测试
重启e3-manager:
刷新以下页面
缓存中有数据了