面向面试知识--Lottery项目

news2024/11/27 1:28:22

面向面试知识–Lottery项目

1.设计模式

  1. 为什么需要设计模式?

(设计模式是什么?优点有哪些?)

  1. 设计模式是一套经过验证的有效的软件开发指导思想/解决方案;
  2. 提高代码的可重用性和可维护性;
  3. 提高团队合作开发效率;
  4. 为了项目开发的代码更加具有可扩展性和灵活性,提高程序开发的效率,而提出了基于×××等原则的一些程序/项目设计模式。
  1. 设计模式的原则?
  1. 开放封闭原则Open-Closed Principle:对修改关闭,对扩展开放。是设计模式原则的总纲。其他的设计模式原则都是该总纲的具体实现。(父类没有实现的功能,不要直接在此修改,在子类中实现新功能,并调用子类的方法来使用。)软件实体应该在不修改原有代码基础上做扩展。
    面向对象编程在开发时都要强调开放封闭原则。
  2. 单一职责原则Simple Responsibility Principle:每个类应该实现单一的职责,否则应该拆分。如果一个类的功能过多,会很臃肿,复用性也比较差。
  3. 里氏替换原则Liskov Substitution Principle:使用父类的地方都能使用子类来替换;子类的所有方法必须在父类中声明。在定义时,尽量用父类对对象进行声明,在使用时用子类进行方法调用,比如定义为animal对象,用dog.eat()或者cat.eat()调用方法,类似于java的多态。子类能够替换父类而不产生异常
  4. 依赖倒置原则Dependence Inversion Principle:自上而下的设计原则;对接口编程,依赖于抽象,而不依赖于具体,面向接口编程
  5. 接口隔离原则Interface Segregation Principle:一个类对另一个类的依赖应该建立在最小的接口上。一个类不应该依赖他不需要的接口,每个接口不应该存在其子类不需要的方法,否则要将接口拆分。多个专门的接口好于一个通用的接口
    参考视频:谈谈设计模式6大原则
  1. 常用/使用过的设计模式有哪些?
  1. 单例模式:确保一个类只有一个实例存在,并且自行实例化并向整个系统提供这个实例。
    那么,这个类不能在外部被初始化,因此构造方法应该是private的;
    该类自行实例化,那么其构造方法以及相关成员变量要是static的,以在编译阶段自行生成。
    单个的实例为整个系统提供服务,则需要一个静态方法,作为外界访问该实例的入口。
    分为饿汉式和懒汉式:饿汉式在类加载时初始化单例实例,直接定义时new;懒汉式在第一次被访问时初始化,(示例访问方法)实例化。
    懒汉式需要加锁防止被多线程多次实例化;还有一种双重检查锁的实现方式,如图。
    在这里插入图片描述
    单例模式的缺点:状态值可能会被修改,因此建议单例模式用在无状态的工具类
  2. 简单工厂模式:专门定义一个类来负责创建其他类的实例。是类创建模式的一种,被创建的实例通常都具有共同的父类。(状态模式的一种特例)
    缺点是不够灵活,如果创建新的类,就需要在工厂类中添加代码;
  3. 策略模式:提前定义一组算法,将每个算法都封装起来,并且他们之间可以互换。策略模式让算法独立于使用它的客户而变化。比如洗衣机选择清洗模式的例子。
  4. 组合模式:太抽象了,是一种结构型设计模式,可以使用它将对象组合成树状结构,并且能够像使用独立对象一样使用它们。
  5. 模板模式:定义一个操作中的算法框架,而将一些步骤延迟到子类中。使得子类可以不改变算法结构即可重新定义该算法的某些特定步骤。(提前规定好业务执行的流程顺序,子类只需要逐个实现相应方法即可。)
    在这里插入图片描述
    父类控制框架流程,子类负责某些方法的具体实现
    缺点是:类的个数会增多。

参考视频:五分钟学设计模式

2.SQL调优

  1. 什么契机需要进行SQL调优?

