面试总结------2024/04/04

1.面试官提问:你说你在项目中使用springsecurity + jwt 实现了登录功能,能简单讲一下怎么实现的吗?

在这里插入图片描述

2.使用RabbitMQ实现订单超时取消功能

在这里插入图片描述

  1. 订单状态定义
    首先,我们需要定义订单的不同状态。在这个示例中,我们可以定义以下订单状态:

    WAITING_FOR_PAYMENT:待支付状态,表示用户已下单但尚未完成支付。
    PAID:支付成功状态,表示用户已成功完成支付。
    CANCELLED:已取消状态,表示订单已被取消。

  2. 发送订单消息到队列
    当用户下单时,我们需要将订单信息发送到RabbitMQ队列中。在发送订单消息时,我们需要设置消息的TTL为30分钟,以便在30分钟后触发超时取消订单的逻辑。

java

@Component
public class OrderProducer {@Autowiredprivate RabbitTemplate rabbitTemplate;public void sendOrderMessage(String orderId) {OrderMessage orderMessage = new OrderMessage();orderMessage.setOrderId(orderId);orderMessage.setStatus(OrderStatus.WAITING_FOR_PAYMENT);rabbitTemplate.convertAndSend("order.exchange", "order.routingKey", orderMessage, message -> {message.getMessageProperties().setExpiration("1800000"); // 设置消息的TTL为30分钟return message;});}
}
  1. 创建订单状态转换的消费者
    创建一个消费者,监听DLX所指定的交换机,并根据订单状态的不同进行相应的处理。在这个示例中,我们将根据订单状态执行不同的逻辑,如果订单在30分钟内未支付,则执行取消订单的操作。

java

@Component
public class OrderConsumer {@RabbitListener(queues = "order.dead-letter.queue")public void processExpiredOrder(OrderMessage orderMessage) {if (orderMessage.getStatus() == OrderStatus.WAITING_FOR_PAYMENT) {// 30分钟后未支付,取消订单cancelOrder(orderMessage.getOrderId());}}private void cancelOrder(String orderId) {// 执行取消订单的逻辑System.out.println("Canceling order: " + orderId);// 更新订单状态为已取消// orderService.cancelOrder(orderId);}
}
  1. 配置RabbitMQ
    在RabbitMQ中,我们需要创建一个交换机、一个队列和一个DLX(死信交换机),并将队列绑定到DLX上。同时,我们也需要设置DLX的路由键,以便将超时的订单消息发送到DLX中。

java

@Configuration
public class RabbitMQConfig {@Beanpublic DirectExchange orderExchange() {return new DirectExchange("order.exchange");}@Beanpublic Queue orderQueue() {return QueueBuilder.durable("order.queue").withArgument("x-dead-letter-exchange", "order.dead-letter.exchange").withArgument("x-dead-letter-routing-key", "order.dead-letter.routing-key").build();}@Beanpublic DirectExchange orderDeadLetterExchange() {return new DirectExchange("order.dead-letter.exchange");}@Beanpublic Queue orderDeadLetterQueue() {return new Queue("order.dead-letter.queue");}@Beanpublic Binding bindingOrder() {return BindingBuilder.bind(orderQueue()).to(orderExchange()).with("order.routingKey");}@Beanpublic Binding bindingOrderDeadLetter() {return BindingBuilder.bind(orderDeadLetterQueue()).to(orderDeadLetterExchange()).with("order.dead-letter.routing-key");}
}

在以上配置中,我们定义了一个名为order.exchange的直连交换机,以及一个名为order.queue的队列。我们还定义了一个DLX,名为order.dead-letter.exchange,并将队列order.queue绑定到DLX上。当订单消息在30分钟内未被消费时,将会被发送到DLX中。
在这里插入图片描述

3.使用Redis+Lua脚本实现秒杀功能,后期用了Redisson锁进行优化处理。

在这里插入图片描述

public class SeckillService {private final RedissonClient redissonClient;private final String luaScript;public SeckillService(RedissonClient redissonClient) {this.redissonClient = redissonClient;// 加载Lua脚本this.luaScript = "local count = redis.call('get', KEYS[1])\n" +"if tonumber(count) >= tonumber(ARGV[1]) then\n" +"    redis.call('decrby', KEYS[1], ARGV[1])\n" +"    return 1\n" +"else\n" +"    return 0\n" +"end";}public boolean seckill(String productId, int quantity) {RLock lock = redissonClient.getLock(productId);try {// 加锁lock.lock();// 执行Lua脚本RScript script = redissonClient.getScript();List<Object> result = script.eval(RScript.Mode.READ_WRITE, luaScript, RScript.ReturnType.INTEGER, Collections.singletonList(productId), String.valueOf(quantity));// Lua脚本返回值为1表示秒杀成功,0表示库存不足return result != null && result.size() > 0 && (int) result.get(0) == 1;} finally {// 释放锁lock.unlock();}}
}

构造方法初始化了SeckillService对象,并加载了Lua脚本。

luaScript:这个Lua脚本从Redis获取指定商品的库存数量,如果库存充足,则减少库存数量,并返回1表示秒杀成功;如果库存不足,则返回0表示秒杀失败。

方法:seckill

这个方法用于执行秒杀操作。

public boolean seckill(String productId, int quantity) {RLock lock = redissonClient.getLock(productId);try {// 加锁lock.lock();// 执行Lua脚本RScript script = redissonClient.getScript();List<Object> result = script.eval(RScript.Mode.READ_WRITE, luaScript, RScript.ReturnType.INTEGER, Collections.singletonList(productId), String.valueOf(quantity));// Lua脚本返回值为1表示秒杀成功,0表示库存不足return result != null && result.size() > 0 && (int) result.get(0) == 1;} finally {// 释放锁lock.unlock();}
}

方法步骤:
获取分布式锁:使用redissonClient.getLock(productId)获取商品ID对应的分布式锁。
加锁:使用lock.lock()方法加锁,确保秒杀操作的原子性。
执行Lua脚本:使用RScript执行预先加载的Lua脚本,该脚本会检查商品库存是否充足,并进行库存减少操作。
解析Lua脚本返回值:根据Lua脚本的返回值判断秒杀操作是否成功。返回值为1表示秒杀成功,返回值为0表示库存不足。
释放锁:使用lock.unlock()释放锁。
在这里插入图片描述

4.使用elasticsearch来检索系统日志。

在这里插入图片描述

5.使用Redis十大类型实现点赞,搜索附近店铺,签到,统计用户量等功能。

5.1Redis十大类型实现点赞

在这里插入图片描述

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

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

相关文章

实验一 Windows 2008虚拟机安装、安装VM Tools、快照和链接克隆、添加硬盘修改格式为GPT

一、安装vmware workstation软件 VMware workstation的安装介质&#xff0c;获取路径&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1AUAw_--yjZAUPbsR7StOJQ 提取码&#xff1a;umz1 所在目录&#xff1a;\vmware\VMware workstation 15.1.0 1.找到百度网盘中vmwa…

分布式限流——Redis实现令牌桶算法

令牌桶算法 令牌桶算法&#xff08;Token Bucket Algorithm&#xff09;是一种广泛使用的流量控制&#xff08;流量整形&#xff09;和速率限制算法。这个算法能够控制网络数据的传输速率&#xff0c;确保数据传输的平滑性&#xff0c;防止网络拥堵&#xff0c;同时也被应用于…

Pandas Dataframe合并连接Join和merge 参数讲解

文章目录 函数与参数分析otheronhowlsuffix, rsuffix, suffixesleft_index, right_index 函数与参数分析 在pandas中主要有两个函数可以完成table之间的join Join的函数如下&#xff1a; DataFrame.join(other, onNone, how‘left’, lsuffix‘’, rsuffix‘’, sortFalse, v…

YOLOv8 UI界面设计+热力图显示

进入可视化设计界面&#xff0c;设计UI pyside6-designer 设计好UI保存&#xff0c;然后通过以下命令将ui文件保存为py pyside6-uic myui.ui > myui.py 通过以下命令将资源文件qrc保存为py pyside6-rcc my_rc.qrc > my_rc.py 写主窗口函数实现功能... 项目基于yol…

基于Spring Boot的职称评审管理系统

基于Spring Boot的职称评审管理系统 开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/idea 部分系统展示 前台首页界面 用户注册登录界面 管理员登录界面 个人中心界面…

python - Django创建项目

项目运行命令 根目录下运行命令:   python manage.py runserver win环境创建项目 直接使用 Pycharm 创建项目 在 cmd 或 Linux 命令行环境下创建 Django 项目 django-admin startproject mysite 这样就会在当前目录下创建一个叫做 mysite 的Django项目。   可以看到Djang…

Driver not loaded之记录Qt访问MySql的解决经历

对于这个问题的本质原因&#xff0c;我也搞不明白&#xff0c;所以记录的方法不一定对所有人行之有效。我的目的很简单&#xff0c;就是把数据库用起来&#xff0c;经过查找网上资料&#xff0c;最终把数据库跑起来了。因此记录如下&#xff1a; 1&#xff0c;出现这个问题是缺…

【Go】十六、文件操作

文章目录 1、打开和关闭文件2、IO3、一次性读文件4、带缓冲区的读文件5、写入文件6、文件复制 1、打开和关闭文件 package main import("fmt""os" ) func main(){//打开文件&#xff1a;file,err : os.Open("d:/Test.txt");if err ! nil {//出错…

Qt之Timers

Qt 中的 Timers&#xff08;定时器&#xff09;是一种非常有用的工具&#xff0c;它允许我们在指定的时间间隔后执行特定的代码。这在许多应用中都非常常见&#xff0c;例如定时更新界面、执行后台任务或触发特定的事件。 在 Qt 中&#xff0c;我们可以使用 QTimer 类来创建和…

【医学影像数据处理】nii 数据格式文件操作汇总

大部分医学领域数据存储的都是dicom格式&#xff0c;但是对于CT等一类的序号图像&#xff0c;就需要多个dicom文件独立存储&#xff0c;最终构成一个序列series&#xff0c;这样存储就太过于复杂了。 nifti&#xff08;Neuroimaging Informatics Technology Initiative&#x…

GT收发器64B66B协议(2)自定义PHY设计

文章目录 前言一、设计框图二、GT_module三、PHY_module3.1、PHY_tx模块3.2、PHY_rx_bitsync模块3.3、PHY_rx模块 四、上板测试 前言 有了对64B66B协议的认识以及我们之前设计8B10B自定义PHY的经验&#xff0c;本文开始对64B66B自定义PHY的设计 一、设计框图 二、GT_module …

蓝桥杯单片机速成8-NE555频率测量

一、原理图 NOTE&#xff1a;使用NE555测量频率之前&#xff0c;需要将J3-15(SIGNAL)与J3-16(P34短接) 在使用矩阵键盘的时候也记得把跳冒拔下&#xff0c;因为有公共引脚P34 又是因为他的输出引脚是P34&#xff0c;所以只能用定时器0来作为计数器进行频率测量了 二、代码实现 …

CSS设置网页背景

目录 概述&#xff1a; 1.background-color: 2.background-image&#xff1a; 3.background-repeat&#xff1a; 4.background-position&#xff1a; 5.background-attachment&#xff1a; 6.background-size&#xff1a; 7.background-origin&#xff1a; 8.background-…

【Python BUG】局域网内远程连接mysql错误:1130

本质是用户权限的问题 到该数据库所在的服务器上。 1&#xff1a;root登录 mysql -u root -p 2&#xff1a;选择库 mysql>use mysql; 3&#xff1a;查看mysql库中的user表的host值 mysql>select ‘host’ from user where user‘root’; 4&#xff1a;修改mysql库中的u…

ss524 硬件板,SD卡插拔时串口没有反应的问题定位

目录 SD卡无法识别问题定位 设备树确认mmc1 启用 驱动文件 sdhci-ss524v100.c 寄存器以及值的定义 probe函数匹配 通过函数的层层打印&#xff0c;sd卡寄存器读取出来时没有插上的状态 SD卡无法识别问题定位 硬件平台&#xff1a;ss524处理器&#xff0c; 内核版本:4.19…

Next js:点击登录显示登录表单,点击注册显示注册表单的功能

Next js&#xff1a;点击登录显示登录表单&#xff0c;点击注册显示注册表单的功能 在Next.js中实现点击登录显示登录表单&#xff0c;点击注册显示注册表单的功能&#xff0c;你可以使用React的状态管理来控制显示哪个表单。这里是一个简单的示例&#xff0c;展示了如何根据用…

Linux初学(十四)LampLnmp

一、简介 LAMP和LNMP是两种常见的web服务器组合。具体如下&#xff1a; LAMP&#xff1a;LAMP代表的是Linux&#xff08;操作系统&#xff09; Apache&#xff08;HTTP服务器&#xff09; MySQL&#xff08;数据库&#xff09; PHP&#xff08;编程语言&#xff09;。这个组合被…

vue2与vue3相比哪个更好

vue2与vue3相比哪个更好 2是选项式api&#xff0c;3是组合式api 2的话数据如果是响应式的话需要定义在data里面 3的话因为要return出去所以需要进行定义const&#xff0c;借助ref&#xff08;&#xff09;或者reactive&#xff08;&#xff09;进行响应式数据切换 对于小型的…

C++利用键值对计算某一个数对应的最值及其索引位置

目录 一、算法概述二、代码实现1、计算最值2、计算最值及其索引 三、结果展示 本文由CSDN点云侠原创&#xff0c;原文链接。如果你不是在点云侠的博客中看到该文章&#xff0c;那么此处便是不要脸的爬虫与GPT。 一、算法概述 类似下图所示&#xff0c;计算第一列中1或2对应的最…

线段树练习

1.单点修改区间查询 P3374 【模板】树状数组 1 题目描述 如题&#xff0c;已知一个数列&#xff0c;你需要进行下面两种操作&#xff1a; 将某一个数加上 x 求出某区间每一个数的和 输入格式 第一行包含两个正整数 n,m&#xff0c;分别表示该数列数字的个数和操作的总个…