Java项目面试实操 提升大厂面试成功率 第06章 笔…

2020-05-27 16:01:35来源:博客园 阅读 ()

新老客户大回馈,云服务器低至5折

Java项目面试实操 提升大厂面试成功率 第06章 笔记

06章 如何应对:商品管理与秒杀模块面试?

6.1 电商项目面试之商品管理(一) 

商品记录

 

编辑——>商品规格(SPU)——>商品参数(SKU)

6.2 电商项目面试之商品管理(二) 

https://cloud.tencent.com

 

对象存储服务:https://console.cloud.tencent.com/cos5

秘钥:AKID0uYw6H9rHRKyLRhTF2hANK3jhOuER8h1

key:QZS6iCRQAfCdnCNI3dy4tSyMTJtDH3Yz

# 腾讯对象存储配置信息
tencent:
  secretId: AKID0uYw6H9rHRKyLRhTF2hANK3jhOuER8h1
  secretKey: QZS6iCRQAfCdnCNI3dy4tSyMTJtDH3Yz
  region: ap-nanjing
  bucketName: litemall2020-1253518225

 

启动:litemall-admin-api

 http://localhost:9527/#/goods/list

启动:litemall-wx-api

 

添加商品——>微信SPU和SKU的信息

6.3 电商项目面试之商品管理(三)

如何二次开发——见视频解说

 

6.4 电商项目面试之商品管理(四)

 

 

第一题:SPU是商品的公共信息,SKU是商品的规格信息。比如说一个小米手机SPU信息是安卓系统,高通的CPU,6.5寸的屏幕,4000毫安的电池等等,但是这部手机的内存容量和颜色是有很多种规格的,假设有三种内存容量和三种颜色。组合在一起就是九种规格方案,也就是九条SKU记录,我们创建数据表的时候,SPU表和SKU表是一对多的关系,也就是说一个SPU记录对应多条SKU记录。

第二题:如果是物理删除,在删除SPU记录之前需要判断SPU记录有没有关联的订单。如果有关联的订单,那么SPU记录是不能删除的,如果没有关联的订单是可以删除SPU记录的。但是删除SPU记录要连带着删除SKU记录,这个是物理删除的情况。如果是逻辑删除,那么就不需要判断还是SPu是否存在关联的订单了。直接在SPU记录的delete字段上设置上True这个值就代表说这条记录已经删除了。那么关联的SKU数据delete字段也要设置上True就代表说删除了。

第三题:我做的电商系统是B2C模式的,也就是单商铺的模式,如果要做多商铺的C2C电商。那么商铺之间的数据是要隔离的,不能交叉访问,所以设计数据表的时候就要引入商铺表。然后呢,让SPU关联到商铺的id,这样的每个商铺就只能看到自己商铺的商品数据了。

第四题:我们做的是单商铺的电商系统,只要商家编辑商品都会形成一条新的商品记录。当用户根据订单查询商品的时候,并不会看到最新的商品记录,而是会查询到他下单时候的商品记录。记录这个就可以防止商家随意篡改订单的商品信息,因为我们现在做的是单商铺的电商网站。所以一个商家的商品记录,包括归档数据还行不成上千万的数据规模。如果做成C2C的多商铺电商系统,那么SPU表和SKU表里边就会保存大量的数据。因为单表超过两千万数据,MYSQL的读写性能就会很差,所以在这种情况下,应该单独创建SPU和SKU的归档数据表。把归档的数据转移存储的归档表里边,这样的就可以实现对SPU和SKU数据表的缩表。这种数据库设计叫做冷热数据分离,

第五题:我们用的是逻辑删除,而不是物理删除。

 

 

第六题:前端渲染的速度有很多种优化方案,首先是数据库方面要做好优化。比如说优化SQL语句,多利用索引设置引导innodb缓冲池增加数据库的线程数量。在我的数据库连接池方面需要增加连接的数量,我们可以采用Mysql分区技术,把数据切分存储的不同的硬盘上。多块硬盘的io能力是要好于单块硬盘的,所以MYSQL的读写速度就提升了。如果是大型项目数据库层面要使用集群,数据要做分库分表。还要做读写分离,冷热数据分离等等。其次呢,在程序的后台部分也能做很多提升数据读取速度的改进,比如说引入缓存。把热点的业务数据缓存到radis里边,如果命中缓存的话,就不需要走数据库了。所以读取的速度也就提升了,还有就是后台项目的网络连接方式,可以从bio改成nio。这样的依靠少量的线程就能处理更多的网络请求了,那么再有呢就是增加他们凯特线程的数量,也能实现更大的网络吞吐能力。如果有条件的话,我们可以对他们Tomcat负载均衡也能增加。也能增加后台项目的负载能力。另外呢,我们可以利用CDN服务缓存静态的网页和图片。这样浏览器加载商品信息的时候也会更快一些,那么前端方面也有一些优化的手段。比如说减少HTTP请求能合并的请求就合并成一个HTTP请求。那么素材图片可以使用雪花图,那么商品图片可以使用延时加载的办法。

