面试总结------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.rhkb.cn/news/297445.html

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

相关文章

Unity:2D SpriteShape

1.1 简介 Sprite Shape 可以很灵活的更改sprite的轮廓。比如&#xff1a; 它由两部分组成&#xff1a;Sprite Shape Profile、Sprite Shape Controller&#xff0c;需要导入2D Sprite Shape Package. 1.1.1 Sprite导入要求 Texture Type - ‘Sprite (2D and UI)’.Sprite Mo…

面试题:MySQL 高可用

&#x1f496; 主从同步 原理 核心&#xff1a;二进制日志 binlog 是 MySQL 的日志&#xff0c;redolog 和 undolog 是 innodo 引擎的日志。 &#x1f496; 分库分表 分类 问题和技术 数据一致性问题 使用分布式事务管理组件&#xff0c;如ShardingSphere的分布式事务功能&…

目标检测——监控下的汽车

一、重要性及意义 首先&#xff0c;车辆检测技术是保证视频监控系统正常运行的基础。通过监控摄像头实时获取的图像&#xff0c;可以自动检测出图像中的车辆&#xff0c;并进行车辆类型的分类和识别。这对于优化城市交通管理、实现智能交通系统具有重要意义。此外&#xff0c;…

通用分布式锁组件

通用分布式锁组件 1 Redisson1.1介绍1.2 为什么要使用Redisson实现分布式锁1.2.1 锁续期的问题1.2.2 获取锁尝试的问题1.2.3 可重入问题 1.3 Wath Dog的自动延期机制1.4 快速了解1.5 项目集成 2 定义通用分布式锁组件2.1 实现思路分析2.2 定义注解2.3 定义切面2.4 使用锁2.5.工…

Macbook文件清理软件 Mac电脑清理垃圾文件怎么清理

为了维护Macbook电脑的系统健康&#xff0c;我们需要定期给电脑进行全面清理&#xff0c;清除系统垃圾文件、软件缓存和系统内存。那么好用的Macbook文件清理软件有哪些呢&#xff1f;今天就给大家介绍几款好用的电脑清理软件并介绍Mac电脑清理垃圾文件怎么清理。 一、Macbook…

代码审计-PHP原生开发篇SQL注入数据库监控正则搜索文件定位静态分析

文章目录 前言1、Bluecms-CNVD-1Day-常规注入审计分析2、emlog-CNVD-1Day-常规注入审计分析3、emlog-CNVD-1Day-2次注入审计分析 前言 挖掘技巧&#xff1a; -语句监控-数据库SQL监控排查可利用语句定向分析 -功能追踪-功能点文件SQL执行代码函数调用链追踪 -正则搜索-(update…

