当前位置: 首页 > news >正文

面向面试知识--Lottery项目

面向面试知识–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是什么?如何保证数据一致性?
    见文章

相关文章:

面向面试知识--Lottery项目

面向面试知识–Lottery项目 1.设计模式 为什么需要设计模式? (设计模式是什么?优点有哪些?) 设计模式是一套经过验证的有效的软件开发指导思想/解决方案;提高代码的可重用性和可维护性;提高团…...

SpringBoot接口中如何直接返回图片数据

SpringBoot接口中如何直接返回图片数据 目录 接口直接返回图片数据 起因 类似这种 根据个人经验 优雅的实现图片返回 接口直接返回图片数据 起因 最近在做涉及到分享推广的业务,需要由业务员分享二维码进入推广页面,由于是新项目,前期…...

c语言进阶部分详解(指针进阶1)

大家好!指针的初阶内容我已经写好,可移步至我的文章:c语言进阶部分详解(指针初阶)_总之就是非常唔姆的博客-CSDN博客 基本内容我便不再赘述,直接带大家进入进阶内容: 目录 一.字符指针 1.讲解…...

计算机竞赛 大数据商城人流数据分析与可视化 - python 大数据分析

0 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 基于大数据的基站数据分析与可视化 该项目较为新颖,适合作为竞赛课题方向,学长非常推荐! 🥇学长这里给一个题目综合评分(每项满分5分) 难度…...

各种电机驱动原理

步进电机 步进电机参考资料 野火官方文档 步进电机驱动原理 上面参考文档中有的内容就不写了,写一下我自己的总结吧。 说明: 电机驱动器输入信号有电机转动方向信号DIR,电机转速信号PWM,电机使能信号EN;电机驱动器…...

人脸图像数据增强

为什么要做数据增强 在计算机视觉相关任务中,数据增强(Data Augmentation)是一种常用的技术,用于扩展训练数据集的多样性。它包括对原始图像进行一系列随机或有规律的变换,以生成新的训练样本。数据增强的主要目的是增…...

Android 查看按键信息的常用命令详解

Android 查看按键信息的常用命令详解 文章目录 Android 查看按键信息的常用命令详解一、主要命令:二、命令详解1、getevent2、getevent -l3、dumsys input4、cat XXX.kl4、cat /dev/input/eventX5、getevent 其他命令6、input keyevent XX 三、简单示例修改四、总结…...

【Java 基础篇】Properties 结合集合类的使用详解

Java 中的 Properties 类是一个常见的用于管理配置信息的工具,它可以被看作是一种键值对的集合。虽然 Properties 通常用于处理配置文件,但它实际上也可以作为通用的 Map 集合来使用。在本文中,我们将详细探讨如何使用 Properties 作为 Map 集…...

数字孪生体标准编程