a) 大数量查询慢;
b) 多表联查时效率;
c) 查询语句应该如何优化;
d) 如何编写一个高效的查询语句;
e) 如何正确的使用索引;
f) 索引的实现原理是什么?
g) 索引失效的场景有哪些?

  1. 有哪些调优方法?如何实现?
  1. 表结构优化:

  2. SQL语句优化:
    a) 避免使用SELECT *;而是使用具体的列;
    b) 用union all 代替union;union可以排除重复的数据,union all无法排除重复语句;
    c) 小表驱动大表:小表在前,则用exist接大表;大表在前,则用in关键字接小表;
    ① 比如:order表1w条数据,大表;user表100条数据,小表;如果order表在左边,使用in关键字性能更好,因为in关键字先在小表user中查;如果user表在左边,则用exist关键字性能更好,因为exist关键字先查小表user;
    d) 批量操作:比如批量插入,需要控制没批数据在500行以内,多余500可分多批次处理;
    e) 多用limit:用SQL语句排序查找第一或者最新数据时,可以加上limit1,只返回一条数据即可;
    f) 业务代码优化,见5.
    g) 增量查询:对于查询整个数据库,然后同步到另一个数据库,会用到select *,对于这种情况,可以分轮次,按照id和时间顺序,每轮查询100条,增量查询。在这里插入图片描述
    h) 高效的分页:反例:在这里插入图片描述
    优化为:
    ①但是该方案要求id连续且有序;在这里插入图片描述
    ②between优化分页:
    在这里插入图片描述
    i) 用连接查询代替子查询:反例:
    在这里插入图片描述
    优化为连接查询:在这里插入图片描述
    j) join表不宜过多:join表不应该超过三个(阿里开发者手册),如果表内数据量不太大,可以适当允许更多表的联查;即视情况而定。
    k) join时要注意:尽量用inner join,如果非要用left join,则left join左边的表最好是小表,右边可以用大表;
    l) 控制索引的数量:索引占用一定的内存,能加快查表速度,但是当需要插入(insert)/更新(update)/删除(delete)数据时,需要修改索引,会有一定的性能消耗,因此不能太多索引。阿里巴巴开发者手册:高并发场景下,单表的索引数量控制在五个以内。能建立联合索引就不要建立单个索引
    m) 选择合理的字段类型;varchar和char的选择;能用int尽量用int;
    n) 提升group by的效率:group by的作用就是去除重复和分组,通常和having一起使用;先group by 再设定范围:
    反例:
    在这里插入图片描述
    优化:在这里插入图片描述
    o) 索引优化:使用explain命令查看数据库的执行计划,看其是否走了索引;

  3. 合理的使用索引:

  1. 索引
    索引优化的具体内容可以看该文章:

a) 控制索引的数量:索引占用一定的内存,能加快查表速度,但是当需要插入(insert)/更新(update)/删除(delete)数据时,需要修改索引,会有一定的性能消耗,因此不能太多索引。阿里巴巴开发者手册:高并发场景下,单表的索引数量控制在五个以内。能建立联合索引就不要建立单个索引
b) 索引优化
索引失效是SQL查询语句效率不太高的原因之一;

  1. 事务(四种隔离等级)
  2. 业务代码优化:

业务代码:大范围的查询,手动分批次查,每批不大于500个的查;

3.Redis

  1. 为什么使用redis?
  2. Redis如何保证数据一致性?
  3. Redis中缓存击穿、缓存雪崩、缓存穿透出现的原因和解决方案?
    详见文章:

4.消息重复(Redis实现消息队列)

  1. 什么是消息队列?
  2. 为什么需要消息队列?
  3. 如何保证消息队列中的消息不重复、不丢失?

5.补充内容

  1. 抽象类和接口的本质区别是什么?

本质区别一般要从设计层面进行回答:
抽象类是自下而上的设计,是对一些类的向上抽象,可以包含方法的具体实现;而接口是自上而下的设计,约束和规范实现类的方法。

  1. static关键字的作用?

对于类中的变量,如果被static修饰,那么该变量就是类变量,其在没有创建对象时就可以使用,该类的所有对象共享该静态变量;
对于类中的方法,如果被static修饰,则在编译阶段就静态绑定该方法,无法访问非静态成员,不允许子类重写;
对于static修饰的类,不能被实例化,一般用来提供一组静态变量和静态成员方法,不需要实例化就可以被访问,以实现一些特定的功能;

  1. 反射机制是?
  1. JavaIO的知识点有哪些?
  1. Abstract修饰的类必须被继承,Abstract修饰的方法必须被重写。
  2. SQL语句limit:单个int数,取个数,比如limit 5;取5条数据;两个int表示范围,比如:limit 2,7;第三个到第九个,共7个。

编程小技巧

  1. 在字符串对比时,为了防止变量为null,可以用"ABC".equals(s);而不是s.equals("ABC");

