自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(132)
  • 收藏
  • 关注

原创 Redis——5种数据类型的底层数据结构

转发自:Redis中5种数据类型的底层数据结构_redis 数据类型以及底层数据-CSDN博客

2025-01-16 14:34:48 337

原创 Redis——过期策略、内存淘汰机制

volatile-lru:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,移除最近最少使用的key。不是的,如果定期删除没删除key。当再次向内存空间加入E时,这时内存空间又不足了,选择在内存空间中待的最久的C将其淘汰出内存,这时的内存空间存放的对象就是E->B->D。volatile-ttl:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,有更早过期时间的key优先移除。当加入D时,就出现了问题,内存空间不够了,因此根据LRU算法,内存空间中A待的时间最为久远,选择A,将其淘汰。

2025-01-16 14:32:40 842

原创 Redis的过期策略、内存淘汰机制

volatile-lru:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,移除最近最少使用的key。不是的,如果定期删除没删除key。当再次向内存空间加入E时,这时内存空间又不足了,选择在内存空间中待的最久的C将其淘汰出内存,这时的内存空间存放的对象就是E->B->D。volatile-ttl:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,有更早过期时间的key优先移除。当加入D时,就出现了问题,内存空间不够了,因此根据LRU算法,内存空间中A待的时间最为久远,选择A,将其淘汰。

2025-01-14 12:30:40 525

原创 Redis缓存穿透、缓存雪崩和缓存击穿

一般的缓存系统,都是按照key去缓存查询,如果不存在对应的value,就应该去后端系统查找(比如DB)。可以把所有的可能存在的key放到一个大的Bitmap中,查询时通过该bitmap过滤。,请求量很大,就会对后端系统造成很大的压力。,造成瞬时DB请求量大、压力骤增,引起雪崩。,大并发集中对这一个点进行访问,当这个。对查询结果为空的情况也进行缓存,,就像在一个屏障上凿开了一个洞。,持续的大并发就穿破缓存,

2025-01-14 12:29:31 415

原创 Redis架构模式详解

(0~16383)个哈希槽,存储在Redis Cluster中的所有键都会被映射到这些slot中,集群中的每个键都属于这16384个哈希槽中的一个,集群使用公式slot=CRC16(key)/16384来计算key属于哪个槽,其中CRC16(key)语句用于计算key的CRC16 校验和。Redis 集群的键空间被分割为 16384 hash个槽(slot), 集群的最大节点数量也是。数据通过异步复制,不保证数据的强一致性,这意味这在实际中集群在特定的条件下可能会丢失写操作。

2025-01-06 18:41:34 656

原创 Redis持久化详解

AOF文件在发生断电等问题时也不会损坏,即使出现了某条日志只写入了一半的情况,也可以使用redis-check-aof工具轻松修复。,在进行了某些错误的数据清除操作后,只要AOF文件没有rewrite,就可以把AOF文件备份出来,把错误的命令删除,然后恢复数据。如前文所述,Redis在保存RDB快照时会fork出子进程进行,几乎不影响Redis处理客户端请求的效率。那么为什么会优先加载AOF呢?,重启时在重新执行AOF文件中的命令达到恢复数据的目的。,通过上面的分析我们知道AOF基本上最多损失1s的数据。

2025-01-06 18:40:33 775

原创 Redis事务详解

一般情况下Redis在接受到一个client发来的命令后会立即处理并 返回处理结果,但是当一个client在一个连接中发出multi命令有,这个连接会进入一个事务上下文,该连接后续的命令并不是立即执行,而是先放到一 个队列中。例如,这个命令可能会有语法错误(参数的数量错误、命令名称错误,等等),或者可能会有某些临界条件(例如:如果使用maxmemory指令,为Redis服务器配置内存限制,那么就可能会有内存溢出条件)。,其中的每个元素都分别是事务中的每个命令的返回值,返回值的顺序和命令的发出顺序是相同的。