[C#]OpenCvSharp实现直方图均衡化全局直方图局部直方图自适应直方图

【什么是直方图均衡化】 直方图均衡化是一种简单而有效的图像处理技术&#xff0c;它旨在改善图像的视觉效果&#xff0c;使图像变得更加清晰和对比度更高。其核心原理是将原始图像的灰度直方图从可能较为集中的某个灰度区间转变为在全部灰度范围内的均匀分布。通过这种方法&a…

提升工作效率:B端工作台设计基础详解

随着互联网和信息技术的快速发展&#xff0c;越来越多的企业开始以数字化、智能化的方式管理和运营自己的业务。B端工作台设计作为企业应用的重要组成部分&#xff0c;越来越受到重视。本文将从三个方面对B端工作台设计进行全面分析。让我们看看。 1. B端工作台设计原则 B端工…

JVM剖析

0.前言 Java 是当今世界使用最广泛的技术平台之一。使用 Java 或 JVM 的一些技术包括&#xff1a; Apache spark用于大数据处理&#xff0c;数据分析在JVM上运行;用于数据流的Apache NiFi在内部使用的也是 JVM;现代 Web 和移动应用程序开发中使用的React native使用 的也包含…

【C++ STL迭代器】iterator

文章目录 【 1. 迭代器的属性 】【 2. 不同容器支持的迭代器 】【 3. 迭代器的定义方式 】【 4. 实例 】4.1 定义方式&#xff1a;正向迭代器和反向迭代器4.2 迭代器属性&#xff1a;前向迭代、双向迭代、随机迭代4.2 迭代器的遍历方法4.3 auto关键字 自动指定迭代器定义类型 背…

GitHub git push超过100MB大文件失败(write error: Broken pipe)完美解决

问题 在使用git push推送大文件&#xff08;超过了100MB&#xff09;到GitHub远程仓库时提示异常&#xff0c;异常信息如下&#xff1a; fatal: sha1 file <stdout> write error: Broken pipe fatal: the remote end hung up unexpectedly 通过查阅了一些资料&#xff0c…

vscode开发ESP32问题记录

vscode 开发ESP32问题记录 1. 解决vscode中的波浪线警告 1. 解决vscode中的波浪线警告 参考链接&#xff1a;https://blog.csdn.net/fucingman/article/details/134404485 首先可以通过vscode 中的IDF插件生成模板工程&#xff0c;这样会自动创建.vscode文件夹中的一些json配…

【简单讲解下Tauri】

&#x1f308;个人主页:程序员不想敲代码啊 &#x1f3c6;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f44d;点赞⭐评论⭐收藏 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共…

深入解析:链游、DApp、公链、NFT与交易所开发的全景图

随着数字货币和区块链技术的迅速发展&#xff0c;链游开发、DApp开发、公链开发、NFT开发以及交易所开发等领域吸引了越来越多的关注。本文将以3000字的篇幅&#xff0c;对这些领域进行详细解析&#xff0c;探讨它们的意义、应用场景以及未来发展趋势。 链游开发&#xff08;Bl…

k8s部署微服务例子

一、部署服务 需要部署minio、nacos、mysql、consul、elasticsearch、视频解析服务、nfs、skywalking-oap及ui。 二、三个微服务程序 minio服务解析视频-》上传到minio进行存储&#xff0c;构造领域对象信息保存到hive&#xff08;hive on spark&#xff09;异步处理-》元数据…

论文阅读:Walk These Ways: 通过行为多样性调整机器人控制以实现泛化

Walk These Ways: 通过行为多样性调整机器人控制以实现泛化 摘要&#xff1a; 通过学习得到的运动策略可以迅速适应与训练期间经历的类似环境&#xff0c;但在面对分布外测试环境失败时缺乏快速调整的机制。这就需要一个缓慢且迭代的奖励和环境重新设计周期来在新任务上达成良…

(三)LTspice学习交流分析

文章目录 前言一、Edit simulation cmd二、添加激励总结 前言 上一节我们学习了LTspice的安装&#xff0c;很简单&#xff0c;无脑安装 &#xff08;一&#xff09;LTspice简介 &#xff08;二&#xff09;LTspice学习之简介2 今天我们来学习一下LTspice另一个非常重要的仿真功…

动态多目标优化:进化动态约束多目标优化测试集DCP1-DCP9的TruePF(提供MATLAB代码)

一、Evolutionary Dynamic Constrained Multiobjective Optimization Test Suite 以最小化为例,带约束的动态多目标优化问题&#xff08;Evolutionary Dynamic Constrained Multiobjective Optimization &#xff09;的数学描述如下: min ⁡ x ∈ S ( t ) ⊂ R n f ( x , t ) …

微信小程序python+uniapp高校图书馆图书借阅管理系统ljr9i

根据日常实际需要&#xff0c;一方面需要在系统中实现基础信息的管理&#xff0c;同时还需要结合实际情况的需要&#xff0c;提供图书信息管理功能&#xff0c;方便图书管理工作的展开&#xff0c;综合考虑&#xff0c;本套系统应该满足如下要求&#xff1a; 首先&#xff0c;在…

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

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