项目面试问题汇总

  1. 微信红包如何在群红包中设置随机红包?
    a) 二倍均值法,实时产生。
    b) 服务器产生,并存至redis,用的时候取就行了。
    c) 设定规则,比如不能是0,总额一定;个数一定;然后公开了的微信源码是二倍均值法。
  2. 微信红包如何保证随机红包,产生的红包大小都在一个数附近?
    二倍均值法;
    如何实现微信红包功能?
    发5个总额100元的红包。随机数不能是0,避免有0元红包;避免出现一个99.6的情况;
    二倍均值算法;
    此次的金额,在特定范围内抽取:[0.01,(X/Y)*2)范围内随机抽,其中X为当前剩余总金额,Y为剩下红包个数。
    最后一个不用随机抽,剩多少是多少。
    在这里插入图片描述

如何解决并发?

  1. 基于分布式锁解决并发抢红包问题;
  2. 基于红包预分配方式结合Redis无锁原子化操作规避并发争抢;
    红包预分配:提前分配好N个红包,放在队列中,
    如何推到Redis?
  1. 为什么叫Lottery?
    中文“乐透”的对应英文,彩票抽奖。
  2. 如何保证一等奖名额只有一个?(感觉超买超卖问题)
    超买超卖问题,可以通过加锁来实现:
    a) Redis实现分布式锁;
    b) 标N库存,实际库存M(M>N);
  3. Redis是什么?如何保证数据一致性?
    见文章

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1023499.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

DAQ高频量化平台:引领Ai高频量化交易模式变革

近年来,数字货币投资市场掀起了一股热潮,以(BTC)为代表的区块链技术带来了巨大的商业变革。数字资产的特点,如无国界、无阶级、无门槛、高流动性和高透明度,吸引了越来越多的人们的关注和认可,创…

linux内网渗透

一、信息收集 主机发现: nmap -sP 192.168.16.0/24 端口探测 masscan -p 1-65535 192.168.16.168 --rate1000 开放端口如下 nmap端口详细信息获取 nmap -sC -p 8888,3306,888,21,80 -A 192.168.16.168 -oA ddd4-port目录扫描 gobuster dir…

Windows安装GPU版本的pytorch详细教程

文章目录 chatGLM2-6B安装教程正式安装 chatGLM2-6B ChatGLM2-6B版本要装pytorch2.0,而且要2.0.1 ,因此CUDA不能用12.0 ,也不能用10.0,只能用11.x 版本。 安装教程 pip install直接下载安装 官网: https://pytorch.…

Python语言学习实战-内置函数all()和any()的使用(附源码和实现效果)

实现功能 all()和any()函数都是Python的内置函数,用于对布尔值进行操作。 all()函数接受一个可迭代对象作为参数,如果可迭代对象中所有元素都为真值(即非零、非空、非None等),则返回True,否则返回False。…

VR全景需要加盟吗?简述VR全景加盟的意义

对于一个刚开始了解VR全景行业的新人来说,VR全景不是有软件、有设备、会拍摄就行了吗?为什么还要找全景平台进行加盟呢?VR全景加盟的作用又是什么呢?那么,我们就不得不多问几个问题了,例如不加盟的话&#…

企业级数据仓库-理论知识

D3 AM 大数据中间件 Hive:将SQL转化成分布式Map/Reduce进行运算,也支持转换成Spark,需要单独安装Hive集群才能访问Spark,支持60%的SQL,延迟比较大。SparkSQL:属于Spark生态圈,Hive on Sqark。HBase: NoSQL,高并发读,适…

霓虹灯效果

源码&#xff1a; void neon(Mat& src,Mat& dst) {for (int i 1; i < src.rows - 1; i) {for (int j 1; j < src.cols - 1; j){int r1, r2, r3, g1, g2, g3, b1, b2, b3;r1 src.at<Vec3b>(i, j)[2];r2 src.at<Vec3b>(i 1, j)[2];r3 src.at<…

Mac 错误zsh: command not found: brew解决方法

打开iterm或其他shell终端&#xff0c;执行命令&#xff1a; /bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)" 选择下载brew的源&#xff0c;输入1~6任意都行 根据提示输入Y及开机密码 最后执行&#xff1a;source ~/.z…

Jenkins自动化测试

学习 Jenkins 自动化测试的系列文章 Robot Framework 概念Robot Framework 安装Pycharm Robot Framework 环境搭建Robot Framework 介绍Jenkins 自动化测试 1. Robot Framework 概念 Robot Framework是一个基于Python的&#xff0c;可扩展的关键字驱动的自动化测试框架。 它…