2025-01-05 19:06:37 639

原创 Redis所支持的数据类型

来保证数据的存储和有序,HashMap里放的是成员到score的映射,而跳跃表里存放的是所有的成员,排序依据是HashMap里存的score,使用跳跃表的结构可以获得比较高的查找效率,并且在实现上比较简单。,set是一个很好的选择,并且set提供了判断某个成员是否在一个set集合内的重要接口,这个也是list所不能提供的。又或者在微博应用中,每个用户关注的人存在一个集合中,就很容易实现。可以理解为一堆值不重复的列表,类似数学领域中的集合概念,且Redis也提供了针对集合的求交集、并集、差集等操作。

2025-01-05 19:05:13 702

原创 Redis简介

Redis(Remote Dictionary Server:远程字典服务)是一个开源的使用 ANSI C 语言编写、遵守 BSD 协议、支持网络、可基于内存亦可持久化的日志型、Key-Value 数据库,并提供多种语言的 API的非关系型数据库。传统数据库遵循 ACID 规则。而 Nosql(Not Only SQL 的缩写,是对不同于传统的关系型数据库的数据库管理系统的统称) 一般为分布式,而分布式一般遵循 CAP 定理。

2024-12-25 21:14:21 1187

原创 如何编写高性能服务端程序

一个TCP连接的建立,要在客户端和服务端之间,完成三次握手,然后。任何影响accept取连接的因素,都会影响并发度。nginx只是具有反向代理和负载均衡的功能,3、应用服务器的处理水平又该怎么提高?等策略,提高数据库处理能力,减少压力!2、那么多的连接数怎么进行业务处理?一、提高并发能力必须解决的问题。1、如何提高并发连接数?等策略,来提升代码性能。二、高性能服务端编程框架。(1)代码中的业务逻辑。

2024-12-25 21:01:34 328

原创 C++11特性总结

C++11包括大量的新特性:主要特征像lambda表达式和移动语义,实用的类型推导关键字auto,更简单的容器遍历方法,和大量使模板更容易使用的改进。这一系列教程将包含所以以上特性。很明显,C++11为C++带来了大量的新特性。C++11将修复大量缺陷和降低代码拖沓,比如lambda表达式的支持将使代码更简洁。像移动语义这种特性会提高语言内核的基础效率,使你可以写出更快的代码。对模板系统的优化可以使你更容易写出泛型的代码。

2024-12-24 21:27:26 1132

原创 网络协议入门

