自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 MySQL基本运维命令

不过也有地方不建议使用连接查询,因为连接查询属于重查询,数据量大容易造成阻塞,比如阿里就明文规定禁止用三个表以上的join。做项目的时候应该遵循重业务,轻数据库的原则,能在业务层聚合,就不要用跨表查询。MYSQL root密码修改完,需停止以Mysql跳过权限表的启动进程,再以正常方式启动MYSQL,再次以新的密码登陆即可进入Mysql数据库。命令:mysqldump -u 用户名 -p 数据库名 表名> 导出的文件名。命令:mysqldump -u 用户名 -p 数据库名 > 导出的文件名。

2023-01-13 22:45:00 20338 15

原创 浅尝Go语言的协程实现

上述操作让本地队列成了一个小循环,但是如果目前系统中的线程的本地队列中都拥有一个超大的协程任务,那么所有的线程都将在一段时间内处于忙碌状态,全局队列中的任务将会长期无法运行,这个问题又称为全局队列饥饿问题,解决方式就是在本地队列循环时,以一定的概率从全局队列中取出某个任务,让它也参与到本地循环当中去。goexit也是汇编实现的,当执行完协程栈中的业务方法之后,就会退到goexit方法中,它会将业务协程的栈切换成调度器的栈(也就是g0栈),然后重新调用schedule函数,形成一个闭环。

2022-12-08 17:31:20 3481

原创 协程库libtask学习记录

我们先从一次网络IO请求过程中的read操作为例,请求数据会先拷贝到系统内核空间中,再从操作系统的内核空间拷贝到应用程序的用户空间中。从内核空间将数据拷贝到用户空间过程中,会经历两个阶段:因为有这两个阶段,所以就有了各种网络IO的模型:而协程,就是,即业务逻辑看起来是同步的,但实际上并不阻塞当前线程(一般是靠事件循环处理来分发消息)。所以协程实际上是在单线程的环境下实现的应用程序级别的并发,就是把本来由操作系统控制的在应用程序里面实现了。由于协程在应用程序级别来处理任务,所以协程更像是一个函数,只是比普通的

2022-12-07 23:47:58 1986

原创 Gorm + Gen自动生成数据库结构体

使用gorm操作数据库的时候,需要自己来创建用于映射数据表的结构体,比较繁琐。运行上面的测试文件之后,生成了两个文件夹,其中model文件夹下面是数据表对应的结构体,query文件夹下面则是生成的查询函数。函数就可以生成对应的model,当然不仅仅会生成结构体,还可以生成一些用于查询的API,如果不需要,删除即可。这个工具不仅仅可以用来生成数据表对应的模型文件,还提供了更加安全以及方便的API。

2022-11-11 21:25:49 7463

原创 四、RabbitMQ TTL、死信队列以及延迟队列

比如十分钟内未支付则取消订单,原先这个功能我们可以使用定时器来实现,即每隔一段时间去数据库对比未支付订单的当前时间与订单创建时间。生产者生产一条消息,然后指定消息的TTL为10s,接着将消息发给普通队列,消息在普通队列中过期后被发往死信交换机,死信交换机将这条消息路由给延迟队列。消费者一直在监听到延迟队列中的死信后,开始消费。延时队列就是用来存放需要在指定时间被处理的元素的队列,通常可以用来处理一些具有过期性操作的业务。(死信交换机),进而被路由到另一个队列中,这个队列就叫做死信队列。

2022-11-06 23:38:05 1540

原创 三、RabbitMQ消息的可靠投递

自动确认是指,当消息一旦被Consumer接收到,则自动确认收到,并将相应 message 从 RabbitMQ 的消息缓存中移除。但是在实际业务处理中,很可能消息接收到,业务处理出现异常,那么该消息就会丢失。生产者端在向Broker发送消息的时候,我们使用一个无缓冲的通道来接收来自Broker的回复,然后创建一个协程监听这个无缓冲通道。,即队列发送消息给消费者的时候,不再采用轮询机制,而是一个消费者消费完消息之后,会调用。在编码中,关于消息的确认方式,我们需要在消费者端调用。

