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

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

在这里插入图片描述

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

redis实现的劣势
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

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

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

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

java

@Component
public class OrderProducer {

    @Autowired
    private 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 {

    @Bean
    public DirectExchange orderExchange() {
        return new DirectExchange("order.exchange");
    }

    @Bean
    public 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();
    }

    @Bean
    public DirectExchange orderDeadLetterExchange() {
        return new DirectExchange("order.dead-letter.exchange");
    }

    @Bean
    public Queue orderDeadLetterQueue() {
        return new Queue("order.dead-letter.queue");
    }

    @Bean
    public Binding bindingOrder() {
        return BindingBuilder.bind(orderQueue())
                .to(orderExchange())
                .with("order.routingKey");
    }

    @Bean
    public 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实现点赞


在这里插入图片描述

5.2搜索附近店铺

使用GEO
在这里插入图片描述

5.3签到

原文来源

在这里插入图片描述
在这里插入图片描述

5.4统计用户量

在这里插入图片描述

在这里插入图片描述

6.文件断点续传

在这里插入图片描述

6.1请说明记录已上传的分片这部分怎么实现?

在这里插入图片描述

SELECT chunk_number 
FROM uploaded_chunks
WHERE file_id = 'file123' 
ORDER BY chunk_number DESC LIMIT 1;

这条查询语句会返回文件 ‘file123’ 最新上传的分片序号。

4.删除已上传的分片:
当文件上传完成后,可以根据需要删除已上传的分片信息。可以使用如下 SQL 删除语句:


DELETE FROM uploaded_chunks WHERE file_id = 'file123';

这条删除语句会删除文件 ‘file123’ 的所有已上传分片信息。

6.2那这种断点续传的方式会有数据丢失的问题吗?

在这里插入图片描述

如果出现网络故障,那么我们如何保证数据不丢失

在这里插入图片描述
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ruoyi-vue-pro 前端vue js直接import导入本地文件使用方法

我的xml文件名称叫w2101.xml 第一步&#xff0c;删除所有依赖&#xff0c;否则配置以后就会启动报错&#xff1a; 第二步配置对应的文件格式&#xff0c;我当前使用的是xml文件 config.module.rule(xml).test(/\.xml$/).use(xml-loader).loader(xml-loader).end();第三步…

3D桌面端可视化引擎HOOPS Visualize如何实现3D应用快速开发?

HOOPS Visualize是一个开发平台&#xff0c;可实现高性能、跨平台3D工程应用程序的快速开发。一些主要功能包括&#xff1a; 高性能、以工程为中心的可视化&#xff0c;使用高度优化的OpenGL或DirectX驱动程序来充分利用可用的图形硬件线程安全的C和C#接口&#xff0c;内部利用…

计算机毕业设计选题之基于SSM的旅游管理系统【源码+PPT+文档+包运行成功+部署讲解】

&#x1f493;项目咨询获取源码联系v&#x1f493;xiaowan1860&#x1f493; &#x1f6a9;如何选题&#xff1f;&#x1f351; 对于项目设计中如何选题、让题目的难度在可控范围&#xff0c;以及如何在选题过程以及整个毕设过程中如何与老师沟通&#xff0c;有疑问不清晰的可…

企业如何选择合适自己的ERP系统?ERP系统应该具有哪些功能和特点?

企业如何选择合适自己的ERP系统&#xff1f;ERP系统应该具有哪些功能和特点&#xff1f; ERP作为一款功能如此众多、对企业如此重要的系统&#xff0c;可能会开源免费吗&#xff1f; 如果有这样一款功能全面又完全开源的ERP&#xff0c;早就爆火了&#xff0c;市面上可能还出…

easyocr

刚刚还想更新之前使用的paddleocr&#xff0c;但是发现他的whl文件网站崩了&#xff0c;估计就是最近的事&#xff0c;因为网上所有主流的讲解paddleocr的都用的同一个网站&#xff0c;没办法我顺便也试试github上有没有其他效果稍好的ocr吧 easyocr EasyOCR传送门 这个下载…

文心一言指令词宝典之自媒体篇

作者&#xff1a;哈哥撩编程&#xff08;视频号、抖音、公众号同名&#xff09; 新星计划全栈领域优秀创作者博客专家全国博客之星第四名超级个体COC上海社区主理人特约讲师谷歌亚马逊演讲嘉宾科技博主极星会首批签约作者 &#x1f3c6; 推荐专栏&#xff1a; &#x1f3c5;…

openGauss学习笔记-257 openGauss性能调优-使用Plan Hint进行调优-Custom Plan和Generic Plan选择的Hint

文章目录 openGauss学习笔记-257 openGauss性能调优-使用Plan Hint进行调优-Custom Plan和Generic Plan选择的Hint257.1 功能描述257.2 语法格式257.3 示例 openGauss学习笔记-257 openGauss性能调优-使用Plan Hint进行调优-Custom Plan和Generic Plan选择的Hint 257.1 功能描…

X年后,ChatGPT会替代底层程序员吗?

能不能替代&#xff0c;真的很难说&#xff0c;因为机器换掉人&#xff0c;这其实是一个伦理问题。 其实说白了&#xff0c;任何行业在未来都会被AI或多或少的冲击到&#xff0c;因为ChatGPT做为一个可以持续提升智能的AI&#xff0c;在某些方面的智能程度超过人类并不是什么难…

分闸合闸、电源监视综合装置 HJZZ-91 DC220V 导轨安装Josef约瑟

系列型号&#xff1a; HJZZ-91分闸、合闸、电源监视综合装置&#xff1b; HJZZ-92/1分闸、合闸、电源监视综合装置&#xff1b; HJZZ-92/2分闸、合闸、电源监视综合装置&#xff1b; HJZZ-92/2A分闸、合闸、电源监视综合装置&#xff1b; HJZZ-92/3分闸、合闸、电源监视综合装置…

内网穿透FRPNPSSPPNgrok

目录 穿透上线 FRP&NPS&SPP&Ngrok Ngrok上线 frp上线 nps上线 spp特殊协议上线 穿透上线 FRP&NPS&SPP&Ngrok 主要目的是&#xff1a;实现在自己内网攻击机&#xff0c;去攻击另一个内网的靶机 让一个内网靶机主动连接我们的内网攻击机 Ngrok上线…

分治思想排序(快速排序、归并排序)

分治&#xff1a;分而治之&#xff0c;即把一个复杂的问题分成两个或更多的相同或相似的子问题&#xff0c;再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解&#xff0c;原问题的解即子问题的解的合并 优点&#xff1a; 降低时间复杂度&#xff1a;分治法可…

vscode教程

个人笔记&#xff08;整理不易&#xff0c;有帮助点个赞&#xff09; 笔记目录&#xff1a;学习笔记目录_pytest和unittest、airtest_weixin_42717928的博客-CSDN博客 个人随笔&#xff1a;工作总结随笔_8、以前工作中都接触过哪些类型的测试文档-CSDN博客 目录 一&#xff1a…

回合制游戏战斗模块的制作

回合制游戏战斗模块的制作 回合制游戏相信大家没玩过也见过&#xff0c;了解它的玩法。回合制&#xff0c;那就是你来我回的&#xff0c;你一回合我一回合&#xff0c;直到把对方打败。市面上的回合制游戏比较经典的有梦幻西游&#xff0c;问道&#xff0c;神武&#xff0c;完…

基于Springboot的航班进出港管理系统(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的航班进出港管理系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结…

ThinkPHP审计(2) Thinkphp反序列化链5.1.X原理分析从0编写POC

ThinkPHP审计(2) Thinkphp反序列化链子5.1.X原理分析&从0编写POC 文章目录 ThinkPHP审计(2) Thinkphp反序列化链子5.1.X原理分析&从0编写POC动态调试环境配置Thinkphp反序列化链5.1.X原理分析一.实现任意文件删除二.实现任意命令执行真正的难点 Thinkphp反序列化链5.1.…

探索 2024 年徽标制作的最佳定制 GPT

智能徽标设计革命&#xff1a;探索最佳定制GPT工具 介绍 在快速发展的数字设计世界中&#xff0c;随着定制生成预训练 Transformer (GPT) 的出现&#xff0c;徽标的创建取得了重大飞跃。 这些先进的人工智能工具彻底改变了设计师设计徽标的方式&#xff0c;提供了前所未有的创造…

HCIA-Datacom H12-811 题库补充(4/7)

完整题库及答案解析&#xff0c;请直接扫描上方二维码&#xff0c;持续更新中 共享介质型网络使用哪一种技术进行数据转发&#xff1f; A&#xff1a;CDMA/CD B&#xff1a;CSMA/AC C&#xff1a;TDMA/CD D&#xff1a;CSMA/CD 答案&#xff1a;D 解析&#xff1a;以太网 CSMA …

详解多态、虚继承、多重继承内存布局及虚表(C++)

本篇文章深入分析多态、虚继承、多重继承的内存布局及虚函数表以及实现原理。编译器使用VS 2022&#xff0c;直接放结论&#xff0c;代码及内存调试信息在后文。 结论 内存布局 一个没有虚函数的类&#xff0c;它的大小其实就是所有成员变量的大小&#xff0c;此时它就是一个…

手机如何在线制作gif?轻松一键在线操作

现在大家都喜欢使用手机来拍摄记录有趣的事物&#xff0c;但是时间长了手机里的视频越来越多导致手机存储空间不够了&#xff0c;这些视频又不想删除时应该怎么办呢&#xff1f;这个很简单&#xff0c;下面就给大家分享一款不用下载手机就能操作的视频转gif网站-GIF中文网&…

【海思SS528 | VDEC】查看VDEC的proc调试信息 | cat /proc/umap/vdec

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; &#x1f923;本文内容&#x1f923;&a…