它们读取这个包的“标头”,找到接收方的 MAC 地址,然后与自身的 MAC 地址相比较,如果两者相同,就接受这个包,做进一步处理,否则就丢弃这个包。TCP 数据包没有长度限制,理论上可以无限长,但是为了保证网络的效率,通常 TCP 数据包的长度不会超过 IP 数据包的长度,以确保单个 TCP 数据包不必再分割。(“路由”就相当于现象生活中的路标,规定这些数据包的走向,就是指如何向不同的子网络分发数据包,这是一个很大的主题,本文不涉及。上面提到,以太网数据包的“标头”,包含了发送者和接受者的信息。

2024-12-24 20:19:16 1308

原创 【深度学习】一文搞懂卷积神经网络(CNN)的原理(超详细)

在卷积神经网络中,卷积操作是指将一个可移动的小窗口(称为数据窗口,如下图绿色矩形)与图像进行逐元素相乘然后相加的操作。这个小窗口其实是一组固定的权重,它可以被看作是一个特定的滤波器(filter)或卷积核。这个操作的名称“卷积”,源自于这种元素级相乘和求和的过程。这一操作是卷积神经网络名字的来源。上图这个绿色小窗就是数据窗口。简而言之,卷积操作就是用一个可移动的小窗口来提取图像中的特征,这个小窗口包含了一组特定的权重,通过与图像的不同位置进行卷积操作,网络能够学习并捕捉到不同特征的信息。

2024-12-12 15:16:22 2307

原创 神经网络基础

神经网络是人工智能领域的关键技术,它们的构造基于神经元的灵感,并结合了数学、统计和机器学习的原理。输入可以类比为神经元的树突,而输出可以类比为神经元的轴突,计算则可以类比为细胞核。3、结构图里的关键不是圆圈(代表“神经元”),而是连接线(代表“神经元”之间的连接)。输入和权重:人工神经元接收多个输入,每个输入都有一个相关联的权重,这相当于人工神经网络的记忆。隐藏层:这是神经网络的核心部分,包含多个层次的神经元。输出层:根据学到的特征生成最终的输出,可以是分类标签、数值或其他任务相关的结果。

2024-12-12 15:15:14 1170

原创 Linux网络编程——进程、线程同步方式

要注意这里的同步并不是指同时进行的意思,而是按照先后顺序依次进行。

2024-12-04 21:57:03 937

原创 Linux网络编程——5种io模型

tcp服务器分为了5种io复用模型,分别是:阻塞io模型 ,非阻塞io模型,io复用,信号驱动io,异步io本文会讲前面3种io模型的tcp服务器实现(本文只做tcp服务器实现,客户端逻辑处理,接收数据等缓冲区不做深入说明)

2024-12-04 21:43:49 605

原创 C++多线程——原子操作(atomic)

所谓的原子操作,取的就是“原子是最小的、不可分割的最小个体”的意义,它表示在多个线程访问同一个全局资源的时候,能够确保所有其他的线程都不在同一时间内访问相同的资源。也就是他确保了在同一时刻只有唯一的线程对这个资源进行访问。这有点类似互斥对象对共享资源的访问的保护,但是原子操作更加接近底层,因而效率更高。原子操作不需要加锁。原子类型对象的主要特点就是从不同线程访问不会导致数据竞争(data race)。

2024-12-02 19:58:10 176

原创 C++多线程——访问异步操作结果(future)和条件变量(condition_variable)

当std::condition_variable对象的某个wait函数被调用的时候,它使用std::unique_lock(通过std::mutex) 来锁住当前线程。当前线程会一直被阻塞,直到另外一个线程在相同的std::condition_variable对象上调用了notification函数来唤醒当前线程。condition_variable成员函数:condition_variable: 不可拷贝不可赋值;notify_one():唤醒一个等待的线程;

2024-12-02 19:55:54 408

原创 C++多线程——锁对象(lock_guard和unique_lock)

lock_guard和unique_lock都是RAII机制下的锁,即依靠对象的创建和销毁也就是其生命周期来自动实现一些逻辑,而这两个对象就是在创建时自动加锁,在销毁时自动解锁。所以如果仅仅是依靠对象生命周期实现加解锁的话,两者是相同的,都可以用,因跟生命周期有关,所以有时会用花括号指定其生命周期。但lock_guard的功能仅限于此。unique_lock是对lock_guard的扩展,允许在生命周期内再调用lock和unlock来加解锁以切换锁的状态。

2024-11-29 20:27:00 1038

原创 C++多线程——互斥量mutex

std::mutex 介绍下面以 std::mutex 为例介绍 C++11 中的互斥量用法。std::mutex 是C++11 中最基本的互斥量,std::mutex 对象提供了独占所有权的特性——即不支持递归地对 std::mutex 对象上锁,而 std::recursive_lock 则可以递归地对互斥量对象上锁。std::mutex 的成员函数1、构造函数,std::mutex不允许拷贝构造,也不允许 move 拷贝,最初产生的 mutex 对象是处于 unlocked 状态的。

2024-11-29 20:18:33 897

原创 C++多线程——线程

进程是一个具有独立功能程序的运行实体,如某一个程序,运行时便产生一个进程;通常一个进程包含一个或多个线程。普通C程序多是只含有一个线程的进程,但是大多数情况下遇到的是多线程的进程。(2). 初始化构造函数,创建一个 thread对象,该 thread对象可被 joinable,新产生的线程会调用 fn 函数,该函数的参数由 args 给出。线程与进程都是操作系统的概念。不同进程之间相互独立,同一进程的线程共享该进程的地址空间及其他资源。(1). 默认构造函数,创建一个空的 thread 执行对象。

2024-11-27 21:15:03 754

原创 Linux网络编程——内网和外网之间的通信

所以,A 家庭的局域网 IP 和 B 家庭的局域网 IP 相同很正常,但是,最终 A 和 B 能上网(数据走出去)还是通过运营商的公有 IP,毕竟,公有 IP 的资源有限,这一片区域的用户使用的很有可能(实际上就是这样的)是同一个公有 IP,这样的话,又回到前面的问题,假如 A 和 B 的局域网 IP 相同(192.168.31.11),当他们同时访问百度服务器的时候,百度服务器如何区分哪个是 A,哪个是 B 呢?,通常指的是出口,转发来自内部 LAN 接口的 IP 数据包,这个口的 IP 是唯一的。

2024-11-27 21:08:32 919

原创 Linux网络编程——epoll原理详解及epoll反应堆模型

设想一个场景:有100万用户同时与一个进程保持着TCP连接,而每一时刻只有几十个或几百个TCP连接是活跃的(接收TCP包),也就是说在每一时刻进程只需要处理这100万连接中的一小部分连接。那么,如何才能高效的处理这种场景呢?进程是否在每次询问操作系统收集有事件发生的TCP连接时,把这100万个连接告诉操作系统,然后由操作系统找出其中有事件发生的几百个连接呢?实际上,在Linux2.4版本以前,那时的select或者poll事件驱动方式是这样做的。

2024-11-25 10:00:00 2366

原创 Linux网络编程——IO 多路复用之poll(高效并发服务器)

poll的实现和 select非常相似,只是描述 fd 集合的方式不同,poll使用 pollfd 结构而不是 select的 fd_set 结构,其他的都差不多。poll在应付大数目的文件描述符的时候相比于select速度更快;它没有最大连接数的限制,可以突破1024监听上限。大量的fd的数组被整体复制于用户态和内核地址空间之间,而不管这样的复制是不是有意义;与select一样,poll返回后,需要轮询pollfd来获取就绪的描述符。

2024-11-25 08:00:00 478

原创 Linux网络编程——IO 多路复用之select(高效并发服务器)

【优点】:select目前几乎在所有的平台上支持,其良好跨平台支持也是它的一个优点。每次调用 select(),都需要把 fd 集合从用户态拷贝到内核态,这个开销在 fd 很多时会很大,同时每次调用 select() 都需要在内核遍历传递进来的所有 fd,这个开销在 fd 很多时也很大;单个进程能够监视的文件描述符的数量存在最大限制,在 Linux 上一般为 1024,可以通过修改宏定义甚至重新编译内核的方式提升这一限制,但是这样也会造成效率的降低。

2024-11-24 19:18:35 867

原创 STM32F103系列单片机通用和复用I/O(GPIO)

每个GPI/O端口有两个32位配置寄存器(GPIOx_CRL, GPIOx_CRH),两个32位数据寄存器(GPIOx_IDR和GPIOx_ODR),一个32位置位/复位寄存器(GPIOx_BSRR),一个16位复位寄存器(GPIOx_BRR)和一个32位锁定寄存器(GPIOx_LCKR)。

2024-11-24 16:25:13 1076

原创 Linux系统编程——多进程和多线程并发服务器编程模型

在网络程序里面,一般来说都是许多客户对应一个服务器(多对一),为了处理客户的请求,对服务端的程序就提出了特殊的要求。

2024-11-23 16:36:58 887

原创 Linux系统编程——TCP协议详解(TCP报文、三次握手、四次挥手、TIME_WAIT状态、滑动窗口、拥塞控制、粘包问题、状态转换图)

我们知道服务端收到ACK,关闭连接。但是客户端无法知道ACK是否已经到达服务端,于是开始等待?等待什么呢?假如ACK没有到达服务端,服务端会为FIN这个消息超时重传 timeout retransmit ,那如果客户端等待时间足够,又收到FIN消息,说明ACK没有到达服务端,于是再发送ACK,直到在足够的时间内没有收到FIN,说明ACK成功到达。这个等待时间至少是:服务端的timeout + FIN的传输时间,为了保证可靠,采用更加保守的等待时间2MSL。

2024-11-23 16:30:59 1014

原创 Linux网络编程——TCP协议简介

TCP(Transmission Control Protocol 传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议。

2024-11-17 18:37:11 1046

原创 Linux网络编程——UDP广播与多播

使用UDP协议进行信息的传输之前不需要建议连接。换句话说就是客户端向服务器发送信息,客户端只需要给出服务器的ip地址和端口号,然后将信息封装到一个待发送的报文中并且发送出去。至于服务器端是否存在,或者能否收到该报文,客户端根本不用管。网络上的广播指由一台主机向该主机所在子网内(同一个局域网)的所有主机发送数据的方式。

2024-11-17 18:26:14 981

原创 Linux网络编程——UDP协议详解

UDP 是 User Datagram Protocol 的简称, 中文名是用户数据报协议,是一个简单的面向数据报的传输层协议,在网络中用于处理数据包,是一种无连接的协议。UDP不提供可靠性的传输,它只是把应用程序传给 IP 层的数据报发送出去,但是并不能保证它们能到达目的地。由于 UDP 在传输数据报前不用在客户和服务器之间建立一个连接,且没有超时重发等机制,故而传输速度很快。

2024-11-13 23:02:11 1475

原创 Linux网络编程——socket套接字及缓冲区详解

每个 socket 被创建后,都会分配两个缓冲区,输入缓冲区和输出缓冲区。并不立即向网络中传输数据,而是先将数据写入缓冲区中,再由TCP协议将数据从缓冲区发送到目标机器。一旦将数据写入到缓冲区,函数就可以成功返回,不管它们有没有到达目标机器,也不管它们何时被发送到网络,这些都是TCP协议负责的事情。函数也是如此,也从输入缓冲区中读取数据,而不是直接从网络中读取。I/O缓冲区在每个TCP套接字中单独存在;I/O缓冲区在创建套接字时自动生成;即使关闭套接字也会继续传送输出缓冲区中遗留的数据;

2024-11-13 22:53:27 931

原创 用C++实现一个李峋爱心代码

本专栏会不定时更新,如果有有趣的C++代码或者编程可以在评论区留言,我会尽量满足粉丝的要求,同时还希望看到的朋友点个赞/收藏(感谢/感谢)该代码需要用到#include <graphics.h>头文件,需要进行相关配置。代码:执行结果:此爱心会动的哦!

2024-11-11 19:48:15 699 3

原创 Linux网络编程——网络字节序和IP地址详解

字节序是指多字节数据的存储顺序,在设计计算机系统的时候,有两种处理内存中数据的方法:大端格式、小端格式。小端格式(Little-Endian):将低位字节数据存储在低地址;大端格式(Big-Endian):将高位字节数据存储在低地址。

2024-11-11 14:59:42 1183

原创 Linux网络编程——无连接和面向连接协议的区别(UDP,TCP)

从协议的角度来看,每个数据报都是一个独立的实体,与在两个相同的对等实体之间传送的任何其他数据报都没有关系,这就意味着协议很可能是不可靠的。回到与电话/寄信的类比中来,我们可以把 TCP 连接中的网络地址当作一个办公室总机的电话号码,把端口号当作办公室中某台正被呼叫的特定电话的分机号。面向连接的协议则维护了分组之间的状态,使用这种协议的应用程序通常都会进行长期的对话。对无连接协议来说,每个分组的处理都独立于所有其他分组,而对面向连接的协议来说,协议实现则维护了与后继分组有关的状态信息。它们的本质区别在于,

2024-11-10 20:31:58 1027

原创 Linux网络编程——网络协议入门

它们读取这个包的“标头”,找到接收方的 MAC 地址,然后与自身的 MAC 地址相比较,如果两者相同,就接受这个包,做进一步处理,否则就丢弃这个包。TCP 数据包没有长度限制,理论上可以无限长,但是为了保证网络的效率,通常 TCP 数据包的长度不会超过 IP 数据包的长度,以确保单个 TCP 数据包不必再分割。(“路由”就相当于现象生活中的路标,规定这些数据包的走向,就是指如何向不同的子网络分发数据包,这是一个很大的主题,本文不涉及。上面提到,以太网数据包的“标头”,包含了发送者和接受者的信息。

2024-11-10 20:29:03 936

原创 Linux系统编程——线程池和内存池

服务器程序利用线程技术响应客户请求已经司空见惯,但是线程的使用是有待优化和处理的。单线程执行并不是一个高效的方式,这个时候可能就要考虑高并发,多线程等方式。线程池也是线程优化的一种方式。在面向对象的过程中,对象的创建和销毁是非常占资源的,每创建一个对象都要获取内存资源以及其他一些资源。这就产生了“池化技术”。【线程池如何提高服务器程序的性能?单线程的情况下,系统花大量的时间再T1、T3阶段。我们要采取最优的措施,减少T1和T3的系统开销。

2024-11-07 22:23:15 926

原创 Linux系统编程——多线程的同步与互斥(互斥锁、条件变量、读写锁、自旋锁、信号量)

现代操作系统基本都是多任务操作系统,即同时有大量可调度实体在运行。【同步】:是指散步在不同任务之间的若干程序片断,它们的运行必须严格按照规定的某种先后次序来运行,这种先后次序依赖于要完成的特定的任务。最基本的场景就是:两个或两个以上的进程或线程在运行过程中协同步调,按预定的先后次序运行。比如 A 任务的运行依赖于 B 任务产生的数据。【互斥】:是指散步在不同任务之间的若干程序片断,当某个任务运行其中一个程序片段时,其它任务就不能运行它们之中的任一程序片段,只能等到该任务运行完这个程序片段后才可以运行。

2024-11-07 10:45:20 1036

原创 Linux系统编程——线程概述、线程控制和线程私有数据

在许多经典的操作系统教科书中,总是把进程定义为程序的执行实例,它并不执行什么, 只是维护应用程序所需的各种资源,而线程则是真正的执行实体。在一个进程中的多个执行路线叫做线程。为了让进程完成一定的工作,进程必须至少包含一个线程。线程又叫轻量级进程(LWP)。线程会共享进程的一些资源,也有一些资源是线程独立拥有的。但是不同进程的线程是不共享资源的。【共享】:代码区、数据区、堆区(注意没有栈区)、环境变量和命令行参数、文件描述符、信号处理函数、当前目录、用户 ID 和组 ID 等。

2024-11-05 22:49:10 1323

原创 Linux系统编程——信号发送与信号处理

进程可以通过kill函数向包括它本身在内的其他进程发送一个信号,如果程序没有发送这个信号的权限,对kill函数的调用就将失败,而失败的常见原因是目标进程由另一个用户所拥有。功能: 把信号sig发送给进程号为pid的进程。参数:pid:取值有 4 种情况:pid > 0:将信号传送给进程 ID 为pid的进程;pid = 0:将信号传送给当前进程所在进程组中的所有进程;pid = -1:将信号传送给系统内所有的进程;pid < -1:将信号传给指定进程组的所有进程。

2024-11-05 22:27:47 983

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除