2022-11-06 20:01:51 1334

原创 二、RabbitMQ的五种工作模式

1.简单(Simple)模式P:生产者,也就是要发送消息的程序。C:消费者:消息的接收者,会一直等待消息到来。queue:消息队列,图中红色部分。类似一个邮箱,可以缓存消息;生产者向其中投递消息,消费者从其中取出消息。简单模式就是单发单收,消息的消费者监听消息队列,如果队列中有消息,就消费掉,消息被拿走后,自动从队列中删除。2.工作队列(Work Queue)模式公平分发:每个消费者接收消息的概率是相等的,消息队列会循环依次给每个消费者发送消息,这种是默认的策略。

2022-11-05 23:12:10 2713

原创 一、Rabbit的介绍与安装

MQ全称 Message Queue(消息队列),是在消息的传输过程中保存消息的容器。多用于分布式系统之间进行通信。以HTTP为代表的REST,操作简单但是缺点很明显,就是没有长连接。使用RPC通信,缺点是操作一般是同步的,而且各个模块之间的耦合度比较高。消息队列也可以作为一种第三方工具介入分布式系统之间的通信。MQ的优势和劣势应用解耦:使用 MQ 使得应用间解耦,提升容错性和可维护性。异步提速:可以提升用户体验和系统吞吐量(单位时间内处理请求的数目)。削峰填谷:提高系统稳定性。

2022-11-05 17:04:16 1503

原创 Golang sync.Map原理分析

上述结构体中的read字段实际上是一个包含map的结构体,该结构体中的map是一个read map,对该map的访问不需要加锁,但是增加的元素不会被添加到这个map中,元素会被先增加到dirty中,后续才会被迁移到read只读map中。的长度,就开始迁移数据,程序会直接将m.dirty提升为m.read,然后将m.dirty置为nil,等到下次插入新数据的时候,程序才会把read map中的值全部复制给dirty map。读取时会先查询 read,不存在再查询 dirty,写入时则只写入 dirty。

2022-11-01 19:42:35 717

原创 Go实现快速列表

快速列表(quicklist)是Redis中特有的一种数据结构,主要是为了解决双端链表的弊端:双端链表的附加空间比较高,因为prev和next指针会占掉一部分的空间(64位系统占用8 + 8 = 16字节).而且链表的每个节点都是单独分配内存,会加剧内存的碎片化。Redis中的快速列表实际上是zipList(经过优化过的数组)和linkedList的混合体,它把zipList放在linkedList的每个结点中,实现紧凑存储。

2022-11-01 11:24:55 645

原创 GO实现跳跃表

跳跃表(skiplist)是一种有序的数据结构,它通过建立多层"索引",从而达到快速访问节点的目的. 跳跃表支持平均O(logN)、最坏O(N)复杂度的节点查找,还可以通过顺序性操作来批量处理节点。下面是一个跳表结构的示意图,其实跳表就是一个二维链表,只有最底层的链表中存着数据,其他层都是在第一层基础上建立的索引,越靠近上层,节点之间的跨度就越大,跳表的查询范围也越大。依靠着这些索引,跳表可以实现接近二分查找的查找效率。

2022-10-31 23:43:30 765

原创 数据库与缓存一致性解决方案

项目中如果用到了缓存,就会涉及到数据库与缓存的双写,由于这两个操作不是原子性的,在并发的场景下,容易产生数据库与缓存不一致的情况。

2022-10-12 16:13:59 3697 2

原创 四、Docker容器数据卷