数字孪生体标准 括ISO TC184/SC4正在制定数字孪生制造标准ISO 23247、ISO/IEC JTC1/AG11正在推动数字孪生体标准、IEEE P2806正在做有关“数字表达”的标准。赢家通吃的标准战 卡尔夏皮罗和哈尔范里安撰写了《信息规则:网络经济战略指南》(Information R…...

力扣 -- 394. 字符串解码

解题方法&#xff1a; 参考代码&#xff1a; class Solution{ public:string decodeString(string s){stack<string> sst;stack<int> dst;//防止字符串栈为空的时候再追加字符串到栈顶元素sst.push("");int n s.size();int i 0;while(i<n)//最好不…...

面试官:什么是虚拟DOM?如何实现一个虚拟DOM?说说你的思路

&#x1f3ac; 岸边的风&#xff1a;个人主页 &#x1f525; 个人专栏 :《 VUE 》 《 javaScript 》 ⛺️ 生活的理想&#xff0c;就是为了理想的生活 ! 目录 一、什么是虚拟DOM 二、为什么需要虚拟DOM 三、如何实现虚拟DOM 小结 一、什么是虚拟DOM 虚拟 DOM &#xff08…...

Ubuntu安装中文拼音输入法

ubuntu安装中文拼音输入法 ubuntu版本为23.04 1、安装中文语言包 首先安装中文输入法必须要让系统支持中文语言&#xff0c;可以在 Language Support 中安装中文语言包。 添加或删除语音选项&#xff0c;添加中文简体&#xff0c;然后会有Applying changes的对话框&#x…...

高端知识竞赛中用到的软件和硬件有哪些

现在单位搞知识竞赛&#xff0c;已不满足于用PPT放题&#xff0c;找几个简单的抢答器、计分牌弄一下了&#xff0c;而是对现场效果和科技感要求更高了。大屏要分主屏侧屏&#xff0c;显示内容要求丰富炫酷&#xff1b;选手和评委也要用到平板等设备&#xff1b;计分要大气些&am…...

Vue 3.3 发布

本文为翻译 原文地址&#xff1a;宣布推出 Vue 3.3 |The Vue Point (vuejs.org) 今天我们很高兴地宣布 Vue 3.3 “Rurouni Kenshin” 的发布&#xff01; 此版本侧重于开发人员体验改进 - 特别是 TypeScript 的 SFC <script setup> 使用。结合 Vue Language Tools&…...

算法|图论 3

LeetCode 130- 被围绕的区域 题目链接&#xff1a;力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 题目描述&#xff1a;给你一个 m x n 的矩阵 board &#xff0c;由若干字符 X 和 O &#xff0c;找到所有被 X 围绕的区域&#xff0c;并将这些区域…...

【数据结构】二叉树的层序遍历(四)

目录 一&#xff0c;层序遍历概念 二&#xff0c;层序遍历的实现 1&#xff0c;层序遍历的实现思路 2&#xff0c;创建队列 Queue.h Queue.c 3&#xff0c;创建二叉树 BTree.h BTree.c 4&#xff0c;层序遍历的实现 一&#xff0c;层序遍历概念 层序遍历&#xff1a;除了先序…...

macOS文件差异比较最佳工具:Beyond Compare 4

Beyond Compare for mac是一款Scooter Software研发的文件同步对比工具。你可以选择针对多字节的文本、文件夹、源代码&#xff0c;甚至是支持比对adobe文件、pdf文件或是整个驱动器&#xff0c;检查其文件大小、名称、日期等信息。你也可以选择使用Beyond Compare合并两个不同…...

Windows+Pycharm 如何创建虚拟环境

当我们开发一个别人的项目的时候,因为项目里有很多特有的包,比如 Pyqt5.我们不想破坏电脑上原来的包版本,这个时候,新建一个虚拟环境,专门针对这个项目就很有必要了. 简略步骤: 1.新建虚拟环境 1.打开 pycharm 终端(Terminal)安装虚拟环境工具: pip install virtualenv2.创…...

vant 按需导入 vue2

vant 按需导入 vue2 1、通过npm安装 # Vue 3 项目&#xff0c;安装最新版 Vant&#xff1a; npm i vant -S# Vue 2 项目&#xff0c;安装 Vant 2&#xff1a; npm i vantlatest-v2 -S2、自动按需引入组件 babel-plugin-import 是一款 babel 插件&#xff0c;它会在编译过程中…...

Java手写分治算法和分治算法应用拓展案例

Java手写分治算法和分治算法应用拓展案例 1. 算法思维导图 以下是用Mermanid代码表示的分治算法的实现原理&#xff1a; #mermaid-svg-nvJwIm97kPHEXQOR {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-nvJwIm97kP…...

【网络】每天掌握一个Linux命令 - iftop

在Linux系统中&#xff0c;iftop是网络管理的得力助手&#xff0c;能实时监控网络流量、连接情况等&#xff0c;帮助排查网络异常。接下来从多方面详细介绍它。 目录 【网络】每天掌握一个Linux命令 - iftop工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景…...

pam_env.so模块配置解析

在PAM&#xff08;Pluggable Authentication Modules&#xff09;配置中&#xff0c; /etc/pam.d/su 文件相关配置含义如下&#xff1a; 配置解析 auth required pam_env.so1. 字段分解 字段值说明模块类型auth认证类模块&#xff0c;负责验证用户身份&am…...

Opencv中的addweighted函数

一.addweighted函数作用 addweighted&#xff08;&#xff09;是OpenCV库中用于图像处理的函数&#xff0c;主要功能是将两个输入图像&#xff08;尺寸和类型相同&#xff09;按照指定的权重进行加权叠加&#xff08;图像融合&#xff09;&#xff0c;并添加一个标量值&#x…...

el-switch文字内置

el-switch文字内置 效果 vue <div style"color:#ffffff;font-size:14px;float:left;margin-bottom:5px;margin-right:5px;">自动加载</div> <el-switch v-model"value" active-color"#3E99FB" inactive-color"#DCDFE6"…...

如何为服务器生成TLS证书

TLS&#xff08;Transport Layer Security&#xff09;证书是确保网络通信安全的重要手段&#xff0c;它通过加密技术保护传输的数据不被窃听和篡改。在服务器上配置TLS证书&#xff0c;可以使用户通过HTTPS协议安全地访问您的网站。本文将详细介绍如何在服务器上生成一个TLS证…...

【单片机期末】单片机系统设计

主要内容&#xff1a;系统状态机&#xff0c;系统时基&#xff0c;系统需求分析&#xff0c;系统构建&#xff0c;系统状态流图 一、题目要求 二、绘制系统状态流图 题目&#xff1a;根据上述描述绘制系统状态流图&#xff0c;注明状态转移条件及方向。 三、利用定时器产生时…...

OpenLayers 分屏对比(地图联动)

注&#xff1a;当前使用的是 ol 5.3.0 版本&#xff0c;天地图使用的key请到天地图官网申请&#xff0c;并替换为自己的key 地图分屏对比在WebGIS开发中是很常见的功能&#xff0c;和卷帘图层不一样的是&#xff0c;分屏对比是在各个地图中添加相同或者不同的图层进行对比查看。…...

【HarmonyOS 5 开发速记】如何获取用户信息(头像/昵称/手机号)

1.获取 authorizationCode&#xff1a; 2.利用 authorizationCode 获取 accessToken&#xff1a;文档中心 3.获取手机&#xff1a;文档中心 4.获取昵称头像&#xff1a;文档中心 首先创建 request 若要获取手机号&#xff0c;scope必填 phone&#xff0c;permissions 必填 …...

代理篇12|深入理解 Vite中的Proxy接口代理配置

在前端开发中,常常会遇到 跨域请求接口 的情况。为了解决这个问题,Vite 和 Webpack 都提供了 proxy 代理功能,用于将本地开发请求转发到后端服务器。 什么是代理(proxy)? 代理是在开发过程中,前端项目通过开发服务器,将指定的请求“转发”到真实的后端服务器,从而绕…...

OPENCV形态学基础之二腐蚀

一.腐蚀的原理 (图1) 数学表达式&#xff1a;dst(x,y) erode(src(x,y)) min(x,y)src(xx,yy) 腐蚀也是图像形态学的基本功能之一&#xff0c;腐蚀跟膨胀属于反向操作&#xff0c;膨胀是把图像图像变大&#xff0c;而腐蚀就是把图像变小。腐蚀后的图像变小变暗淡。 腐蚀…...