实战day09(五)----商品信息添加缓存

本文详细介绍了如何通过缓存来缓解高访问量下数据库的压力。首先分析了将缓存添加到服务层的必要性,然后复制配置文件并设置了缓存有效期。以商品ID为key,并使用前缀避免键冲突。接着在业务逻辑中实现了商品信息查询的缓存处理,并在测试环节验证了缓存功能的正确性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、分析

每次展示商品详情都要查询数据。如果网站访问量很大,查询商品,所有的压力都压到数据库上。就需要用缓存来减轻数据库的压力。

缓存可以加在表现层和服务层。如果加在某个表现层,就只有这个表现层能用。所以,不如加到服务层去。

把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:

刷新以下页面


缓存中有数据了



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值