数据卷(Data Volumes)是宿主机中的一个目录或文件,数据卷的设计目的就是数据的持久化,完全独立于容器的生存周期,因此Docker不会在容器删除时删除其挂载的数据卷。当容器目录和数据卷目录绑定后,对方的修改会立即同步,一个数据卷可以被多个容器同时挂载,一个容器也可以被挂载多个数据卷。数据卷的作用容器数据持久化外部机器和容器间接通信容器之间数据交换。

2022-09-12 15:53:23 1096

原创 十、kubernetes 数据存储

在前面已经提到,容器的生命周期可能很短,会被频繁地创建和销毁。那么容器在销毁时,保存在容器中的数据也会被清除。这种结果对用户来说,在某些情况下是不乐意看到的。为了持久化保存容器的数据,kubernetes引入了Volume的概念。​ Volume是Pod中能够被多个容器访问的共享目录,它被定义在Pod上,然后被一个Pod里的多个容器挂载到具体的文件目录下,kubernetes通过Volume实现同一个Pod中不同容器之间的数据共享以及数据的持久化存储。

2022-09-09 10:30:29 511 1

原创 九、kubernetes Service详解

在kubernetes中,pod是应用程序的载体,我们可以通过pod的ip来访问应用程序,但是pod的ip地址不是固定的,这也就意味着不方便直接采用pod的ip对服务进行访问。Service在很多情况下只是一个概念,真正起作用的其实是kube-proxy服务进程,每个Node节点上都运行着一个kube-proxy服务进程。当创建Service的时候会通过api-server向etcd写入创建的service的信息,而kube-proxy会基于监听的机制发现这种Service的变动,然后。

2022-09-09 10:12:08 481 1

原创 八、kubernetes Pod控制器

Pod是kubernetes的最小管理单元,在kubernetes中,按照pod的创建方式可以将其分为两类:自主式pod:kubernetes直接创建出来的Pod,这种pod删除后就没有了,也不会重建控制器创建的pod:kubernetes通过控制器创建的pod,这种pod删除了之后还会自动重建什么是Pod控制器。

2022-09-06 11:41:46 450 1

原创 七、kubernetes Pod调度

在默认情况下,一个Pod在哪个Node节点上运行,是由Scheduler组件采用相应的算法计算出来的,这个过程是不受人工控制的。但是在实际使用中,这并不满足的需求,因为很多情况下,我们想控制某些Pod到达某些节点上,那么应该怎么做呢?

2022-09-05 16:26:15 551 1

原创 六、kuternetes Pod生命周期

