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

苍穹外卖面试题

8. 如何理解分组校验
很多情况下,我们会将校验规则写到实体类中的属性上,而这个实体类有可能作为不同功能方法的参数使用,而不同的功能对象参数对象中属性的要求是不一样的。比如我们在新增和修改一个用户对象时,都会接收User对象作为请求参数,但是新增要求对象的id为空,而修改则要求id字段不能为空。这个时候就需要使用到分组校验了
分组校验其实就是定义多套校验规则,对于指定的功能,我们按照要求指定它使用哪套规则即可
9. Redis中有哪些数据类型
Redis是一个基于内存的键值对数据库,它的键都是字符串类型,而值的部分支持5种数据类型,每种类型特点不一样

string:字符串类型,可以存储普通字符串、JSON字符串,也可以存储对象系列化之后的字符串
hash:哈希类型,类似于Java中的HashMap,比较适合存储对象
list:列表类型,底层是一个顺序链表,可以从两端添加或移除元素,元素是有序的,可重复的
set:无序集合,没有重复元素
zset:有序集合,没有重复元素,且集合中每个元素关联一个分数,可以根据分数进行排序
10. Redis在项目中的应用
我们项目中有两处地方用到了Redis,分别是:店铺营业状态标识和小程序端的套餐、菜品列表数据

店铺营业状态标识,仅仅需要在redis中保存一个0|1值即可。这里之所以选择redis,有两个原因

而没有采用数据库来存储,就是因为这个字段太简单了,没有必要在数据库中新建一张表

这个状态访问比较频繁,放在redis中,提高了查询速度的同时,可以减轻数据库的访问压力

小程序端的套餐、菜品列表数据,由于小程序端以后的访问量比较大,所以采用Redis提高访问速度

具体的操作步骤就是:在查询列表的时候,先判断Redis缓存中是否有数据,如果有,直接返回给前端

如果没有,再去查询数据库,并将查询结果保存到redis中的同时,再返回给前端

为了保证Redis和数据库中数据的实时一致性,在对数据库相关数据进行增删改操作时,需要同时清理Redis中数据

11. SpringCache在项目中的应用
SpringCache是Spring提供的一个缓存框架,它可以通过简单的注解实现缓存的操作,我们常用的注解有下面几个:

@EnableCaching: 开启基于注解的缓存

@CachePut: 一般用在查询方法上,表示将方法的返回值放到缓存中

@Cacheable: 一般用在查询方法上,表示在方法执行前先查看缓存中是否有数据,如果有直接返回;如果没有,再调用方法体查询数据并将返回结果放到缓存中;他有两个关键属性:

value: 缓存的名称,每个缓存名称下面可以有多个key

key: 缓存的key,支持Spring的表达式语言SPEL语法

@CacheEvict: 一般用在增删改方法上 ,用于清理指定缓存,可以根据key清理,也可以清理整个value下的缓存

SpringCache还有一个有点,就是可以随意切换底层的缓存软件,比如:Redis、内存等等

本项目中菜品和套餐列表的缓存用到了SpringCache

12. 微信支付流程
整个微信支付流程涉及到三个角色:微信小程序、服务端、微信平台

首先,由小程序发起下单请求到服务端,服务端生成订单保存到数据库后,将订单号返给前端
然后,小程序会向服务端发起支付请求,这个请求中会携带着订单号
服务端根据订单号查询到订单信息后,开始调用微信下单接口从微信平台获取预支付交易标识
服务端需要将预支付交易标识进行签名之后组装成支付参数,回传给小程序,小程序就会弹出支付窗口
用户通过小程序向微信平台付款,并可以获取到支付结果,进行显示
微信平台还会将订单支付结果推送给我们的后台程序,后台程序需要修改订单状态
13. SpringTask在项目中的应用
SpringTask是Spring框架提供的一种任务调度工具,用来按照定义的时间格式执行某段代码。

它的一个关键注解是@Scheduled,此注解标注在方法上,用于设置方法的调用时机,它支持下面一些属性:

fixedDelay:上一次任务完成后多久执行下一次任务
fixedRate:上一次任务开始后多久执行下一次任务(注意:任务不能有重叠)
initialDelay:第一次任务延迟多久执行
cron:通过cron表达式控制任务执行时间
在我们的项目中,超时订单的状态改变用到了SpringTask,比如:

每隔1分钟检查是否有超过15分钟未支付的订单,如果有就将订单取消
每天凌晨1点检查前一天是否有派送中的订单,如果有将订单状态改成已完成
14. cron表达式
cron表达式其实就是一个字符串,通过cron表达式可以定义任务的触发时间

SpringTask支持的cron表达式分为6个域,由空格分隔开,每个域代表一个含义:秒 分 时 日 月 周

每个域都支持精准数值的写法,也支持一些具有特殊意义的字符,主要的有下面这些:

*:表示任意

?:表示忽略,只能用在日和周两个域

-:表示区间,

/:表示起始时间开始触发,然后每隔固定时间触发一次

,:表示列出枚举值,例如在分域使用5,20则意味着在5和20分触发一次

#: 用于确定每个月第几个星期几

15. WebSocket对比HTTP
HTTP的通信是单向的,要先请求后响应,类似于对讲机

WebSocket的通信双向的、实时的,客户端和服务端可以同时发消息,类似于手机通话

我们在项目中大部分场景下都是使用HTTP协议,只有在高实时场景下,建议使用WebSocket

项目在向商家提醒接单时,用户催单发送提醒时使用了webSocket

16. Excel有哪些技术方案
Excel技术方案有:ApachePOI和EasyExcel等,EasyExcel是在POI的基础上进行二次开发的

POI的封装度较低,使用时需要写大量的代码,并且性能也比较低,同时它是对文档一次性导入,容易导致内存溢出

EasyExcel的封装度比较高,使用起来比较方便,而且它是一条条导入数据,不会导致内存溢出

在实际开发中,更倾向于使用稳定性更好的方案,所以一般选择EasyExcel作为Excel的导入导出技术方案

http://www.lryc.cn/news/298125.html

相关文章:

  • 【Qt 学习之路】在 Qt 使用 ZeroMQ
  • CI/CD到底是啥?持续集成/持续部署概念解释
  • golang常用库之-disintegration/imaging图片操作(生成缩略图)
  • CSS 控制 video 标签的控制栏组件的显隐
  • 数据可视化之维恩图 Venn diagram
  • 2024刘谦春晚第二个扑克牌魔术
  • 【k8s系列】(202402) 证书apiserver_client_certificate_expiration_seconds
  • Rust变量与常量介绍
  • Flask基础学习2
  • 文章页的上下篇功能是否有必要?boke112百科取消上下篇功能
  • Lua序列化
  • Acwing---839. 模拟堆
  • STM32 STD/HAL库驱动W25Q64模块读写字库数据+OLED0.96显示例程
  • Android 移动应用开发 创建第一个Android项目
  • MATLAB语音去噪系统
  • 小程序-上传图片功能
  • alist基本用法@文档阅读@挂载网盘@网盘webdav挂载
  • Hive正则表达式
  • ubuntu20.04-编译安装Qt5.15.2-C++
  • 【PTA|期末复习|编程题】数组相关编程题(二)
  • 重温阿里云宝塔面板部署前后端项目
  • 6个好看的wordpress模板
  • 零基础学python之高级编程(1)---面向对象编程及其类的创建
  • [C# WPF] DataGrid选中行或选中单元格的背景和字体颜色修改
  • 单片机学习笔记---串口通信(1)
  • 熔断机制解析:如何用Hystrix保障微服务的稳定性
  • 第三节 zookeeper基础应用与实战2
  • C# Socket通信从入门到精通(21)——Tcp客户端判断与服务器断开连接的三种方法以及C#代码实现
  • vulnhub-->hacksudo-Thor靶机详细思路
  • Java外卖小程序管理系统