自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Redis集群

要避免这种单点故障,最好的办法是将数据备份到其他服务器上,让这些服务器也可以对外提供服务,这样即使有一台服务器出现了故障,其他服务器依然可以继续提供服务。

2023-07-16 19:48:17 726

原创 Ubuntu下搭建Redis分片集群

​​​​​​​分片集群需要的节点数量较多,搭建一个最小的分片集群,包含3个master节点,每个master包含一个slave节点,并且master之间通过心跳机制互相监听,此模式下不需要哨兵监听结构如下。

2023-07-16 12:28:29 815

原创 Ubuntu下配置Redis哨兵集群

搭建一个三节点形成的Sentinel集群,来监管Redis主从集群。

2023-07-16 11:59:30 892

原创 Ubuntu下搭建Redis主从集群

共包含三个节点,一个主节点,两个从节点。这里我们会在同一台虚拟机中开启3个redis实例,模拟主从集群,信息如下。

2023-07-16 11:21:55 869

原创 Redis数据类型 — Hash

Hash 是一个键值对(key - value)集合,Hash 特别适合用于存储对象。

2023-07-15 19:53:13 188

原创 Redis数据类型 — Zset

ZSet中每一个元素都需要指定一个score值和member值:可以根据score值排序后member必须唯一可以根据member查询分数。

2023-07-15 19:04:10 245

原创 Redis数据类型 — Set

Set 类型是一个,它的存储顺序不会按照插入的先后顺序进行存储。一个集合最多可以存储2^32-1个元素。Set 类型除了支持集合内的增删改查,同时还支持多个集合取。

2023-07-15 18:29:39 277

原创 Redis数据类型 — List

List 列表是简单的字符串列表,,可以向 List 列表添加元素。

2023-07-15 18:03:20 343

原创 Redis数据类型 — String

String 类型的底层的数据结构实现主要是数据结构:SDS。

2023-07-15 17:31:34 159

原创 Redis对象结构 — RedisObject

database内的这个映射关系是用⼀个dict来维护的。而value则比较复杂,为了在同⼀个dict内能够存储不同类型的value,这就需要⼀个通⽤的数据结构,这个通用的数据结构就是robj,全名是redisObject。,⼀个Redis节点包含多个database(非cluster模式下默认是16个,cluster模式下只能是1个),而一个database维护了从key space到object space的映射关系。我们可以看到,key的类型固定是string,而value可能的类型是多个。

2023-07-15 16:48:23 610

原创 Redis数据结构 — SkipList

跳表的优势是。

2023-07-14 20:33:56 588

原创 Redis数据结构 — Dict

哈希表优点在于,它。为解决哈希冲突,,在不扩容哈希表的前提下,将具有相同哈希值的数据串起来,形成链接起,以便这些数据在表中仍然可以被查询到。

2023-07-14 18:50:48 298

原创 Redis数据结构 — Listpack

quicklist 虽然通过控制 quicklistNode 结构里的压缩列表的大小或者元素个数,来减少连锁更新带来的性能影响,但是并没有完全解决连锁更新的问题。于是,Redis 在 5.0 新设计一个数据结构叫,目的是替代压缩列表,它最大特点是。

2023-07-14 16:44:44 1563

原创 Redis数据结构 — QuickList

QuickList的特点:是一个节点为ZipList的双端链表节点采用ZipList,解决了传统链表的内存占用问题控制了ZipList大小,解决连续内存空间申请效率问题中间节点可以压缩,进一步节省了内存缺点:内存增加,每扩展一次节点,都要记录其头信息。

2023-07-14 16:04:08 142

原创 Redis数据结构 — ZipList

可以通过表头三个字段(zllen)的长度直接定位,

2023-07-14 15:46:44 187

原创 Redis数据结构 — List

Redis 的 List 对象的底层实现之一就是链表。C 语言本身没有链表这个数据结构的,所以 Redis 自己设计了一个链表数据结构。

