- 博客(114)
- 收藏
- 关注
原创 5.string类型
Redis字符串采用二进制存储,支持文本、整数、JSON、二进制数据等多种格式。主要命令包括:SET(设置键值)、GET(获取值)、MSET/MGET(批量操作)、INCR/DECR(整数增减)、APPEND(追加字符串)等。字符串编码方式分为int、embstr和raw三种。应用场景包括缓存热点数据、计数功能、分布式会话共享和手机验证码存储。使用时需注意单线程模型限制,避免大value阻塞,可通过设置过期时间和内存淘汰策略优化存储。
2025-12-21 18:10:53
660
原创 4.常用数据结构和单线程模型理解
redis上有很多key,可能某些key的value是hash,hash本身是很浪费内存的(有空位置),在数据量不大时,使用ziplist可以在不影响效率的情况下节省内存。不是说redis服务器内部就只有一个线程;redis6.0及以上,网络IO是多线程的。raw:最基本的字符串,底层实现持有一个char数组。ziplist:当哈希表内元素个数比较少,节省内存。embstr:针对短字符串的特殊优化(hashtable:最基本的哈希表。intset:集合中存的都是整数(skiplist:跳表(
2025-12-21 16:42:21
287
原创 3.Redis通用
keys:查询指定keyexists:判断是否存在del:删除指定的keyexpire:设置过期时间ttl:获取还有多久过期type:获取key对应value的类型。
2025-12-19 01:40:10
690
1
原创 2.Redis背景和使用场景
Redis是一款高性能内存数据库,具有内存存储、Lua脚本编程、可扩展API、持久化备份、集群支持和高可用性等特性。其快速响应得益于内存操作、高效数据结构、IO多路复用和单线程模型(新版部分多线程)。适用于缓存、数据库和消息队列场景,还可用于存储HTTP会话信息,弥补HTTP无状态特性。
2025-12-18 23:25:22
241
原创 1.Redis初识
Redis作为内存数据库广泛应用于缓存、向量数据库、消息代理等场景,特别适合分布式系统。随着业务增长,系统架构从单机演进到微服务:1)应用与数据库分离;2)引入负载均衡和应用集群;3)数据库读写分离;4)使用Redis缓存热点数据;5)数据库分库分表;6)采用微服务架构。微服务虽提升管理效率,但也带来性能下降和复杂度增加的问题。文章还解释了分布式、集群、中间件等关键概念,总结了架构演进的7个主要阶段。
2025-12-18 23:03:48
785
原创 1.Qt概述(一)
Qt是一个跨平台的C++图形用户界面框架,主要用于桌面应用开发。它支持Windows、Linux、Mac和嵌入式系统,相比MFC等传统方案更具生命力。Qt提供QtCreator等开发工具,支持通过代码或图形化界面两种方式创建GUI程序。其核心特点包括:1)跨平台能力;2)对象树和信号槽机制;3)元编程技术自动生成代码;4)支持国际化。Qt特别适合开发需要图形界面的工业设备和桌面应用程序,但不适用于网页和移动应用开发。开发者可以通过.pro工程文件管理项目,利用QtDesigner快速设计界面,最终生成可执行
2025-10-22 02:10:33
995
原创 Boost搜索引擎
4)遍历倒排打印节点数组,用id查正排,获得正排节点指针,将其id,分词数组第一个元素content摘要,url用cppjson库序列化成json串。(目的:query中出现两个及以上的关键字来自同一个文档时,结果会出现多份相同url,为了避免这种情况,使用umap让id作为key值,去重id)b.有,遍历倒排拉链,用umap[倒排节点._id],赋值id,累加相同id的权值,尾插相同id的关键字。1)根据一行内容,按格式分割出来,插入到正排索引数组,建立正排索引,返回刚插入的正排节点指针。
2025-10-19 05:11:01
739
原创 高并发内存池
6.1 thread cache结构分析6.2 Allocate逻辑6.3 ConcurrentAllocate调用逻辑(业务获取逻辑)7.1 central cache结构7.2 thread cache的FetchFromCentralCache实现7.3 central cache的FetchRangeObj实现项目源码和思路:cpp远程: quiteSix的c++远程仓库https://gitee.com/its-quite-six/cpp-remote/tree/master/%E9%AB%98%
2025-10-15 00:00:34
846
原创 12.MySQL使用C连接和连接池
往后,客户端相应进行数据库操作,都去构建相应的任务task对象,将其入到任务队列中,由线程池内线程执行相应sql语句,执行结果通过回调函数cb获取。
2025-10-09 21:32:53
955
原创 10.MySQL事务
当前遍历到的这条记录DB_TRX_ID<最小事务ID时,代表这条记录是老的,已经提交了的事务ID(这条记录比我当前事务先到,而且在我形成快照前已经提交了),当前事务应该看到。并不是单纯的并发事务处理时,别的事务提交了看不到(形成快照后,别的事务提交看不到,但是形成快照前是不影响的,只是保证快照读第一次到结束这个范围内读到的内容全部是相同的)会生成数据库系统当前的一个快照,记录并维护系统当前活跃事务的ID(当每个事务开启时,都会被分配一个ID, 这个ID是递增的,所以最新的事务,ID值越大)
2025-10-09 03:33:57
1221
原创 9.MySQL索引
那么这就意味着B树树高会比B+树更高,目录项存键值会变少,IO次数变多;数据库引擎不仅要修改原始数据表(Table),还必须同步更新所有相关的索引结构,以保持数据和索引的一致性。B树节点,既有数据,又有Page指针,而B+,只有叶子节点有数据,其他目录页,只有键值和Page指针。途径路上节点,减少 -> 找到目标数据只需要更少的page!IO次数更少,IO层面,提高了效率。回表操作是非常影响效率的,再查一次,途径路上节点需要IO。不过,在面对范围查找就明显不行(Hash不适合范围查找)
2025-10-08 18:07:42
1115
原创 8.复合查询与内外连接
直接晒即可,这里用的是笛卡尔积,结果穷举完了。筛选行时,一定可以筛选出一行员工FORD直接对应的就是上级领导。用子查询:select empno,ename from emp worker, emp leader。举例:显示员工FORD的上级领导的编号和姓名(mgr是员工领导的编号--empno)
2025-10-07 22:43:47
272
原创 7.内置函数
摘要:本文介绍了MySQL中常用的日期、字符串、数学和其他函数用法。日期函数包括date_add/datesub用于日期加减计算;字符串函数涉及length、replace、substring等操作;数学函数包含进制转换conv、数字格式化format等;其他实用函数如user()查询当前用户、md5()生成摘要、ifnull()处理空值等。重点说明了各函数参数设置和典型应用场景,如查询时间范围内数据、字符串截取位置从1开始等细节。函数覆盖了日期处理、字符串操作、数值计算和系统信息查询等常见数据库操作需求。
2025-10-06 23:58:10
321
原创 6.基本查询
建议:对未知表进行查询时,最好加一条 LIMIT 1,避免因为表中数据过大,查询全表数据导致数据库卡死。数据库有日志,记录历史sql语句 或者 数据本身(2进制),bin log默认关闭。删除数据不会改变表结构,auto_increment 计数器不会被影响。group by搭配聚合函数进行使用,目的:为了更好的做。2)where字句(定位筛选条件)1)from 表名(先定位表)NULL 视为比任何值都小。注意:删除整表操作要慎用!3)字段列表(确认字段)
2025-10-06 23:02:20
655
原创 4.数据类型
如果我们向mysql特定的类型中插入不合法的数据,MySQL一般都是直接拦截我们,不让我们做对应的操作。反过来意味着,我们已经有数据成功插入到mysql了,一定插入的时候都是合法的。倒逼程序员,让程序员尽可能进行正确的插入。
2025-10-05 22:29:37
599
原创 2.库的操作
alter database 数据库名 charset=xxx collate=xxx;数据库无论对数据做任何操作,都必须保证操作和编码必须是编码一致的。没有带上-B参数, 在恢复数据库时,需要先创建空数据库。读取数据库中数据采用的编码格式。数据库名 表1 表2。
2025-10-05 00:18:51
391
原创 1.MySQL数据库基础
http://repo.mysql.com/,mysql仓库,寻找合适版本。MySQL的核心就是插件式存储引擎,支持多种存储引擎。DQL,数据查询语言,代表指令: select。数据控制语言,主要负责权限管理和事务。3)rpm安装到对应的OS下载源。
2025-10-04 22:34:36
277
原创 1.HTTPS协议原理
服务端申请证书,CA机构根据提交的.csr文件形成数据,数据加密后形成数据摘要,CA用私钥进行加密得到签名,签名和数据一起打包(证书)发送给服务端,服务端申请证书成功。它再用服务端公钥S给对称密钥X加密,发给服务端,服务端用S'解析得到X。过程:客户端向服务端发起请求,服务端创建公钥S,私钥S',应答把公钥S发给客户端。2)这时服务端公钥S被中间人拦下来了,中间人保存公钥S,中间人创建自己公钥M,私钥M',1)客户端向服务端发送请求,服务端创建公钥S,私钥S',返回公钥S。反之不可信任,丢弃。
2025-10-03 23:29:51
1322
原创 50.Reactor反应堆模式
实现回调机制时,每个Connection都要有一份。首先上层的listener注册回调,listener进行recv(accept)时,给每个新的Connection(Channel)都拷贝一份,这样每个Channel都有一份回调。最佳实践:一个执行流一个Reactor(One thread one Loop)listensocket使用继承的方式来实现统一。Linux-remote: linux远程仓库。
2025-10-03 01:33:57
1057
原创 49.多路转接epoll
网络协议栈中,存在一种回调机制:底层,特定的fd上有数据就绪,自动进行回调:“激活”红黑树中的节点,rb_tree和就绪队列用的是同一个结构struct epitem。链入到就绪队列中(红黑树节点既属于红黑树,又属于就绪队列)事件已经就绪(输出的就是已经就绪的,不需要轮询判断)maxevents:events数组的长度。timeout:等待时间,同poll。返回值:同select和poll。epfd:epoll文件描述符。
2025-10-01 00:00:16
888
原创 48.多路转接select和poll
select负责等,一次可以等待多个fd -> 一个或多个fd的事件就绪了,select会通知上层调用,哪些fd就绪了 ->nfds:unsigned long类型,传入的pollfd对象个数(通常传数组或者malloc的空间)poll等待的fd个数,没有上限!(fd==-1,内核不关心该类fd的events)select是一种等多个fd的就绪事件通知机制。用数组来保存需要放到select监控集中的fd。timeout传nullptr为阻塞调用。返回内核返回的对应事件是否就绪。传入需要内核关心的就绪事件。
2025-09-30 03:39:24
581
原创 47.五种IO模型与阻塞IO
非阻塞IO往往需要程序员循环的方式反复尝试读写文件描述符, 这个过程称为轮询. 这对CPU来说是较大的浪费, 一般只有特定场景下才使用。调用者不会立刻得到结果;而是在调用发出后,被调用者通过状态、通知来通知调用者,或通过回调函数处理这个调用.(强调的是否要等待资源就绪)它的核心思想是:在I/O设备与内存之间开辟一条直接数据传输的通道,这个传输过程不需要CPU的介入。这个线程需要在某些位置上协调他们的工作次序而等待、传递信息所穿绳的。解决方案:DMA+硬件中断,DMA 的全称是 直接内存访问。
2025-09-29 00:49:51
572
原创 46.NAT、代理服务、内网穿透
假设交换机记录了所有主机的位置,当主机A向主机D发送数据时,交换机判定到A和D位于交换机的左侧,它就会把报文拦下,不再转发给右侧,减少了右侧的碰撞。直播平台服务器可以利用内网打洞,将主机A发送的数据直接给到具体的看直播客户端,那么直播平台服务器压力就减轻了,同时它自身的流量消耗也就减少了(步骤2:另一台主机上,直接访问frp云服务器的8888端口,就可以直接访问本地的linux机器的22号端口。正向代理服务器接收客户端的请求,然后将请求转发给目标服务器,最后将目标服务器的响应返回给客户端。
2025-09-28 22:51:58
954
原创 45.数据链路层
如果我们只知道目标主机的IP地址,不知道对方MAC地址,就无法给对方发送数据帧 -> 因此需要一种局域网协议,将IP地址转化成对应的MAC地址(ARP协议,地址解析协议)同一个子网中,一个主机怎么把数据交给另一台主机(局域网通信问题,数据链路层解决)对于其他主机:会传到ARP层,先确定op,然后进行对比目的IP地址。使用时间越短越好 -> 发送的数据帧应该要短。对于其他主机:只会传到MAC帧层,对比MAC地址。请求时用的是广播,所有主机必须受理。
2025-09-28 00:21:04
307
原创 44.网络层
不同内网IP可能重复 -> 但因为有NAT技术,不影响内网向网络通信(WAN口IP替换,由同一子网内IP不重复)-> NAT解决了网络地址不足的问题(查对应的路由表,拿着目标IP&子网掩码的结果,对比成功对应的5.0.0.0/8网络号,取到了对应的下一跳地址5.0.0.1/8。主机内部的走线比较密,电流会产生磁场,磁场也会影响电流,在电磁的相互影响下,可能发生比特位翻转的情况,造成数据出错。网络是被设计过的 -> 报文路由的时候,最核心的应该是理解网络是如何被设计的!IP协议解决的是主机到主机的问题 ->
2025-09-27 23:18:27
968
原创 43.传输层协议TCP(下)
struct file中包含 void *private_data指针指向 struct socket ->struct socket内部也有文件指针回指(通过struct file中的private_data指针指向对应的socket,socket在回指,实现了socket和文件file关联)。握手的通用场景:客户端向服务器发起建立连接请求,服务器作为给客户端提供服务的,被设定了要无脑提供服务,面对客户端发起建立连接请求不能拒绝,客户端可能重新连接的时候,IP不变,OS自动分配的端口号与上一次的重复了。
2025-09-26 21:39:37
1269
原创 42.传输层协议TCP(上)
客户端还是认为自己建立好了连接,给服务端发送数据,服务端接受到对应的数据就会发送设置好RST的TCP报头,要求客户端重新建立连接。发送缓冲区看成一个字符数组,那么发送缓冲区,每一个字节,天然不就有编号了!特定的时间间隔,收不到应答,判定报文丢失!发出应答,不管这个应答有没有丢失,它都认为自己已经建立连接了。序号的作用:确认应答,按序到达,去重。通信的过程中,连接出现任何问题,都可以进行重置!服务端要收到这个应答才能表明建立连接了。4位比特位,基本单位是4字节。如果超过一定重传次数。
2025-09-25 00:23:31
958
原创 41.传输层协议UDP
在TCP/IP协议中, 用 "源IP", "源端⼝号", "目的IP", "目的端口号", "协议号(传输层协议的类型:UDP/TCP)" 这样一个五元组来标识一个通信(可以通过netstat -n查看);我们注意到, UDP协议首部中有一个16位的最大长度. 也就是说⼀个UDP能传输的数据最大长度是 64KB(包含UDP首部).如果我们需要传输的数据超过64K, 就需要在应用层手动地分包, 多次发送, 并在接收端手动拼装;层交给UDP多长的报文, UDP原样发送, 既不会拆分, 也不会合并;
2025-09-24 21:46:46
396
原创 40.应用层协议HTTP(三)
建立连接:tcp三次握手,accept,fork或者pthread_create,网页中有一张图片就要发送一次请求,如果图片等资源很多的话,消耗太大了。下一次请求这个资源时,服务器发送请求会自动携带cookie文件(Cookie报头携带内容),这样就不用用户主动输入了。下一次请求只用把这个session id携带上,这样就不用用户再次输入了,且账号密码不是明文传输了,更安全了。但是相对于纯cookie,他的密码和账号不是明文了,对于转账支付等场景就解决了。用户私密信息,在服务端保存了。
2025-09-24 00:47:22
1086
原创 39.应用层HTTP协议(二)
计算出文件大小,根据文件大小来读取,推荐的C++容器,std::vector<char>。也可以使用破坏封装性的std::string来读取,读取前先resize成文件大小。HTTP请求和响应结构中的Content-Length字段。端告知服务器, 所请求的资源是在哪个主机的哪个端口上;Linux-remote: linux远程仓库。声明用户的操作系统和浏览器版本信息;当前页面是从哪个页面跳转过来的;
2025-09-23 17:08:32
302
原创 38.应用层协议HTTP(一)
点击链接的时候,浏览器会形成新的访问地址,发送二次请求 -> 我们请求的资源,都是通过http request的 URI 表示的。http请求的本质,其实就是请求我们代码中的 ./wwwroot 目录下的特定路径下的资源。/a/b/c.html ,访问的是其他页面:./webroot + /a/b/c.html。/ ,访问的是首页:./webroot + /index.html。IP不利用人的阅读,人看不出含义。而URL中的路径,就是我们要请求的资源的路径。首页作为站点的入口,一个网站就是一颗多叉树。
2025-09-22 18:25:19
880
1
原创 37.应用层自定义协议与序列化
网络版本计算器源码:Linux-remote: linux远程仓库https://gitee.com/its-quite-six/linux-remote/tree/master/25_9_20/NetCal
2025-09-21 05:30:53
773
原创 36.Socket网络编程(TCP)
张三把他们带到饭店门口,喊了一声,来客人了,出来接待一下,这时李四出来接待了,给他们一行人服务(端茶倒水,点餐)这样子进程退出就会被自动回收(推荐)成功,返回文件描述符(此文件描述符是专门用来跟客户端进行通信的)最重要是pid值会被覆盖,导致之前的子进程无法被回收,内存泄漏。实现一个不能被拷贝和赋值的类:继承一个不能被拷贝和赋值的父类。就只有num-1个休眠,第一个还在一直处理,就无法进行了。Linux-remote: linux远程仓库。张三是在马路边上揽客的。张三转头回去继续揽客了。
2025-09-18 06:05:15
1012
原创 35.Socket网络编程(UDP)(下)
InetAddr的构造函数要把_peer清0后使用,并且_peer的sin_family字段要设置成AF_INET,不然Route用来转发时,客户端收不到。定义一个Route管理类,用vector组织管理客户端信息InetAddr;客户端不止一个(客户端信息不止一条),如何管理这些客户端信息呢?Linux-remote: linux远程仓库。Linux-remote: linux远程仓库。Linux-remote: linux远程仓库。inet_ntoa(线程不安全)InetAddr.hpp实现。
2025-09-17 23:58:45
1111
原创 34.Socket编程(UDP)(上)
不需要,首次发送消息OS会自动给client进行bind,OS知道IP,端口号采用随机端口号的方式。(端口号是几不重要,唯一就行了)2.未来有很多应用,端口号固定可能会导致冲突,无法bind,必须由OS随机分配。1. 一个端口号只能被一个进程所持有(端口号要找到唯一一个进程)本地环回(localhost, 127.0.0.1)UdpSocket编程V1(EchoServer)点分十进制字符串IP 转 32位网络序列IP。客户端如何知道服务端IP和端口。服务端bind时不显式绑定IP。
2025-09-15 21:45:08
794
原创 33.网络基础概念(三)
内存中的多字节数据相对于内存地址有大端和小端之分, 磁盘文件中的多字节数据相对于文件中的偏移地址也有大端小端之分, 网络数据流同样有大端小端之分. 那么如何定义网络数据流的地址呢?: 操作系统动态分配的端口号. 客户端程序的端口号, 就是由操作系统从这个范。拓展:一个进程可以对应多个端口号,一个端口号只能对应一个进程。等这些广为使用的应用层协议, 他们的端口号都是固定的.User Datagram Protocol 用户。先发出的数据是低地址,后发出的数据是高地址。面向数据报(数据是一块一块传输的)
2025-09-14 17:42:12
606
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