自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 redis设计与实现(五)RDB与AOF持久化

因为AOF持久化是通过保存被执行的写命令来记录数据库状态的,AOF文件中的内容会越来越多,体积过大的AOF文件很可能对Redis服务器、甚至整个宿主计算机造成影响,并且AOF文件的体积越大,使用AOF文件来进行数据还原所需的时间就越多。不过,使用子进程也有一个问题需要解决,因为子进程在进行AOF重写期间,服务器进程还需要继续处理命令请求,而新的命令可能会对现有的数据库状态进行修改,从而使得服务器当前的数据库状态和重写后的AOF文件所保存的数据库状态不一致。

2024-06-15 14:55:18 913

原创 redis设计与实现(四)服务器中的数据库

过期键的定期删除策略由redis.c/activeExpireCycle函数实现,每当Redis的服务器周期性操作redis.c/serverCron函数执行时,activeExpireCycle函数就会被调用,它在规定的时间内,分多次遍历服务器中的各个数据库,从数据库的expires字典中随机检查一部分键的过期时间,并删除其中的过期键。如果没有过期,就返回该键。定时删除:在设置键的过期时间的同时,创建一个定时器(timer),让定时器在键的过期时间来临时,立即执行对键的删除操作。

2024-06-11 16:42:31 1412 1

原创 redis设计与实现(三)集合对象和有序对象

除此之外,zset结构中的dict字典为有序集合创建了一个从成员到分值的映射,字典中的每个键值对都保存了一个集合元素:字典的键保存了元素的成员,而字典的值则保存了元素的分值。zset结构中的zsl跳跃表按分值从小到大保存了所有集合元素,每个跳跃表节点都保存了一个集合元素:跳跃表节点的object属性保存了元素的成员,而跳跃表节点的score属性则保存了元素的分值。intset编码的集合对象使用整数集合作为底层实现,集合对象包含的所有元素都被保存在整数集合里面。集合对象保存的所有元素都是整数值;

2024-06-09 13:04:53 676

原创 redis设计与实现(三)整数集合与压缩列表

虽然contents数组保存的四个整数值中,只有-2675256175807981027是真正需要用int64_t类型来保存的,而其他的1、3、5三个值都可以用int16_t类型来保存,不过根据整数集合的升级规则,当向一个底层为int16_t数组的整数集合添加一个int64_t类型的整数值时,整数集合已有的所有元素都会被转换成int64_t类型,所以contents数组保存的四个整数值都是int64_t类型的,不仅仅是-2675256175807981027。

2024-06-06 09:17:25 1064

原创 redis设计与实现(二)字典

根据BGSAVE命令或BGREWRITEAOF命令是否正在执行,服务器执行扩展操作所需的负载因子并不相同,这是因为在执行BGSAVE命令或BGREWRITEAOF命令的过程中,Redis需要创建当前服务器进程的子进程,而大多数操作系统都采用写时复制(copy-on-write)技术来优化子进程的使用效率,所以在子进程存在期间,服务器会提高执行扩展操作所需的负载因子,从而尽可能地避免在子进程存在期间进行哈希表扩展操作,这可以避免不必要的内存写入操作,最大限度地节约内存。分配一个空白哈希表,如图4-11所示。

2024-06-04 13:17:36 1015

原创 Redis设计与实现(一)SDS与C字符串的对比

sds的定义:可以看到,这四种的整体结构是很像的,区别只是 len alloc 的取值范围不同,意即它们能容纳的 sds 字节数不同。SDS遵循C字符串以空字符结尾的惯例,好处是SDS可以直接重用一部分C字符串函数库里面的函数。举个例子:打印出SDS保存的字符串值,而无须为SDS编写专门的打印函数。

2024-06-02 18:28:27 1042

原创 ARP(Address Resolution Protocol)地址解析协议详解