第七题:我们先来看一下SKU数据,比如说床垫儿有这么多种规格。而且这个字段的类型是Jason数组,那么真实类型的字段级别设置了索引。查找的效率也不是很高,所以用户想要根据规格参数去查找数据。MySQL的执行效率真的是很低,我们要引入新的技术来应对。这里呢,我推荐使用elastic search,简称为额es,它是一个全文搜索引擎。最适合从海量数据中快速提取我们想要的数据,关于es技术,我放在后面的章节跟大家详细的说明。因为电商项目的内容非常多,所以为了课程整体的平衡性,我就把一些技术放到其他的章节去讲。毕竟其他类型的项目也是需要s技术的好了,这道题呀,你可以这么去回答我做的电商项目,支持用户按照参数去查找商品,那么我们录入商品之后,支持用户按照参数去查找商品,那么我们录入商品之后,就会把商品数据保存到数据库的SQL。SKU数据表里边,然后把可以用来检索的参数和商品名称以及主键值。写到es里边,用户解锁商品的时候,我们就到es中查找,然后呢得到商品的id。接下来呢,从数据库中提取商品的信息,最后呢渲染到页面上面。

第八题:非常好回答yes,不能替代SQL数据表虽然es用来检索数据。但是颜色里边并不是存放了一个商品的全部信息,只是存放了用来被检索的那部分属性信息。Mr渲染的时候,详细的规格信息还是要从SKU数据表里边读取的。

第九题:这个问题又是跟es技术相关,全文检索里边有中文分词技术,可以实现语义分析。就拿最好看的全面屏手机来说吧,没有任何商品叫这个名字,所以我们要用到中文分词技术。提取其中的名词忽略形容词,于是中文分词之后的结果就是全面屏手机。我们按照这个关键字到es中去检索,就能得到搜索的结果了。好了,这道题你可以这么去回答,我们给rc添加了中文分词技术,提取搜索信息里边的名词。忽略形容词用户搜索最好看的全面屏手机的时候,最终是按照全面屏手机这个关键字来检索商品的。

第十题:我们用的是腾讯云的对象存储服务开通对象存储服务之后呢,我们在微商城的后台系统配置上secret id和secret key。还有app和存储系统的信息,通过腾讯云的一篇接口就能把图片上传到云端了。我们是利用腾讯云的对象存储服务来充当涂装服务器的好了,各位同学以上这些呢,就是有关商品管理模块的主要面试题了。

 

 

6.5 电商项目面试之秒杀业务(一)

 

 

 

 

解决数据库超售方案(一)

 

 

解决数据库超售方案(二)

 

 

解决数据库超售方案(三)

 

6.6 电商项目面试之秒杀业务(二)

解决秒杀业务方法演示

 

 

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>mooc</groupId>
    <artifactId>demo</artifactId>
    <version>1.0-SNAPSHOT</version>
    <dependencies>
        <!--链接Redis 数据库的工具        -->
        <dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
            <version>3.0.1</version>
        </dependency>
    </dependencies>

</project>

 

 

Application.java

import redis.clients.jedis.Jedis;

import java.util.concurrent.LinkedBlockingDeque;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

public class Application {
    public static ThreadPoolExecutor pool=new ThreadPoolExecutor(
      10,100,10, TimeUnit.SECONDS,
      new LinkedBlockingDeque<Runnable>()
    );
    public static void main(String[] args) {
        Jedis jedis=new Jedis("localhost",6379);
        jedis.auth("123456");
        //逻辑库
        jedis.select(1);
        jedis.set("kill_num","50");
        jedis.del("kill_list");
        jedis.close();
        for (int i=0;i<1000;i++){
            pool.execute(new KillTask());
        }
    }
}

KillTask.java

import redis.clients.jedis.Jedis;
import redis.clients.jedis.Transaction;

public class KillTask implements Runnable {
    @Override
    public void run() {
        Jedis jedis=new Jedis("localhost",6379);
        jedis.auth("abc123456");
        jedis.select(1);
        jedis.watch("kill_num","kill_list");
        int num=Integer.parseInt(jedis.get("kill_num"));
        if(num>0){
            Transaction transaction=jedis.multi();
            transaction.decr("kill_num");
            transaction.rpush("kill_list","9527");
            transaction.exec();
        }
        else {
            Application.pool.shutdown();
        }
        jedis.close();
    }
}

6.7 电商项目面试之秒杀业务(三)

6.8 本章总结 

 

资源

微云链接:
链接:https://share.weiyun.com/4Ruecunx 密码:m4xy7s

百度网盘:链接: https://pan.baidu.com/s/1UBSJaWNobkTmZ7uTGVMRQg 密码: 1bpw

如果失效联系v:itit11223344


原文链接:https://www.cnblogs.com/11111wg/p/12970684.html
如有疑问请与原作者联系

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:Java连载118-编译一个类(包括内部函数、方法、类型、参数)

下一篇:spring系列-springhello