2023-07-14 14:40:02 1295

原创 Redis数据结构 — IntSet

IntSet是Redis中set集合的一种实现方式,基于整数数组来实现,并且具备等特征。

2023-07-13 21:19:51 137

原创 Redis数据结构 — SDS

字符串在 Redis 中是很常用的,中的是字符串类型,也是字符串类型Redis 是用 C 语言实现的,但是它没有直接使用 C 语言的 char* 字符数组来实现字符串,而是自己封装了一个名为简单动态字符串(simple dynamic string,SDS) 的数据结构来表示字符串。

2023-07-13 20:07:27 250

原创 Redis消息队列

字面意思就是存放消息的队列。使用队列的好处在于。最简单的消息队列模型包括3个角色:消息队列:存储和管理消息,也被称为消息代理(Message Broker)生产者:发送消息到消息队列消费者:从消息队列获取消息并处理消息。

2023-07-09 17:12:44 873

原创 Redis缓存

缓存数据存储于代码中,而代码运行在内存中,内存的读写性能远高于磁盘,缓存可以大大降低服务器读写压力标准的操作方式就是查询数据库之前先查询缓存,如果缓存数据存在,则直接从缓存中返回,如果缓存数据不存在,再查询数据库,然后将数据存入redis。

2023-07-09 14:53:59 173

原创 Redis分布式锁

用C++编写的Redis分布式锁:满足分布式系统或集群模式下多进程可见并且互斥的锁。分布式锁的核心思想就是让大家都使用同一把锁,只要大家使用的是同一把锁,那么我们就能锁住线程,不让线程进行,让程序串行执行,这就是分布式锁的核心思路。

2023-07-07 16:37:18 144

原创 Redis通用命令&数据类型

ZINCRBY key increment member:让sorted set中的指定元素自增,步长为指定的increment值。获取sorted set 中的指定元素的排名:ZREVRANK key memeber。ZRANK key member:获取sorted set 中的指定元素的排名。获取sorted set 中的指定元素的排名:ZRANK key member。Hash 类型:缓存对象、购物车等。

2023-07-06 22:07:11 346

原创 Redis线程模式

关于线程数的设置,官方的建议是如果为 4 核的 CPU,建议线程数设置为 2 或 3,如果为 8 核 CPU 建议线程数设置为 6,线程数一定要小于机器核数,线程数并不是越大越好。Redis 6.0 版本支持的 I/O 多线程特性,默认情况下 I/O 多线程只针对。要想开启多线程处理客户端读请求,就需要把 Redis.conf 配置文件中的。初始化完后,主线程就进入到一个。,并不会以多线程的方式。配置项设为 yes。

2023-07-06 15:53:05 378

原创 Nginx原理

nginx服务器的网络模块设计,基于进程设计,采用多个Reactors充当I/O进程和工作进程,通过一把完美解决多个Reactors的“惊群现象”,并通过管理业务,并通过计算其偏移量来得到数据结构的指针地址,完成数据结构与业务层的解耦。同时使用技术,利用来传输小文件,利用来传输大文件。

2023-07-06 10:49:18 194

原创 Nginx正向代理、反向代理,动静分离

动态资源,静态资源分离是让动态网站里的动态网页根据一定规则把不变的资源和经常变的资源区分开来,动静资源做好了拆分以后,我们就可以根据静态资源的特点将其做缓存操作,这就是网站静态化的核心思路,动态资源,静态资源分离简单概括是:动态文件和静态文件的分离。此时,这种请求多的话,对于nginx可能会出现问题。正向代理和反向代理很有可能会存在一个应用场景下,正向代理代理客户端的请求去访问目标服务器,目标服务器是一个反向代理服务器,反向代理了多台真实的业务处理服务器。反向代理,主要用于服务器集群分布式部署的情况下,

2023-07-04 21:23:02 336

原创 Nginx负载均衡、虚拟主机

