SpringCloudAlibaba云商场-高性能门户网构建(四)

110 阅读4分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第19天,点击查看活动详情

每日英语:

Miracles happen every day.

翻译:奇迹每天都在发生 -《阿甘正传》

1.多级缓存架构实战

大家在项目运行过程中,往往为了提升对数据的加载效率,一般都会选择增加缓存。但是存在这两大问题,一个是缓存如何加载效率最高?另一个是如何加载对后端服务造成的压力最小?接下来,我们尝试着去设计一套完善的缓存架构体系。

1.1多级缓存架构分析

多级缓存架构设计分析.jpg 用户请求到达后端服务,先经过代理层nginx,nginx将请求路由到后端tomcat服务,tomcat再去数据库中取数据,这是一个非常普通的流程,但在大并发场景下,需要做优化,而缓存是最有效的手段之一。缓存优化有,执行过程如下:

1:请求到达Nginx,Nginx抗压能力极强。
2:Tomcat抗压能力很弱,如果直接将所有请求路由给Tomcat,Tomcat压力会非常大,很有可能宕机。我们可以在Nginx这里设置2道缓存,第1道是Redis缓存,第2道是Nginx缓存。
3:先加载Redis缓存,如果Redis没有缓存,则加载Nginx缓存,Nginx如果没有缓存,则将请求路由到Tomcat。
4:Tomcat发布的程序会加载数据,加载完成后需要做缓存的,及时将数据存入Redis缓存,再响应数据给用户。
5:用户下次查询的时候,查询Redis缓存或Nginx缓存。
6:后面用户请求的时候,就可以直接从Nginx缓存拿数据了,这样就可以实现后端Tomcat发布的服务被调用的次数大幅减少,负载大幅下降。

上面这套缓存架构被多个大厂应用,除了可以有效提高加载速度、降低后端服务负载之外,还可以防止缓存雪崩,为服务稳定健康打下了坚实的基础,这也就是鼎鼎有名的多级缓存架构体系。

1.2首页推广商品高效加载

首页很多商品优先推荐展示,这些其实都是推广商品,并非真正意义上的热门商品,首页展示这些商品数据需要加载效率极高,并且商城首页访问频率也是极高,我们需要对首页数据做缓存处理,我们首先想到的就是Redis缓存。

1.2.1推广商品推荐表结构设计

推广商品并非只在首页出现,也有可能在列表页、分类搜索页多个地方出现,因此可以设计一张表用于存放不同位置展示不同商品的表,推广产品推荐表如下:

CREATE TABLE `ad_items` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(100) DEFAULT NULL,
  `type` int(3) DEFAULT NULL COMMENT '分类,1首页推广,2列表页推广',
  `sku_id` varchar(60) DEFAULT NULL COMMENT '展示的产品(对应Sku)',
  `sort` int(11) DEFAULT NULL COMMENT '排序',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

1.2.2推广商品代码逻辑

1)Bean创建

mall-goods-api中创建com.xz.mall.goods.model.AdItems

@Data
@AllArgsConstructor
@NoArgsConstructor
//MyBatisPlus表映射注解
@TableName(value = "ad_items")
public class AdItems implements Serializable {

    @TableId(type = IdType.AUTO)
    private Integer id;
    private String name;
    private Integer type;
    private String skuId;
    private Integer sort;

}

2)Mapper

创建com.xz.mall.goods.mapper.AdItemsMapper,代码如下:

public interface AdItemsMapper extends BaseMapper<AdItems> {
}

3)Service

创建com.xz.mall.goods.service.SkuService,代码如下:

public interface SkuService extends IService<Sku> {

    /**
     * 根据推广产品分裂ID查询指定分类下的产品列表
     * @param id
     * @return
     */
    List<Sku> typeSkuItems(Integer id);

}

创建对应的实现类com.xz.mall.goods.service.impl.SkuServiceImpl,代码如下:

@Service
public class SkuServiceImpl extends ServiceImpl<SkuMapper, Sku> implements SkuService {


    @Autowired
    private AdItemsMapper adItemsMapper;

    @Autowired
    private SkuMapper skuMapper;

    /**
     * 根据推广产品分裂ID查询指定分类下的产品列表
     * @param id
     * @return
     */
    @Override
    public List<Sku> typeSkuItems(Integer id) {
        //1.查询当前分类下的所有列表信息
        QueryWrapper<AdItems> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("type", id);
        List<AdItems> adItems = adItemsMapper.selectList(queryWrapper);
        //2.根据推广列表查询产品列表信息
        List<String> skuIds = adItems.stream().map(AdItems::getSkuId).collect(Collectors.toList());
        return skuMapper.selectBatchIds(skuIds);
    }
}

4)Controller

创建com.xz.mall.goods.controller.SkuController,代码如下:

@RestController
@RequestMapping(value = "/sku")
public class SkuController {

    @Autowired
    private SkuService skuService;


    /**
     * 根据推广分类查询推广产品列表
     */
    @GetMapping(value = "/aditems/type/{id}")
    public RespResult<List<Sku>> typeItems(@PathVariable("id") Integer id) {
        List<Sku> skus = skuService.typeSkuItems(id);
        return RespResult.ok(skus);
    }

}

5)用postman测试一下,看看

AAAA根据推广分类查询推广产品列表.jpg

总结:本篇主要介绍了一下多级缓存架构设计的分析,以及推广商品推荐表的设计,还有推广商品部分的基础代码逻辑。