ARP请求包含目的主机的IPv4地址。如果ARP缓存中没有找到对应的MAC地址,那么设备会广播一个ARP请求,询问拥有那个IP地址的设备的MAC地址是什么。但在某些情况下,发送者已经知道目标主机的MAC地址,例如它们之前有过通信,此时发送者就可以直接构造数据帧并发送到目标MAC地址,而不需要再进行ARP请求和广播过程,这就是ARP的直接交付。ARP地址解析协议的直接交付,是指在一个局域网(LAN)内部进行数据帧传输时,不需要经过ARP解析过程,而是直接将数据帧发送到目标主机的MAC地址。

2024-05-30 12:27:19 1002

原创 IO多路复用之select poll epoll

为什么用IO多路复用?假设用一个线程对应一个客户端,一个线程8M,假设有1万个线程,有8G,消耗内存,且性能不高。所以我们用一个线程来完成多个客户端的连接,因此使用IO多路复用。

2024-05-02 11:30:00 1198 1

原创 网络连接的过程

协议族决定了socket的地址类型,在通信中必须采用对应的地址,如AF_INET决定了要用ipv4地址(32位的)与端口号(16位的)的组合、AF_UNIX决定了要用一个绝对路径名作为地址。内核为每个由服务器进程接受的客户连接创建了一个已连接socket描述字,当服务器完成了对某个客户的服务,相应的已连接socket描述字就被关闭。SOCK_STREAM式套接字的通信双方均需要具有地址,其中服务器端的地址需要明确指定,ipv4的指定方法是使用 struct sockaddr_in类型的变量。

2024-05-01 13:54:10 797

原创 并发锁与线程池(三)

线程池是一种用于管理线程的并发机制,它允许程序重复使用一组已创建的线程,而不是为每个任务创建和销毁单独的线程。线程池通过减少线程创建和销毁的开销来提高性能,特别是在处理大量短生命周期的任务时。线程池管理器:负责创建、管理线程池中的线程,并分配任务给线程。工作线程:线程池中的线程,它们等待任务并被分配任务来执行。任务队列:存放待处理的任务。线程池管理器会从任务队列中取出任务分配给工作线程。线程池的工作流程通常如下:当一个任务到达时,线程池管理器检查是否有空闲的线程可以处理该任务。

2024-03-30 10:26:40 338

原创 并发锁与线程池(二)

并发锁与线程池(二)

2024-03-29 19:11:39 471 1

原创 并发锁与线程池(一)

它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。在多核或多CPU系统中,线程可以被调度到不同的核心上执行,从而实现真正的。而在单核系统中,线程通过时间分片(time slicing)的方式进行并发执行,操作系统会快速地在,给人一种同时执行的错觉。

2024-03-27 19:09:20 1515

原创 Linux C 编程实现通讯录

每一层都有其明确的职责,使得代码更易于理解和修改。当需要对某一层进行修改或优化时,可以专注于该层,而不必担心影响到其他层的代码。load_file()`:负责将联系人信息保存到文件和从文件中加载联系人信息。在写代码前,构建其代码层次, 使代码具有模块化。:解析文件中的字符串,提取联系人的姓名和电话。至于为什么使用宏可以看这篇文章。数据层中的save_file()

2024-03-26 21:54:01 306

原创 为什么使用宏

但是,如果你发现这个计算非常频繁,而且这个函数非常简单,你可能会想:“每次调用函数都有一定的开销,如果能够避免这个开销就好了。当你编译程序时,预处理器会看到 AREA(10, 20) 这样的宏调用,并将其替换为 (10 * 20)。这样,编译器最终看到的代码是。假设你在写一个程序,需要多次计算一个长方形的长和宽的乘积(面积)。

2024-03-20 21:00:53 218

原创 状态机实现单词统计

当我们在统计单词的时候,由两部分组成。(表示不属于单词的范畴),另一部分为。(表示属于单词的范畴)。我们通常所说的状态机是。

2024-03-20 18:49:40 1687 1

空空如也

空空如也

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

TA关注的人

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