ngx_http_upstream_consistent_hash 模块是负载均衡器,使用一个内部一致性hash算法来选择 合适的后端节点。按访问的URL的哈希结果来分配请求,使每个URL定向到一台后端服务器,可以进一步提高后端缓存服务器的效率。根据后端服务器的连接状况进行分配客户请求,连接最少的服务器将被有限分配客户端请求。每个请求按访问IP的哈希结果分配,使来自同一个IP的访客固定访问一台后端服务器。按后端服务器的响应时间来分配请求,响应时间短的优先分配。,如果需要这种调度算法,则必须安装。

2023-07-04 17:07:31 620

原创 Git代码管理工具

一般存放在 .git 目录下的 index 文件(.git/index)中,所以我们把暂存区有时也叫作索引。由于你的本地 Git 仓库和 GitHub 仓库之间的传输是通过SSH加密的,所以我们需要配置验证信息。工作区有一个隐藏目录 .git,这个不算工作区,而是 Git 的版本库。Git 分支实际上是指向更改快照的指针。就是你在电脑里能看到的目录。

2023-07-02 18:48:14 950

原创 解决 fatal: Authentication failed for ‘https://github.com/*/*.git/‘

原因:github 的认证策略发生了改变,在的时候,的认证方式被去掉了,换成了的校验方式。

2023-07-02 18:45:20 3403

原创 Git构建和Github的ssh配置

由于你的本地 Git 仓库和 GitHub 仓库之间的传输是通过SSH加密的,所以我们需要配置验证信息。成功的话会在~/下生成.ssh文件夹,进去,打开id_rsa.pub,复制里面的key。回到github,点进你的头像,进入Settings。,之后会要求确认路径和输入密码,一直回车即可。

2023-07-02 17:40:42 735

原创 Liunx线程同步基础

如直接使用 mutex,除了生产者、消费者之间要竞争互斥量以外,消费者之间也需要竞争互斥量,但如果汇聚(链表)中没有数据,消费者之间竞争互斥锁是无意义的。死锁:在并发环境下,各进程因竞争资源而造成的一种互相等待对方手里的资源,导致各进程都阻塞,都无法向前推进的现象,就是"死锁"。lock 尝试加锁,如果加锁不成功,线程阻塞,阻塞到持有该互斥量的其他线程解锁为止。一次调用,做一次-- 操作, 当信号量的值为 0 时,再次 -- 就会阻塞。每个线程在对资源操作前都尝试先加锁,成功加锁才能操作,操作结束解锁。

2023-06-22 21:36:29 31

原创 线程基础知识

4. 应避免在多线程模型中调用 fork 除非,马上 exec,子进程中只有调用 fork 的线程存在,其他线程在子进程中均 pthread_exit。实际上,无论是创建进程的 fork,还是创建线程的 pthread_create,底层实现都是调用同一个内核函数 clone。1. 从线程主函数 return。2. 从内核里看进程和线程是一样的,都有各自不同的 PCB,但是 PCB 中指向内存资源的三级页表是相同的。线程id是在【进程】地址空间内部,用来标识线程身份的id号,不同进程间线程id可以相同。

2023-06-20 22:35:43 29

原创 进程组、会话、守护进程

2> 父进程创建子进程的时候默认父子进程属于同一进程组。进程组的ID==第一个进程ID(组长进程),组长进程id==进程组id,组长进程可以创建一个进程组,创建该进程组中的进程,然后终止。,每个进程都属于一个一个进程组,简化对多个进程的管理,waitpid函数和kill函数的参数中用到。1. 调用 进程不能是进程组组长,该调用 进程变成新会话首进程(session header)守护进程(精灵进程),是Linux 中的后台服务进程,通常。2. 该进程成为一个新进程组的组长进程。获取进程所属的会话 ID。

2023-06-20 20:50:10 24

原创 进程间通信(IPC)

