电商秒杀之查询性能优化技术——多级缓存(一)

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

·Redis 缓存:Redis缓存有集中管理缓存的特点,是常见MySql数据库组件
·热点缓存本地缓存:热点数据存到JVM本地缓存中
·nginx proxy cache 缓存:所有数据最后都会在nginx服务器上做反向代理,nginx服务器也可以开启proxy cache缓存 

·nginx lua 缓存:nginx定制lua脚本做nginx内存缓存

一.Redis集中式缓存介绍:

第四章 查询优化技术之多级缓存_猿小羽的博客-CSDN博客

二.商品详情动态内容的实现

将从下游换取到的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);
    }

第二步:对ItemModelPromoModel进行序列化

public class ItemModel  implements Serializable
public class PromoModel implements Serializable

运行调试

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值