- 博客(52)
- 资源 (1)
- 收藏
- 关注
原创 Redis是什么?架构是怎么样的?
我是一个程序员,维护了一个商品服务,它的背后直连Mysql数据库,假设商品服务对外每秒需要提供1万次查询,但背后的mysql每秒只能提供每秒5K次的查询,那mysql肯定顶不住,分分钟压垮,这种大流量场景很常见,比如双十一购物,春节抢车票.那么问题来了?有没有什么办法在Mysql不被压垮的同时,让商品服务支持每秒!万次的查询?当然有!没有什么是加一层中间层不能解决的,如果有,那就再加一层,这次我们要加的中间层就是Redis.
2025-04-03 17:02:39
670
原创 RabbitMQ详解,RabbitMQ是什么?架构是怎样的?
有些生产者想将消息发到一个Queue中,有些则是发给多个Queue中,甚至广播给所有Queue,于是我们还需要一个可以定制消息路由分发的策略的组件,交换器Exchange,将它与Queue绑定在一起,通过一个类似正则表达式的字符串,声明绑定的关系,让用户根据需要,选择要投递的序列,消息队列本质上就是类似链表的独立进程,链表里的每一个节点是一个消息,它介于生产者和消费者之间,在流量高峰时先慢慢暂存数据,然后再慢慢消费数据,可以很好的保护消费者,也就是削峰填谷,这个类似链表的进程就是队列。
2025-04-02 16:51:31
1248
原创 left join、right join和join的区别
left是左边的意思,join是连接的意思,连起来就是“左连接”,表1左连接表2,以左为主,表示以表1为主,关联上表2的数据,查出来的结果显示左边的所有数据,然后右边显示的是和左边有交集部分的数据。join,其实就是“inner join”,为了简写才写成join,两个是表示一个的,内连接,表示以两个表的交集为主,查出来是两个表有交集的部分,其余没有关联就不额外显示出来,这个用的情况也是挺多的,如下。结果集就是02和03部分。
2025-04-02 14:46:49
242
原创 如何理解mysql中except和in?
这个需求中,order表有10000条数据,而user表有100条数据。order表是大表,user表是小表。如果order表在左边,则用in关键字性能更好。因为如果sql语句中包含了in关键字,则它会优先执行in里面的子查询语句,然后再执行in外面的语句。假如有order和user两张表,其中order表有10000条数据,而user表有100条数据。前面提到的这种业务场景,使用in关键字去实现业务需求,更加合适。不管是用in,还是exists关键字,其核心思想都是用小表驱动大表。
2025-04-02 11:53:58
194
原创 SQL的优化技巧
sql优化是一个大家都比较关注的热门话题,无论你在面试,还是工作中,都很有可能会遇到。如果某天你负责的某个线上接口,出现了性能问题,需要做优化。那么你首先想到的很有可能是优化sql语句,因为它的改造成本相对于代码来说也要小得多。那么,如何优化sql语句呢?这篇文章从15个方面,分享了sql优化的一些小技巧,希望对你有所帮助。1 避免使用。
2025-04-02 11:48:07
994
原创 union all和union的区别
从效率上说,UNION ALL 要比UNION快很多,所以,如果可以确认合并的两个结果集中不包含重复数据且不需要排序时的话,那么就使用UNION ALL。UNION用的比较多,union all是直接连接,取到得是所有值,记录可能有重复 union 是取唯一值,记录没有重复。UNION和UNION ALL关键字都是将两个结果集合并为一个,但这两者从使用和效率上来说都有所不同。[SQL 语句 1][SQL 语句 2][SQL 语句 1][SQL 语句 2]
2025-04-02 11:14:01
146
原创 二,<FastApi>FastApi的两个核心组件
框架/工具包,非常适合在Python构建异步Web服务。Starlette是一个轻量级的。FastAPI的两个核心组件。
2025-04-02 09:37:57
199
原创 一,<FastApi>什么是FastApi?及框架介绍
FastAPI是一个现代、快速(高性能)的python web框架,基于标准的python类型提示,使用python3.6+构建的web框架。FastAPI是建立在Pydantic和Starlette基础上的,Pydantic是一个基于Python类型提示来定义数据验证,序列化和文档的库。Starlette是一种轻量级的ASGI框架工具包,是构建高性能Asyncio的理性选择。
2025-04-02 09:17:39
170
原创 Python之Celery
Celery是一个简单的,灵活且可靠的,处理大量消息的分布式系统,专注于实时处理的异步任务队列,同时也支持任务调度,Celery本身并不是任务队列,它是一个分布式队列的管理工具,Celery封装好了操作常见任务队列的各种操作,比如说从监听某个任务队列并从该队列中拿到数据进行消费。
2025-03-30 15:40:08
378
原创 数据库分库分表是啥?读写热点是什么?读扩散又是什么?
我们在上面的分库分表中,都用这个id去分,这其实就是所谓的分片键,实际上我们一般也是用数据库的主键作为分片键,这样理想情况下我们已知一个ID,不管是那个规则,我们根据ID都能很快的知道该去查询那张表。
2025-03-30 12:49:57
815
原创 python之GIL锁详解
多线程:只需要开1 个进程,这个进程开启 4 个线程,开启线程所消耗的资源很少,但是由于最终执行是只有一个 CPU 可以工作,所以最终消耗 40s 多的时间。3、在没有GIL锁的情况下,有可能多线程在执行一个代码的同时,垃圾回收机制对所执行代码的变量直接进行回收,其他的线程再使用该变量时会导致运行错误。由于GIL锁的存在,即使是多个线程处理任务,但是最终只有一个线程在工作,那么是不是多线程真的一点用处都没有了呢?2个线程都会去操作该数据,由于多线程对同一个资源的竞争,实际上引用计数为3,
2025-03-29 21:15:31
282
原创 python之kafka组件
Kafka是一个分布式的基于发布/订阅模式的消息队列(Message Queue),主要应用于大数据实时处理领域。消息的发布者不会将消息直接发布给特定的订阅者,而是将发布的消息分为不同的类别,订阅者只接收感兴趣的消息。Kafka是一个开源的分布式事件流平台(Event Streaming Platform),被数千家公司用于高性能的数据管道、流分析、数据集成和关键任务应用。
2025-03-29 21:05:19
1294
原创 python之多线程,多进程理解
1. 多线程(Multithreading)线程是进程中的一个执行单元。一个进程可以包含多个线程,它们共享同一个内存空间,共同完成任务。在 Python 中,多线程通常用于 I/O 密集型任务(例如网络请求、文件读写等),因为这些任务往往会因为 I/O 操作而被阻塞。通过多线程,我们可以让程序在等待 I/O 操作时继续处理其他任务,从而提升程序的整体响应速度。
2025-03-29 16:02:40
1361
原创 python之协程
Tasks用于并发调度协程,通过asyncio.create_task(协程对象)的方式创建Task对象,这样可以让协程加入事件循环中等待被调度执行。事件循环就是把你创建好的函数,加入到任务列表,事件循环负责监听任务列表,当执行这个函数遇到费时操作时,事件循环就会控制跳到其他可执行的任务,当没有可执行的任务就会等待当前任务执行完毕,只有全部任务都执行完毕,才会退出循环。2,包装协程为任务(task1 = asyncio.create_task( func() ))检查协程-->让出控制-->等待协程。
2025-03-29 15:33:16
802
原创 为什么使用Flask + uWSGI + Nginx 部署服务?
其次,需要支持应用相关的规范,例如类库、安全方面的特性。但是理论上web server与应用程序之间是无法通信的,他们之间也需要有一个桥梁,这个桥梁就是uWSGI,uWSGI通过WSGI这个协议,将web server的请求转换成应用程序可以理解的request,与应用程序进行动态数据交互,将请求到的数据转换成web server可以理解的形式,由 web server将数据最终返回给请求的客户端。(1)既然客户端可以请求服务端的数据,那么客户端与服务端肯定是可以通信的,通信是由谁来完成的呢?
2025-03-28 12:52:15
529
原创 Flask项目部署:Flask + uWSGI + Nginx
pidfile=uwsgi.pid #进程号存储文件,若不存在则会自动创建,pid里面只记录一个进程号,若存在多个进程processes,则使用uwsgi命令通过uwsgi.pid文件停止、重启uwsgi服务不全。master=true #启动主进程,来管理其他进程,其它的uwsgi进程都是这个master进程的子进程,如果kill这个master进程,相当于重启所有的uwsgi进程。daemonize=uwsgi.log #使进程在后台运行,并将日志打到指定的日志文件,文件若不存在则会自动创建。
2025-03-28 12:47:34
758
原创 C++多态
对于不同的交通工具,比如汽车和自行车,它们的移动方式是不同的。你需要一个具体的交通工具,比如“汽车”或“自行车”,它们根据“交通工具”的概念具体实现了移动的功能。想象一下,你有一个遥控器(这就像是一个基类的指针),这个遥控器可以控制不同的电子设备(这些设备就像是派生类)。无论是电视、音响还是灯光,遥控器上的“开/关”按钮(这个按钮就像是一个虚函数)都能控制它们,但具体的操作(打开电视、播放音乐、开灯)则取决于你指向的设备。当我们使用基类类型的指针或引用来调用虚函数时,实际调用的是对象的实际类型(派生类)
2024-12-15 13:09:38
682
原创 C++静态成员
静态成员在C++类中是一个重要的概念,它包括静态成员变量和静态成员函数。静态成员的特点和存在的意义如下:静态成员变量1. 定义:静态成员变量是类的所有对象共享的变量。与普通成员变量相比,无论创建了多少个类的实例,静态成员变量只有一份拷贝。2. 初始化:静态成员变量需要在类外进行初始化,通常在类的实现文件中。3. 访问:静态成员变量可以通过类名直接访问,不需要创建类的对象。也可以通过类的对象访问。4. 用途:常用于存储类级别的信息(例如,计数类的实例数量)或全局数据需要被类的所有实例共享。
2024-12-14 10:09:08
258
原创 C++关键字this和new
在 C++ 中, this 关键字是一个指向调用对象的指针。它在成员函数内部使用,用于引用调用该函数的对象。使用 this 可以明确指出成员函数正在操作的是哪个对象的数据成员。下面是一个使用 Car 类来展示 this 关键字用法的示例:在这个例子中, Car 类的构造函数使用 this 指针来区分成员变量和构造函数参数。同样, setYear成员函数使用 this 指针来返回调用该函数的对象的引用,这允许链式调用,myCar.setYear(2021).display();。
2024-12-12 21:56:29
451
原创 C++构造函数和析构函数
析构函数是C++中的一个特殊的成员函数,它在对象生命周期结束时被自动调用,用于执行对象销毁前的清理工作。析构函数特别重要,尤其是在涉及动态分配的资源(如内存、文件句柄、网络连接等)的情况下。和python中__del__类似基本特性1.名称:析构函数的名称由波浪号( ~ )后跟类名构成,如 ~MyClass()。2.无返回值和参数:析构函数不接受任何参数,也不返回任何值。3.自动调用。
2024-12-12 21:36:23
492
原创 C++权限
银行的账户是一个模板,是一个类,有存款人信息和账户额度,而具体的存款人视为一个对象,一个对象不能私自修改账户额度,需要通过一个操作流程,比如去ATM或者柜台进行操作才能修改到账户额度,所以,存款人信息和账户额度设计成私有权限,通过公有的操作流程,也就是公有函数去操作私有变量。C++中的访问权限主要分为三种: public 、 private 和 protected。这些权限决定了类成员(包括数据成员和成员函数)的可访问性。基于这个场景,我们编程实现代码。通过一个例子来进一步了解。
2024-12-11 22:15:39
216
原创 C++中的类
C++ 中的类(class)是一种编程结构,用于创建对象。这些对象可以拥有属性(即数据成员)和行为(即成员函数或方法)。类的概念是面向对象编程的核心之一,其主要目的是将数据和与数据相关的操作封装在一起。例如,如果你有一个“汽车”类,它可能包含颜色、品牌、型号等属性(数据成员),以及启动、停止、加速等行为(成员函数)。每当你基于这个类创建一个对象时,你就有了一个具体的汽车,具有这些属性和行为。C++ 类的基本结构通常包含:1.:定义类的属性。这些是类内部的变量,用于存储对象的状态。2.
2024-12-11 21:49:33
706
原创 Lambda 函数和内联函数在 C++ 中的相似之处和区别
虽然 Lambda 函数和内联函数在某些方面有相似之处,如它们都可以被编译器优化以减少调用开销,但它们在设计和用途上有明显的不同。Lambda 函数的核心优势在于它们的匿名性和对外部变量的捕获能力,而内联函数则主要关注于提高小型函数的性能。
2024-12-08 12:44:12
195
原创 <三>51单片机PWM开发SG90和超声测距
PWM,英文名Pulse Width Modulation,是脉冲宽度调制缩写,它是通过对一系列脉冲的宽度进行调制,等效出所需要的波形(包含形状以及幅值),对模拟信号电平进行数字编码,也就是说通过调节占空比的变化来调节信号、能量等的变化,占空比就是指在一个周期内,信号处于高电平的时间占据整个信号周期的百分比,例如方波的占空比就是50%.型号:HC-SR04接线参考:模块除了两个电源引脚外,还有TRIG,ECHO引脚,这两个引脚分别接我们开发板的P1.5和P1.6端口怎么让它发送波?
2024-12-01 21:01:15
1007
原创 <二>51单片机定时器和中断
C51中的定时器和计数器是同一个硬件电路支持的,通过寄存器配置不同,就可以将他当做定时器或者计数器使用。确切的说,定时器和计数器区别是致使他们背后的计数存储器加1的信号不同。当配置为定时器使用时,每经过1个机器周期,计数存储器的值就加1。而当配置为计数器时,每来一个负跳变信号(信号从P3.4 或者P3.5引脚输入),就加1,以此达到计数的目的。标准C51有2个定时器/计数器:T0和T1。他们的使用方法一致。C52相比C51多了一个T2。
2024-12-01 10:46:47
742
原创 <一>51单片机环境
1. 创建项目工程文件夹,可以当作模板Template2. 创建文件,取名main.c3,编译,选择输出文件有hex4. 进入keil主页面,工具栏project->new uVision project->选择第一步的工程文件夹位置->输入工程名字->选择芯片类型AT89c52->会提示是否拷贝STARTUP.A51,选择是->生成了工程目录->在工程目录Source Group1上右键鼠标->add Exiting file to Source Group1...->选择代码文。
2024-12-01 10:17:37
461
原创 C语言实现贪吃蛇小游戏
Linux系统编程文件编程,线程通信(移动和图形刷新是在两个线程实现,既要两个while结构同时运行),第三方包等。6,多线程实现地图和蛇移动同时刷新地图(踩坑,两个线程之间最好加上睡眠,不然可能地图乱码)2,利用结构体实现链表,实现蛇的身子,链表头尾增加实现移动及吃食物增加长度。3,curses实现键盘方向键的输入(4,结构体实现food,随机出现在地图。基础C变量,流程控制,函数,指针,结构体等。1,用控制语句实现地图方框。数据结构链表(用于实现蛇,食物,可参考,5,地图边界的判定等等。
2024-11-27 23:53:19
404
原创 C语言链表的实现,详解!!!
链表也是一种数据结构,说到我们就要和数组进行对比,数组中的数据在内存中是连续的,线性表中的数据结点在内存中的位置是任意的,即逻辑上是线性的数据元素在物理位置(内存存储的位置)上不一定相邻.链表的结构我们可以定义一个结构体,结构中的next指向下一个结构体的指针,这样就把数据链起来了int data;
2024-11-24 13:12:16
562
原创 C语言:自定义strcopy,strlen,strcat函数
strcpy:将一个字符串复制到另一个字符串中。strncpy:指定复制字符串的最大长度。strdup:复制一个字符串,返回一个指向这个复制字符串的指针。strcat:将一个字符串连接到另一个字符串末尾。strncat:指定连接字符串的最大长度。strcmp:比较两个字符串。strncmp:比较两个字符串的前 n 个字符是否相等。strlen:返回字符串的长度。strchr:在字符串中查找指定字符。strstr:在字符串中查找指定子字符串。
2024-11-21 21:05:55
447
原创 C语言中的内存管理(栈、堆、全局静态区、常量区、代码区)
程序执行时,每当进入一个函数,函数的局部变量和参数都会被压入栈中。C语言中内存分为5部分(栈、堆、全局静态区、常量区、代码区),不同的区域,有不同的用途,有不同的管理策略,生命周期也不一样。栈内存的管理由编译器自动完成,这提高了内存操作的效率,使得栈成为存储局部变量和函数参数的理想位置。生命周期:栈上变量的生命周期与其所在函数的执行时间相同,即变量在函数执行期间存在,当函数返回后,变量也就消失。快速分配:由于栈是LIFO结构,新的变量分配只是简单地移动栈指针,因此分配速度非常快。
2024-11-20 20:34:20
617
原创 C语言sizeof和strlen的区别
结果如上,是因为字符串在内存中是以'\0'结尾的,sizeof()关键字是获取整个字符串的大小,strlen()函数是获取实际有效长度。3、而sizeof 测量的是字符的分配大小,它的参数可以是数组、指针、类型、对象、函数等。测量的是字符串的实际长度,以’\0’ 结束,返回结果不包括’\0’。1、sizeof是关键字(运算符),strlen是C语言标准库函数。
2024-11-20 20:11:14
207
原创 C语言指针函数,函数指针练习demo
指针函数需求,利用指针函数,输入学生号,0,1,2打印学生的所有成绩,学生成绩用4行4列的二维数组,表示有3位学生,学生有4科成绩。
2024-11-18 23:00:55
135
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人