1、创建映射区的过程中,隐含着一次对映射文件的【读操作】2、当MAP_SHARED映射区的权限应该

2023-06-12 17:04:48 213

原创 进程基础知识

注意:只有进程空间的各段的内容要发生变化时(子进程或父进程进行写操作时,都会引起复制),才会将父进程的内容复制一份给子进程。在fork之后两个进程用的是相同的物理空间(内存区),子进程的代码段、数据段、堆栈都是指向父进程的物理空间,也就是说,两者的虚拟空间不同,但其对应的物理空间是同一个。 一个进程终止时会关闭所有文件描述符,释放在用户空间分配的内存,但它的PCB还保留着,内核在其中保存了一些信息:如果是正常终止则保存着退出状态,如果是异常终止则保存着导致该进程终止的信号是哪个。kill 对其无效。

2023-06-06 21:52:37 140

原创 文件与目录

3、用lseek读取文件大小实际用的是读写指针初末位置的偏移差,一个新开文件,读写指针初位置都在文件开头。上面代码出现lseek返回799,ls查看为800的原因是,lseek读取到偏移差的时候,还没有写入最后的‘$’符号,末尾那一大堆^@,是文件空洞,如果自己写进去的也想保持队形,就写入“\0”。1、对于写文件再读取那个例子,由于文件写完之后未关闭,读写指针在文件末尾,所以不调节指针,直接读取不到内容。注意:打开一个文件,读写指针默认在文件头,如果文件本身有内容,直接写入会覆盖原有内容。

2023-06-05 17:00:21 61

原创 Linux常用工具

进入编辑模式,光标前插入字符进入编辑模式,光标所在行的行首插入进入编辑模式,光标后插入字符进入编辑模式,光标所在行的行末插入字符进入编辑模式,光标所在行的下一行插入进入编辑模式,光标所在行的上一行插入字符删除光标所在字符并进入编辑模式删除光标所在行并进入编辑模式。

2023-05-24 17:39:31 51

原创 多路I/O转接服务器

系统调用selectpollepoll事件集合用户通过3个参数分别传入感兴趣的可读、可写及异常事件,内核通过对这些参数的在线修改来反馈其中的就绪事件。这使得用户每次调用select都要重置这3个参数统一处理所有事件类型,因此只需一个事件集参数。用户通过pollfd.events传入感兴趣的事件,内核通过修改pollfd.revents反馈其中就绪的事件内核通过一个事件表直接管理用户感兴趣的所有事件。

2023-05-15 22:22:12 262

原创 网络小结:Epoll_webserver

B/S模型(浏览器 / 服务器)实现一个简单的Web服务器myhttpd。能够给浏览器提供服务,供用户借助浏览器访问服务器主机中的文件。

2023-05-12 16:37:49 231

原创 Libevent实现TCP流程

4、使用bufferevent_setcb()给bufferevent对象的read、write、event设置回调。4、回调函数被调用,说明有一个新客户端连接上来。会得到一个新fd(文件描述符),用于跟客户端通信(读、写)其一旦被回调,说明在其内部应该与客户端完成,数据读写操作,进行通信。该回调函数,不由我们调用,是框架自动调用。创建一个新的bufferevent事件,将fd封装到这个事件对象中。给这个事件对象的read、write、event设置回调。的回调函数中,处理接受连接后的操作。

2023-05-08 15:55:51 948

原创 Libevent 简述

是一个。适用于windows、linux、bsd等多种平台(),内部使用select、epoll、kqueue等系统调用管理事件机制。著名分布式缓存软件memcached也是libevent based,而且libevent在使用上可以做到,而且根据libevent官方网站上公布的数据统计,似乎也有着非凡的性能。

2023-05-06 17:49:42 941

个人总结C++基础概念

STL、OOP、指针、引用、一些基本概念,个人学习总结,持续更新!!!!!

2023-08-15

空空如也

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

TA关注的人

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