应用(Application)部署容器化演进之路

目录 一、应用程序部署痛点 1.1 应用程序部署流程 1.2 应用程序扩缩容 1.3 应用程序多环境部署 二、 计算资源应用演进过程 2.1 使用物理服务器痛点 2.2 使用虚拟机优点与缺点 2.2.1 使用虚拟机优秀点 2.2.2 使用虚拟机缺点 2.3 使用容器的优点与缺点 2.3.1 使用容器…

中国提出FastSAM:在RTX3090上提升了ViT-H E(32×32) 50倍速度

文章目录 1. Abstract2. 背景介绍3. 框架详情 (Methodology)3.1 Overview3.2 All-instance Segmentation3.3 Prompt-guided Selection4. Experiments4.1 Run-time Efficiency Evaluation4.2 Zero-Shot Edge Detection4.2.1 BSDS5004.2.2 Sobel filtering4.2.3 NMS4.3 Zero-Shot…

最优化方法——Matlab实现黄金分割法一维搜索

文章目录 黄金分割法一维搜索原理算法流程&#xff1a; Matlab代码命令行窗口结果打印&#xff1a;《最优化方法》教材上写成表的答案&#xff1a;黄金分割法的一些性质 黄金分割法一维搜索原理 若保留区间为[x1,b],我们得到的结果是一致的. 该方法称为黄金分割法,实际计算取近…

编译工具:CMake(七) | cmake 常用变量和常用环境变量

编译工具&#xff1a;CMake&#xff08;七&#xff09; | cmake 常用变量和常用环境变量 cmake 变量引用方式cmake 自定义变量的方式cmake 常用变量总结 cmake 变量引用方式 cmake使用${}进行变量的引用。 在 IF 等语句中&#xff0c;是直接使用变量名而不通过${}取值 cmake…

京东全店商品采集教程(详解京东店铺所有商品数据采集步骤方法和代码示例)

随着电商行业的快速发展&#xff0c;京东已成为国内的电商平台之一&#xff0c;拥有着海量的商品资源。对于一些需要大量商品数据的商家或者需求方来说&#xff0c;京东全店采集是非常必要的。本文将详细介绍京东全店采集的步骤和技巧&#xff0c;帮助大家更好地完成数据采集任…

基于Spark的K-means快速聚类算法的优化

摘要 1 引言 2 相关研究 2.1 Spark计算框架 2.2 K-means算法 2.3 K-means++算法

Python异步编程高并发执行爬虫采集,用回调函数解析响应

一、问题&#xff1a;当发送API请求&#xff0c;读写数据库任务较重时&#xff0c;程序运行效率急剧下降。 异步技术是Python编程中对提升性能非常重要的一项技术。在实际应用&#xff0c;经常面临对外发送网络请求&#xff0c;调用外部接口&#xff0c;或者不断更新数据库或文…

位深bitdepth是什么

bitdepth bit depth/color depth到底是什么&#xff0c;其对视频有何影响&#xff1f; 数字数据比如数字视频、数字照片等&#xff0c;都是以二进制存储的&#xff0c;那么其一个最小的数据单元就是一位bit&#xff0c;比特位中只有0或1两种值。为了方便处理&#xff0c;把多…

McCabe度量法

概论: McCabe度量法是由 托马斯麦克凯 提出的一种基于程序控制流的复杂性度量方法。又称环路度量&#xff0c;循环复杂度&#xff08;Cyclomatic complexity&#xff09;&#xff0c; 也称为条件复杂度或圈复杂度&#xff0c;是一种软件度量。它认为程序的复杂性很大程度上取决…

《计算机视觉中的多视图几何》笔记(5)

5 Algorithm Evaluation and Error Analysis 本章主要讲述对算法的验证和误差分析。 概述了两种计算这种不确定性&#xff08;协方差&#xff09;的方法。第一个基于线性近似值&#xff0c;涉及串联各种雅各布表达式&#xff0c;第二个是更容易实施蒙特卡洛方法。 文章目录 …

Soft-Serve小巧强大-轻量级Git服务

文章目录 前言一、Soft-Serve官方解释&#xff1a;我的要求 二、使用步骤我的环境公钥、私钥生成安装镜像参数解释&#xff1a; 配置config.yamlconfig 实操创建用户及绑定公钥创建代码仓库及添加合作者之后就是 git 基本操作了 总结 前言 用过 Gitlab, 也挺好用。 遇到几个问…