我们一般将pod对象从创建至终的这段时间范围称为pod的生命周期,它主要包含下面的过程:pod创建过程运行初始化容器(init container)过程运行主容器(main container)容器启动后钩子(post start)、容器终止前钩子(pre stop)容器的存活性探测(liveness probe)、就绪性探测(readiness probe)pod终止过程在整个生命周期中,Pod会出现5种(

2022-09-05 16:25:18 442

原创 五、kuternetes Pod介绍与配置

每个Pod中都可以包含一个或者多个容器,这些容器可以分为两类:用户程序所在的容器,数量可多可少Pause容器,这是每个Pod都会有的一个根容器,它的作用有两个:可以以它为依据,评估整个Pod的健康状态可以在根容器上设置Ip地址,其它容器都使用这个Ip(Pod IP),以实现Pod内部的网路通信这里是Pod内部的通讯,Pod的之间的通讯采用虚拟二层网络技术来实现,我们当前环境用的是Flannel。

2022-09-05 15:20:36 883 1

原创 四、kubernetes五种核心资源对象

kubernetes通过将集群内部的资源分配到不同的Namespace中,可以形成逻辑上的"组",以方便不同的组的资源进行隔离使用和管理。​ 可以通过kubernetes的授权机制,将不同的namespace交给不同租户进行管理,这样就实现了多租户的资源隔离。在kubernetes中,Pod是最小的控制单元,但是kubernetes很少直接控制Pod,一般都是通过Pod控制器来完成的。Pod控制器用于pod的管理,确保pod资源符合预期的状态,当pod的资源出现故障时,会尝试进行重启或重建pod。

2022-09-03 23:25:49 969 1

原创 三、kubermetes资源管理(YAML介绍、资源管理方式)

在kubernetes中,所有的内容都抽象为资源,用户需要通过操作资源来管理kubernetes。​ kubernetes的本质上就是一个集群系统,用户可以在集群中部署各种服务,所谓的部署服务,其实就是在kubernetes集群中运行一个个的容器,并将指定的程序跑在容器中。​ kubernetes的最小管理单元是pod而不是容器,所以只能将容器放在Pod中,而kubernetes一般也不会直接管理Pod,而是通过Pod控制器来管理Pod的。

2022-09-03 16:31:45 975 1

原创 二、kubernetes集群环境搭建

本次环境搭建需要安装三台Centos服务器(一主二从),然后在每台服务器中分别安装docker(18.06.3),kubeadm(1.17.4)、kubelet(1.17.4)、kubectl(1.17.4)程序。selinux是linux系统下的一个安全服务,如果不关闭它,在安装集群中会产生各种各样的奇葩问题。swap分区指的是虚拟内存分区,它的作用是在物理内存使用完之后,将磁盘空间虚拟成内存来使用。节点执行即可,插件使用的是DaemonSet的控制器,它会在每个节点上都运行。

2022-09-03 14:31:33 192 1

原创 一、kubernetes 介绍(组件、概念)

kubernetes的本质是一组服务器集群,它可以在集群的每个节点上运行特定的程序,来对节点中的容器进行管理。自我修复:一旦某一个容器崩溃,能够在1秒中左右迅速启动新的容器弹性伸缩:可以根据需要,自动对集群中正在运行的容器数量进行调整服务发现:服务可以通过自动发现的形式找到它所依赖的服务负载均衡:如果一个服务起动了多个容器,能够自动实现请求的负载均衡版本回退:如果发现新发布的程序版本有问题,可以立即回退到原来的版本存储编排:可以根据容器自身的需求自动创建存储卷。

2022-09-03 13:57:37 182

原创 跳跃表(Go语言实现)

是Godis中用来封装跳跃表分数的结构体,向外提供了:比较大小、根据参数构造并返回一个。,一个Go语言实现的Redis数据库,这个跳跃表被用作有序集合的底层实现之一.分享一个跳跃表结构的GO实现,来源于。.........

2022-08-18 22:46:52 365

原创 Redis源码与设计剖析 -- 18.Redis网络连接库分析

Redis网络连接库对应的文件是客户端的创建与释放.命令接收与命令回复.Redis通信协议分析.CLIENT命令的实现.

2022-07-24 17:30:57 339

原创 Redis源码与设计剖析 -- 17.Redis事件处理

Redis服务器是一个事件驱动程序,所谓事件驱动就是输入一条命令并且按下回车,然后消息被组装成Redis协议的格式发送给Redis服务器,这个时候就会产生一个事件,Redis服务器会接收改命令,处理该命令和发送回复,而当我们没有与服务器进行交互时,服务器就会处于阻塞等待状态,它会让出CPU然后进入睡眠状态,当事件触发时,就会被操作系统唤醒.文件事件时间事件Redis服务器中的一些操作(比如serverCron函数)需要在给定的时间点执行,而时间事件就是服务器对这类定时操作的抽象....

2022-07-24 16:10:23 176

原创 Redis源码与设计剖析 -- 16.AOF持久化机制

除了RDB持久化功能之外,Redis还提供了持久化功能。与RDB持久化通过保存数据库中的键值对来记录数据库状态不同,AOF持久化是以日志的方式记录Redis服务器所执行的写命令。

2022-07-24 00:07:43 289

原创 Redis源码与设计剖析 -- 15.RDB持久化机制

因为Redis是内存数据库,它将自己的数据库状态储存在内存里面,所以如果不想办法将储存在内存中的数据库状态保存到磁盘里面,那么一旦服务器进程退出,服务器中的数据库状态也会消失不见.为了解决这个问题,Redis提供了RDB持久化功能,它会生成一个压缩的二进制文件,通过该文件可以还原生成的RDB文件时的数据库状态....

2022-07-23 23:33:29 250

原创 Redis源码与设计剖析 -- 14.数据库实现

注意在实际中,键空间的键和过期字典的键都指向同一个键对象(只是增加引用计数),所以不会出现任何重复对象,也不会浪费任何空间.都会调用这个底层的函数,这个函数非常简单,就是从键值对字典中先找到键名对应的键对象,然后取出值对象.函数就会被调用,它在规定的时间内,分多次遍历服务器中的各个数据库,从数据库的。以上四个命令都是用来设置键的过期时间的,但在执行时,其它三个命令都会转化成。字典保存这设置了过期时间的键和过期的时间,我们称这个字典为过期字典.字典中随机检查一部分键的过期时间,并删除其中的过期键....

2022-07-22 16:22:54 475

原创 Redis源码与设计剖析 -- 13.有序集合对象

命令描述向有序集合添加一个或多个成员,或者更新已存在成员的分数ZCARDkey获取有序集合的成员数计算在有序集合中指定区间分数的成员数有序集合中对指定成员的分数加上增量increment计算给定的一个或多个有序集的交集并将结果集存储在新的有序集合key中在有序集合中计算指定字典区间内成员数量通过索引区间返回有序集合成指定区间内的成员通过字典区间返回有序集合的成员通过分数返回有序集合指定区间内的成员返回有序集合中指定成员的索引移除有序集合中的一个或多个成员。...

2022-07-21 00:44:22 214

原创 Redis源码与设计剖析 -- 12.集合对象

命令描述将一个或多个成员添加到集合SCARDkey获取集合中的成员数减去多个集合减去多个集并将结果集存储在键中相交多个集合交叉多个集合并将结果集存储在键中判断确定给定值是否是集合的成员将成员从一个集合移动到另一个集合SPOPkey从集合中删除并返回随机成员从集合中获取一个或多个随机成员从集合中删除一个或多个成员添加多个集合添加多个集并将结果集存储在键中递增地迭代集合中的元素。......

2022-07-20 23:28:02 257

原创 Redis源码与设计剖析 -- 11.哈希对象

命令描述删除一个或多个哈希表字段查看哈希表key中,指定的字段是否存在获取存储在哈希表中指定字段的值获取在哈希表中指定key的所有字段和值为哈希表key中的指定字段的整数值加上增量increment为哈希表key中的指定字段的浮点数值加上增量incrementHKEYSkey获取所有哈希表中的字段HLENkey获取哈希表中字段的数量获取所有给定字段的值同时将多个field-value(域-值)对设置到哈希表key中。...

2022-07-20 21:07:57 355

原创 Redis源码与设计剖析 -- 10.列表对象

因为从版本开始,就使用作为列表键的底层实现,所以列表对象的大致结构如下图所示:列表对象命令的实现代码在源文件中.Redis先是定义了一些最底层的函数比如、等等,然后在这些底层命令之上又封装了有特定功能的函数,比如阻塞和非阻塞插入和删除. 这里我们只介绍一些最底层的命令.2.2 POP命令2.3 列表迭代器其中列表对象还定义了迭代器,以及迭代时候的节点信息,这个迭代器迭代的其实是的节点,的底层实现中,还有专门的用于迭代节点中的迭代器.初始化迭代器更新迭代器返回当前迭代器指向的节点销毁迭代器.

2022-07-20 13:25:27 193

原创 Redis源码与设计剖析 -- 9.字符串对象

命令描述设置指定key的值GETkey获取指定key的值返回key中字符串值的子字符将给定key的值设为value,并返回key的旧值(oldvalue)对key所储存的字符串值,获取指定偏移量上的位(bit)获取所有(一个或多个)给定key的值对key所储存的字符串值,设置或清除指定偏移量上的位(bit)将值value关联到key,并将key的过期时间设为seconds(以秒为单位)只有在key不存在时设置key的值。...

2022-07-19 23:22:34 201

原创 Redis源码与设计剖析 -- 8.对象系统

SDS、双端链表、字典、跳表、压缩列表、整数集合、快速列表.Redis并没有直接使用这些数据结构来实现键值对数据库,而是基于这些数据结构创建了一个对象系统,这个系统包含字符串对象、列表对象、哈希对象、集合对象和有序集合对象这五种类型的对象,每种对象都用到了至少一种我们前面所介绍的数据结构.Redis可以在执行命令之前,根据对象的类型来判断一个对象是否可以执行给定的命令.可以针对不同的使用场景,为对象设置多种不同的数据结构实现,从而优化对象在不同场景下的使用效率.对象共享机制过期键自动删除。...

2022-07-19 22:18:23 393

原创 Redis源码与设计剖析 -- 7.快速列表

之前我们介绍了链表结构和压缩列表结构,它们是列表键的底层实现方式,但是链表的附加空间有点高,因为prev和next指针会占掉一部分的空间(64位系统占用8+8=16字节).而且链表的每个节点都是单独分配内存,会加剧内存的碎片化.所以在redis-3.2版本开始,Redis使用quicklist作为列表键的底层实现....

2022-07-18 23:03:52 363

原创 Redis源码与设计剖析 -- 6.压缩列表

压缩列表(ziplist)是列表键和哈希键的底层实现之一.当一个列表键只包含少量列表项,并且每个列表项要么就是小整数值,要么就是长度比较短的字符串,那么Redis就会使用压缩列表来做列表键的底层实现.当一个哈希键只包含少量键值对,并且每个键值对的键和值要么就是小整数值,要么就是长度比较短的字符串,那么Redis就会使用压缩列表来做哈希键的底层实现....

2022-07-18 15:17:24 215

原创 Redis源码与设计剖析 -- 5.整数集合

整数集合是集合键的底层实现之一,当一个集合,并且这个集合的时,Redis就会使用整数集合作为集合键的底层实现.可以保存类型为、或者的整数值,并且保证集合中不会出现重复元素.Redis中结构定义在和中.属性表示数组储存元素的类型,虽然intset结构把contents属性声明为类型的数组,但是可以看源码中的宏定义,其实并不保存类型的元素. 只保存范围更大的三种类型.属性记录的是数组的长度.数组保存实际的元素,各个元素从小到大有序地排列.如下图,分别是一个储存类型和一个储存类型的整数集合:每当我们

2022-07-18 00:25:06 245

原创 Redis源码与设计剖析 -- 4.跳跃表

跳跃表(skiplist)是一种有序的数据结构,它通过建立多层"索引",从而达到快速访问节点的目的.跳跃表支持平均O(logN)、最坏O(N)复杂度的节点查找,还可以通过顺序性操作来批量处理节点.如果一个有序集合包含的元素数量比较多,又或者有序集合中元素的成员(member)是比较长的字符串时,Redis就会使用跳跃表来作为有序集合键的底层实现..........

2022-07-17 17:47:40 481

原创 Redis源码与设计剖析 -- 3.字典

map(映射),是一种用于保存键值对的抽象数据结构.很多语言都内置了字典这种数据结构,像C++中的、Java中的HashMap、Golang中的map等等.但是C语言中却没有内置这种数据结构,因此Redis构建了自己的字典实现.字典在Redis中的应用相当广泛,比如哈希对象在满足条件的情况下会使用字典作为底层实现,以及Redis中的数据库也是使用字典来作为底层实现的,对数据库的增、删、查、改操作也是构建在对字典的操作之上的....

2022-07-16 23:18:37 227

空空如也

空空如也

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

TA关注的人

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