
·Redis 缓存:Redis缓存有集中管理缓存的特点,是常见MySql数据库组件
·热点缓存本地缓存:热点数据存到JVM本地缓存中
·nginx proxy cache 缓存:所有数据最后都会在nginx服务器上做反向代理,nginx服务器也可以开启proxy cache缓存
·nginx lua 缓存:nginx定制lua脚本做nginx内存缓存
一.Redis集中式缓存介绍:
二.商品详情动态内容的实现
将从下游换取到的service数据在controller层缓存起来,以便于下次再有任何请求进来时可以直接判断缓存中是否有对应的商品详情页数据。有的话,直接返回,而不去走下游的service调用,且减少对数据库的依赖
第一步:修改ItemController.java
目前是 根据前端传入的商品id,动态到ItemService层去获取数据,并且转化成一个VO,返回给前端
每次查询商品详情都需要查询商品的一个基础信息,库存信息以及对应的商品活动信息并且判断活动的状态
忽略所有内存操作的一个性能开销 大部分操作的延迟开销在这三层的sql获取上
优化方案是在controller层 访问对应的ItemService之前完成缓存的操作
@Autowired
private RedisTemplate redisTemplate;
//商品详情页浏览
@RequestMapping(value = "/get", method = {RequestMethod.GET})
@ResponseBody
public CommonReturnType getItem(@RequestParam(name = "id") Integer id ){
// 根据商品的id到redis里面获取
ItemModel itemModel = (ItemModel) redisTemplate.opsForValue().get("item_" + id);
// 若redis里面不存在对应的itemModel,则访问下游service
if (itemModel == null) {
itemModel = itemService.getItemById(id);
// 并且把获取到的itemModel设置到redis里面
redisTemplate.opsForValue().set("item_" + id, itemModel);
redisTemplate.expire("item_" + id, 10, TimeUnit.MINUTES);
}
ItemVO itemVO = convertVOFromModel(itemModel);
return CommonReturnType.create(itemVO);
}
第二步:对ItemModel、PromoModel进行序列化
public class ItemModel implements Serializable
public class PromoModel implements Serializable
运行调试

本文探讨了电商秒杀场景下,通过Redis集中式缓存、本地热点缓存、Nginx proxy cache及lua缓存提升查询性能的策略。详细介绍了Redis配置、商品详情缓存实现、Guava Cache作为本地缓存的使用,以及Nginx缓存配置和lua脚本在缓存中的应用,最后分享了在压测过程中遇到的问题及解决方案。
最低0.47元/天 解锁文章
477

被折叠的 条评论
为什么被折叠?



