计算机基础:随笔知识记录
目录
前言
记录一些查找过的记录;
日后在一一整理归纳。
//redis 介绍:
Redis(Remote Dictionary Server)是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。它是一个key-value存储系统,支持存储的value类型包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。与Memcached类似,为了保证效率,数据都是缓存在内存中。但不同的是,redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了主从同步。
//Redis优缺点:
Redis的优点主要表现在以下几个方面:
读写性能优异:Redis的数据存储在内存中,这使得它的读写速度非常快,性能优异。
支持数据持久化:Redis支持两种持久化方式,即AOF(Append Only File)和RDB(Redis DataBase)。这两种方式都可以有效地备份和恢复数据。
支持主从复制:Redis支持主从复制,主机会自动将数据同步到从机,可以进行读写分离,提高系统性能。
数据结构丰富:除了支持string类型的value外,Redis还支持string、hash、set、sortedset、list等数据结构,可以满足多场景的需求。
支持事务:Redis支持简单的事务,操作满足原子性,这使得其在执行事务时具有更好的一致性和可靠性。
支持哨兵机制:Redis支持哨兵机制,可以实现自动故障转移,保证系统的可用性和稳定性。
然而,Redis也存在一些缺点:
不具备自动容错和恢复功能:如果主机或从机宕机,会导致前端部分读写请求失败,需要等待机器重启或者手动切换前端的IP才能恢复。
数据存储在内存,存储容量受到物理内存的限制:这意味着Redis只能用于小数据量的高性能操作,对于大数据量的应用场景可能不太适合。
在线扩容比较困难:当集群容量达到上限时,在线扩容会变得很复杂。
这些优点和缺点根据不同的使用场景和需求可能会对使用Redis产生影响。例如,由于Redis的高性能和持久化特性,它常常被用作缓存和消息队列等场景;但同时,由于其数据容量和扩容限制,它不适合用作大数据存储。
//redis 的使用场景:
Redis的使用场景非常广泛,以下是一些常见的使用场景:
热点数据的缓存:由于Redis访问速度快且支持的数据类型丰富,因此它非常适合用来存储热点数据。结合Redis的过期命令,我们可以设置过期时间并进行缓存更新操作,这种功能在大多数项目中都会被使用到。
限时业务的运用:在Redis中,可以使用expire命令设置一个键的生存时间,到时间后Redis会自动删除它。这个特性可以应用于限时的优惠活动信息、手机验证码等业务场景。
计数器相关问题:Redis的incrby命令可以实现原子性的递增,因此可以用于高并发的秒杀活动、分布式序列号的生成等场景。
排行榜相关问题:关系型数据库在排行榜方面查询速度普遍偏慢,而Redis的SortedSet数据结构可以用于进行热点数据的排序,因此可以借助Redis进行排行榜相关问题的处理。
分布式锁:Redis的setnx命令可以实现分布式锁,利用这个特性可以解决需要分布式锁的场景问题,并结合过期时间防止死锁的出现。
延时操作:通过使用Redis提供的时间通知功能和监听器,可以实现订单生产后的延时操作,例如在10分钟后检验用户是否真正购买,如果没有购买则将该单据设置无效并还原库存。
队列:由于Redis有list push和list pop这样的命令,因此可以很方便地进行队列操作。
以上是Redis的一些常见使用场景,但实际上Redis的应用场景远不止这些,具体的使用方式会根据不同的业务需求而有所不同。
//关系型数据库与非关系型数据库之间存在以下区别:
存储方式:关系型数据库以表格形式存储数据,数据结构比较规整固定;非关系型数据库则以JSON文档、哈希表等形式存储数据,数据结构更加灵活和可扩展。
表和数据的关系:在关系型数据库中,必须先定义好表和字段结构,然后才能添加数据;而在非关系型数据库中,数据可以在任何时候任何地方添加,不需要先定义表,数据库会自动创建相应的集合。
数据之间的关系:关系型数据库中建立实体数据之间的联系是通过加外键;非关系型数据库中除了这种规范化做法以外,还能用一种非规范化方式,即把外部数据直接放到原数据集中,以提高查询效率。
数据一致性:关系型数据库强调数据的一致性,在对数据进行更新、插入或删除操作时,必须保证数据的完整性和一致性,以避免数据的冲突和错误;而非关系型数据库则更加关注数据的可用性和灵活性,通常采用最终一致性模型。
扩展性:关系型数据库的扩展性相对较差,通常只能通过升级硬件或者增加节点来提高系统的性能;而非关系型数据库则采用分布式架构,可以通过添加节点来水平扩展系统的性能。
数据查询语言:关系型数据库通常采用结构化查询语言(SQL)进行数据查询,这种语言基于严格的语法规则,可以进行复杂的数据查询和分析;而非关系型数据库则通常使用简单的键值对查询语言,这种语言更加灵活,但是限制了查询的复杂性。
总的来说,关系型数据库和非关系型数据库在各个方面都存在一些差异,需要根据具体的应用场景和需求来选择合适的数据库类型。
//常见的Web服务器有以下几种:
Apache:被广泛使用,可运行在各种平台上,包括Windows、Linux、Unix等。
Nginx:在Linux平台上表现优秀,轻量级且功能强大,可与许多语言(如PHP、Python、Perl等)进行良好的集成。
Tomcat:常用于Java Web开发,可与许多Java应用配合使用,易于设置和管理。
IIS:微软的Web服务器,专门为Windows平台设计,可与ASP.NET等微软技术配合使用。
Lighttpd:开源的Web服务器,具有轻量级和多功能的特点,可运行在多个平台上。
WebLogic:企业级Web服务器,多用于Java Web应用开发,架构优秀,易于扩展和维护。
Caddy:新兴的Web服务器,具有自动 HTTPS、自动响应、自动压缩等特性,适合现代Web开发。
OpenLiteSpeed:一款高性能的Web服务器,具有优异的负载能力和高可用性,适用于各类Web应用。
Node.js:虽然不是专门的Web服务器,但Node.js可以使用http模块来构建Web服务器,非常适合实时、响应式的Web应用。
以上这些都是目前广泛使用且具有代表性的Web服务器,可根据实际需求进行选择。
//HTTP 状态码
https://www.runoob.com/http/http-status-codes.html
//屏幕分辨率
屏幕分辨率是指显示设备上的横向和纵向像素的数量,单位通常为像素(px)。屏幕分辨率可以确定计算机屏幕上显示多少信息的设置,以水平和垂直像素来衡量。例如,当屏幕分辨率为640x480时,意味着在水平方向上有640个像素,在垂直方向上有480个像素。
在相同大小的屏幕上,如果分辨率越高,那么显示效果就会越精细和细腻。例如,分辨率为1600x1200的屏幕相比分辨率为640x480的屏幕,在显示相同大小的内容时,前者可以显示更多的像素,单个像素尺寸比较小,所以显示效果会更清晰、更细腻。
以上信息仅供参考,如有需要,建议您咨询计算机或视觉设计专业人士。
//网站主机
网站主机就像是零售店,供货商把自己的产品提供给零售店来出售,零售店帮你存储产品(并固定存储),当有买主看到想要的产品后,直接发起购买需求,就完成了一个请求。
主机——零售店、网站——产品、开发人员——供货商、网民——买主;
网站主机是指用于存储网站文件、数据和运行网站程序的服务器。它是网站运行的基础设施,提供稳定的网络环境和高效的数据传输能力,使得网站能够在互联网上正常运行。网站主机可以购买或出租,并可选择放置在互联网上的不同位置以供访问。
//TCP/IP 教程
https://www.runoob.com/tcpip/tcpip-tutorial.html
TCP/IP 是不同的通信协议的大集合。
//Web Service是一种可以在Web上被描述、发布、查找以及调用的自包含、模块化的应用程序,它可以通过网络提供功能,与其他软件进行交互。
以下是一些简单的例子来帮助你更好地理解Web Service:
假设你有一个手机应用程序,这个应用程序需要从另一个服务器获取天气数据。这个服务器上的天气数据就可以被你的应用程序通过Web Service进行访问。你的应用程序可以向这个Web Service发送请求,获取特定城市的天气信息,然后根据这些信息进行其他操作。
另一个例子是,如果你有一个电子商务网站,你可以通过Web Service从另一个供应商那里获取商品信息。你的网站可以向供应商的Web Service发送请求,获取特定商品的详细信息,然后根据这些信息在你的网站上展示。
再比如,如果你有一个博客,你可以使用一个Web Service来自动更新你的社交媒体账户,当你的博客有新文章发布时。你的博客可以通过Web Service向社交媒体账户发送消息,通知它们有新的内容需要更新。
以上就是一些简单的例子,当然Web Service的应用远不止于此。
//常见的操作系统可以按照不同的方法和标准进行分类。以下是按界面、用户、任务和系统功能分类的例子:
按界面分类:
命令行界面的操作系统,例如DOS,是一个早期的计算机操作系统,它通过命令行界面与用户交互,用户需要记住各种命令和命令格式来操作计算机。
图形界面的操作系统,例如Windows,提供了直观的图形用户界面(GUI),通过图标、菜单和对话框等元素与用户交互,使得用户可以更加直观地操作计算机。
按用户分类:
单用户操作系统,例如DOS,一次只能一个用户使用计算机系统,不能同时多人使用。
多用户操作系统,例如Unix、Linux和Windows Server等,允许多个用户同时使用系统,这些系统具备多任务处理能力,可以满足多个用户同时登录和使用计算机系统。
按任务分类:
单任务操作系统,例如早期的DOS,一次只能执行一个任务,任务完成后才能执行下一个任务。
多任务操作系统,例如Windows、Unix和Linux等,具备多任务处理能力,可以同时执行多个任务,例如同时打开多个应用程序、运行多个后台服务等。
按系统功能分类:
批处理操作系统,例如早期的批处理系统,将作业一次性提交给系统,然后由系统成批进行处理。这种系统需要预先编写好程序脚本,通过输入命令来启动程序执行。
分时操作系统,例如Unix和Linux等,将CPU的时间分成很小的时间片,按时间片轮转法分配给多个终端用户使用的操作系统。每个用户可以在规定时间内交互式地使用计算机。
实时操作系统,例如VxWorks、RTOS等,对于特定的输入,系统能在极短的时间内做出响应并完成对该输入请求的处理。这种系统通常用于需要快速响应和高可靠性的应用场景,例如航空航天、工业控制等。
以上是常见的操作系统分类方法之一,不同的人和场景可能会采用不同的分类方法和标准。
//消息队列的使用场景非常广泛,以下是几个常见的使用场景:
解耦: 消息队列允许应用程序之间的解耦,使得发送和接收消息的双方可以独立地运行。例如,电商系统中的订单处理系统可以将订单信息发送到消息队列,然后由另一个系统从队列中获取并处理这些订单信息。
异步通信: 消息队列支持异步通信,发送端可以立即返回,而接收端可以在需要的时候再处理消息,提高了系统的响应速度和并发能力。
缓冲: 消息队列可以作为缓冲区,暂时存储大量的消息,以应对接收端应用程序的处理速度较慢或者暂时不可用的情况。例如,日志收集系统可以将日志信息发送到消息队列,然后由另一个系统从队列中获取并处理这些日志信息。
消息分发: 消息队列可以实现消息的广播和分发,例如,系统A产生的消息可以通过消息队列分发到系统B、C、D等,实现系统之间的通信和协调。
流量削峰: 在高并发场景下,消息队列可以起到流量削峰的作用,避免系统过载。例如,在双11等电商活动期间,可以通过在消息队列中存储用户下单信息,再由后台系统慢慢处理,从而避免系统因高并发压力而过载。
以上是消息队列常见的使用场景,实际使用中需要根据具体业务需求和应用场景选择合适的消息队列工具。
//GC:(仅限托管代码)
1. 垃圾回收(Garbage Collection,简称GC)是.NET框架中的一种自动内存管理机制;
2. 负责回收不再使用的对象所占用的内存,减少了开发者在管理内存方面的负担,有效地避免了内存泄漏和内存溢出等问题;
3. 采用了一种称为“分代收集”(Generational Collection)的策略,它将托管堆内存分为三个不同的代(Gen 0、Gen 1和Gen 2),会优先回收年轻代(Gen 0和Gen 1)中的对象,因为这些对象通常具有较短的生命周期,这样可以减少垃圾回收的开销和提高应用程序的性能。
* 非托管代码要需要手动分配和释放内存
//SDK是“软件开发工具包”的简称,它是一套为特定软件包、软件框架、硬件平台、操作系统等设计的用于集中配置、简化编程、缩短项目研发周期的库、驱动程序及相关工具集合。SDK在计算机编程中的应用十分广泛,特别是在软件开发方面。
举例来说,假设你正在为一家游戏公司开发一个新游戏,该游戏需要在多个平台上发布,包括PC、手机和平板电脑。为了简化开发过程,游戏公司可能会提供一个SDK,该SDK包括为不同平台上的游戏开发提供的一组API和工具。
这个SDK可能包括以下内容:
为PC开发的API和工具,包括键盘和鼠标的操作、游戏界面的设计和交互等。
为手机和平板电脑开发的API和工具,包括触摸屏操作、加速度计和陀螺仪的使用等。
为所有平台提供的一组通用的工具,例如调试器、性能分析器和代码编辑器等。
通过使用这个SDK,开发人员可以更快地开发游戏,避免在不同平台之间重复编写相同的代码,提高开发效率和代码质量。
//在.NET中,Lazy<T> 如磁盘I/O或网络请求时
精华所在:
!用于在需要时才创建对象
!用于在需要时才创建对象
!用于在需要时才创建对象
// 使用 Lazy 初始化一个耗时的操作
Lazy<string> lazyString = new Lazy<string>(() =>
{
Console.WriteLine("开始昂贵的计算...");
Thread.Sleep(3000); // 模拟耗时操作
return "这是一个昂贵的计算结果";
});
Console.WriteLine("demo");
// 第一次访问 Lazy 对象时,会执行初始化操作
Console.WriteLine(lazyString.Value);
// 第二次访问 Lazy 对象时,会直接返回已初始化的值,不会再次执行初始化操作
Console.WriteLine(lazyString.Value);
//Vscode 使用C#
1. ctrl + ~ 终端,输入dotnet new console
dotnet new console --framework net7.0
//运行dotnet run
https://learn.microsoft.com/zh-cn/dotnet/core/tools/
//vscode快捷键
https://www.w3cschool.cn/vscode/vscode-keyboard.html
//ImGUI:
ImGUI简单程序:https://www.cnblogs.com/timefiles/p/17632348.html
imgui 中文文档:https://gitcode.gitcode.host/docs-cn/imgui-docs-cn/
NuGet常用基本配置和命令: https://www.cnblogs.com/wml-it/p/17661490.html
//C#任务调度:
Hangfire:
https://docs.hangfire.io/en/latest/configuration/index.html
https://blog.csdn.net/qq_40732336/article/details/118465391
https://www.bookstack.cn/read/Hangfire-zh-official/21.md
Quartz.net:
https://www.quartz-scheduler.net/documentation/quartz-3.x/tutorial/more-about-jobs.html#jobdatamap
//数据库快照:https://www.cnblogs.com/simonLiang/p/5766987.html
快照与备份的区别:https://www.zhihu.com/question/20374919
游标的主要作用包括:
遍历数据行:使用游标可以逐行浏览查询结果集中的数据,并对每一行的数据进行操作。
保存查询结果:游标可以将查询结果保存在内存中,以便后续操作或再次使用。
QML元素的介绍:
https://blog.csdn.net/dreamsongo/article/details/72954514/
C++ 资源大全中文版、教程网站
https://github.com/jobbole/awesome-cpp-cn
https://www.geeksforgeeks.org/cout-in-c/
https://zh.cppreference.com/w/cpp
nlohmann json: https://blog.csdn.net/qq_33177268/article/details/126044636
此处讲的端口是TCP或UDP通信中数字端口号,属于传输层的概念,是软件中的端口。端口号用16位整型数据来表示,端口的范围为0-65535。要进行TCP或UDP通信时,除了要有IP,必须要有端口。
操作系统会有很多默认端口,是留给指定的协议使用的,比如21是ftp协议的默认端口,80是http协议的默认端口,443是https协议的默认端口。作为接收客户端连接请求的服务器,可以设定自己的服务端口。
gcc编译器,还是clang编译器,或者是微软的msvc++编译器
博客园排名:
https://www.cnblogs.com/AllBloggers.aspx
1. C++ pair 和make_pair
pair <string,double> product1 ("tomatoes",3.25);
pair <string,double> product2;
pair <string,double> product3;
product2.first ="lightbulbs"; // type of first is string
product2.second =0.99; // type of second is double
product3 = make_pair ("shoes",20.0);
cout <<"The price of "<< product1.first <<" is $"<< product1.second <<"\n";
cout <<"The price of "<< product2.first <<" is $"<< product2.second <<"\n";
cout <<"The price of "<< product3.first <<" is $"<< product3.second <<"\n";