自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 sync.map

go 里面提供了map这种类型让我们可以存储键值对数据,但是如果我们在并发的情况下使用map的话,就会发现它是不支持并发地进行读写的(会报错)。在这种情况下,我们可以使用sync.Mutex来保证并发安全,但是这样会导致我们在读写的时候,都需要加锁,这样就会导致性能的下降。我们知道,Golang原生的map是的,如果你硬要用多个goroutine并发读写map,会得到 panic。对此常见的解决方案有两种。

2023-09-06 14:37:31 236

原创 数据库集群介绍(一)

MySQL中日志分为两个维度,。binlog就是属于MySQL服务器的日志,binlog也叫二进制日志,记录了所有对MySQL所做的更改。binlog有三种存储格式,分别是。StatementRow为什么会有这么多方式呢?因为Statement只会记录SQL语句,但是并不能保证所有情况下这些语句在从库上能够正确的被重放出来。因为可能顺序不对。MySQL什么时候会记录binlog呢?

2023-07-17 22:47:24 536

原创 tcp三次握手,四次挥手

原因:三次握手才可以阻止重复历史连接的初始化(主要原因)旧 SYN 报文比最新的 SYN 报文早到达了服务端,那么此时服务端就会回一个 ·SYN + ACK· 报文给客户端,此报文中的确认号是91。客户端收到后,发现自己期望收到的确认号应该是101,而不是91,于是就会回RST报文。服务端收到RST报文后,就会释放连接。后续最新的SYN抵达了服务端后,客户端与服务端就可以正常的完成三次握手了。上述中的旧 SYN 报文称为历史连接,TCP 使用三次握手建立连接的最主要原因就是。

2023-03-26 22:10:53 904

原创 gRPC(一)

RPC目标:让远程服务调用更加简单、透明,其负责屏蔽底层的传输方式(TCP/UDP)、序列化方式(XML/Json)和通信细节。服务调用者可以像调用本地接口一样调用远程的服务提供者,而不需要关心底层通信细节和调用过程。gRPC 是一个高性能、开源和通用的 RPC 框架,面向移动和HTTP/2设计。其中 C 版本支持和C#支持.定义一个服务,指定其能够被远程调用的方法。在服务端实现这个接口,并运行一个 gRPC 服务器来处理客户端调用。在客户端拥有一个存根能够像服务端一样的方法。

2023-03-22 23:02:49 743 1

原创 docker 入门篇

docker的理念回顾:将应用和环境打包成一个镜像,如果数据都在容器中,那么当我们容器被删除的时候,数据就会丢失。数据可以持久化。MySQL数据库中的数据可以存储在本地。容器之间可以有一个数据共享的技术,docker容器中产生的数据可以同步到本地。这就是数据卷就是将容器内的目录挂载到Linux上面。容器数据卷:一个或多个容器专门指定绕过的目录,为持续性或共享数据数据卷可以在容器间共享和重用;数据卷数据改变是直接修改的(双向的);数据卷是持续性的,直到没有容器使用它们;Dockerfile。

2023-03-05 20:38:49 764 2

原创 ShardingSphere介绍

是一款分布式的数据库生态系统, 可以将任意数据库转换为分布式数据库,并通过等能力对原有数据库进行增强。设计哲学为,旨在构建异构数据库上层的标准和生态。 它关注如何充分合理地利用数据库的计算和存储能力,而并非实现一个全新的数据库。 它站在数据库的上层视角,关注它们之间的协作多于数据库自身。连接:打造数据库上层标准通过对,快速构建多模异构数据库上层的标准,同时通过内置 DistSQL 为应用提供标准化的连接方式。增强:数据库计算增强引擎在原生数据库基础能力之上,提供分布式及流量增强方面的能力。前者可突

2022-12-04 16:11:30 769

原创 Redis 内存管理

Redis的同学应该都知道,它基于键值对的内存数据库,所有数据存放在内存中,内存在Redis中扮演一个核心角色,所有的操作都是围绕它进行。我们在实际维护过程中经常会被问到如下问题,比如数据怎么存储在Redis里面能节约成本、提升性能?Redis内存告警是什么原因导致?

2022-12-01 10:43:47 805

原创 es分布式架构和原理分析

这篇初识ElasticSearch文章中,说明了es的集群的核心概念,回顾一下。关于节点:一个运行中的es实例称为一个节点,而集群是由一个或者多个拥有相同cluster.name配置的节点组成, 它们共同承担数据和负载的压力。当有节点加入集群中或者从集群中移除节点时,集群将会重新平均分布所有的数据。当一个节点被选举成为主节点时, 它将负责管理集群范围内的所有变更,例如增加、删除索引,或者增加、删除节点等。而主节点并不需要涉及到文档级别的变更和搜索。

2022-11-06 15:01:32 2161

原创 ES之倒排索引

我们对“cat”、 “deep”、 “do”、 “dog” 、“dogs”这5个单词进行插入构建FST(注:必须已排序)。文档中的每个字段,都有自己的倒排索引。,简单的了解了倒排索引的概念。这样当我们去搜索某个关键词时,为了进一步提升索引的效率,与其对应的文档列表建立。的前缀或者后缀构建了。

2022-11-05 16:54:27 7329

原创 es实操笔记

实操笔记#创建索引 PUT /es_db # 删除索引 DELETE /es_db # 查询索引 GET /es_db"name" : "张三" , "sex" :1, "age" :25, "address" : "中国" , "remark" : "java developer" } # 修改id为1的数据 PUT /es_db/_doc/1 {

2022-11-03 20:37:58 1335 1

原创 初识ElasticSearch

Elasticsearch是用Java开发并且是一个开源的高扩展的分布式,restful全文搜索引擎。能够达到实时搜索,稳定,可靠,快速,扩展性很好,安装使用方便。

2022-11-03 14:04:28 589

原创 redis-集群理论篇

当客户端向一个错误的节点发出了指令,该节点会发现指令的key所在的槽位并不归自己管理,这时它会向客户端发送一个特殊的跳转指令携带目标操作的节点地址,告诉客户端去连这个节点去获取数据。客户端收到指令后除了跳转到正确的节点上去操作,还会同步更新纠正本地的槽位映射表缓存,后续所有key将使用新的槽位映射表。

2022-11-02 20:19:01 649

原创 redis-基于docker搭建redis集群

学习了redis的主从,哨兵之后,学习redis高可用的最后一篇集群。学习集群不着急,先来看看怎么搭建集群。现在都讲究容器化部署,咱也来试试基于docker搭建redis集群。ps:我只有一台虚拟机,所以。。。。。将就一下。

2022-11-02 11:41:38 961 1

原创 Redis为什么变慢了?如何排查Redis性能问题

排除网络原因,如何确认你的 Redis 是否真的变慢了?首先,你需要对Redis进行基准性能测试(什么,你没有做过!!!!),了解你的 Redis 在生产环境服务器上的基准性能。基准性能就是指Redis在一台负载正常的机器上,其最大的响应延迟和平均响应延迟分别是怎样的?方式一:redis-cli --intrinsic-latency方式二:redis-benchmark你应该也发现了,Redis的性能问题,涉及到的知识点非常广,几乎涵盖了CPU、内存、网络、甚至磁盘。

2022-11-01 22:12:26 2820

原创 redis特性-事务

可以一次执行,本质是一组命令的集合。一个事务中的所有命令都会序列化,按的执行而不会被其他命令插入。Redis中,单条命令是原子性执行的,但事务,且。事务中。有着密切的关联,因为一些列回滚操作、像事务隔离级别那这样加锁、解锁,是非常消耗性能的。

2022-11-01 16:40:58 534

原创 docker入门篇---初始docker(一)

一款产品:开发---->运维,两套环境!应用环境,应用配置!:我的电脑可以运行,版本更新,导致服务不可用。环境配置十分的麻烦,每个机器都需要部署环境(redis集群,es等。。。。)。不能跨平台。发布项目(。。。),传统:开发jar,运维来做!现在:开发打包部署上线,一套流程。以上问题,docker提出解决方法。java—>jar(环境)---->(打包项目带上环境)镜像---->(docker)---->下载镜像---->运行。

2022-10-30 21:39:21 708

原创 Golang基于Zookeeper实现节点注册发现、内容配置变更,发布/订阅

进入容器内部。

2022-10-30 11:54:29 367

原创 Redis高级特性—HyperLoglog解决统计问题

在Redis的实现中用到的是16384个桶,也就是2^14,每个桶的maxbits需要6个bits来存储,最大可以表示maxbits=63,于是总共占用内存就是字节。目的是做基数统计,故不是集合,不会保存元数据,只记录数量而不是数值;耗空间极小,支持输入非常体积的数据量,最终数值存在一定误差;redis中每个占用了12K的内存用于标记基数;pfadd命令并不会一次性分配12k内存,而是随着基数的增加而逐渐增加内存分配;而pfmerge操作则会将source key合并后存储在12k大小的key。

2022-10-27 16:16:04 879

原创 redis高级特性-bitmap

在我们平时开发过程中,会有一些bool型数据需要存取,比如用户一年的签到记录,签了是1,没签是0,要记录365天。如果使用普通的key/value,每个用户要记录365个,当用户上亿的时候,需要的存储空间是惊人的。为了解决这个问题,Redis 提供了数据结构,这样每天的签到记录只占据一个位,365天就是365个位,46个字节 (一个稍长一点的字符串) 就可以完全容纳下,这就大大节约了存储空间。

2022-10-27 15:06:21 1453

原创 大key对持久化的影响

当 AOF 写回策略配置了Always策略,如果写入是一个大 Key,主线程在执行fsync()函数的时候,阻塞的时间会比较久。AOF 重写机制和RDB 快照的过程,都会分别通过fork()函数创建一个子进程来处理任务。会有两个阶段会导致阻塞父进程:创建子进程的途中,由于要复制父进程的页表等数据结构,页表越大,阻塞的时间也越长;创建完子进程后,如果父进程修改了共享数据中的大 Key,就会发生写时复制,这期间会拷贝物理内存,由于·大 Key ·占用的物理内存会很大。大 key 除了会影响持久化。

2022-10-26 16:51:36 204

原创 redis-持久化竟然还会这样

在RDB中是以快照的形式获取内存中某一时间点的数据副本,在创建RDB文件的时候可以通过save和bgsave命令执行创建RDB文件。,这样也能。如:数据库中包含3个键k1、k2、k3,并且k2已经过期,那么创建新的RDB文件时,程序只会将k1和k3保存到RDB文件中,k2则会被忽略。

2022-10-26 10:44:16 446

原创 go-泛型提升篇(三)

前面的文章介绍了泛型的基础语法和使用要注意的地方。现在来看看泛型的优化方式。接口有一般接口和基本接口。一般接口不能用于定义类型遍历,只能用与约束。泛型类型要使用的话必须传入类型实参实例化才有意义。泛型不能与匿名方法或者函数一起使用泛型不能与类型断言起使用。

2022-10-20 20:28:43 763

原创 golang-泛型基础篇(二)

在上一篇文章中介绍了 golang中泛型的定义,泛型结构体,部分错误的泛型写法。匿名结构体不支持泛型。原因(个人理解):定义泛型,相当于定义新的类型,然后对其进行初始化。使用匿名结构体时,定义好匿名结构体之后直接初始化,相当于每次定义一个新的结构体类型进行初始化。不太符合泛型的要求。Go的泛型(或者或类型形参)目前可使用在3个地方泛型类型 - 类型定义中带类型形参的类型泛型receiver- 泛型类型的receiver泛型函数 - 带类型形参的函数没有匿名的泛型类型(匿名结构体,匿名方法)

2022-10-19 17:39:01 1971

原创 golang-泛型基础篇(一)

/ 这里传入了类型实参int,泛型类型SliceT[T]被实例化为具体的类型 Slice[int] var a SliceT [ int ] = [ ] int {1 , 2 , 3 } fmt . Printf("Type Name: %T\n" , a) //输出:Type Name: Slice[int] // 传入类型实参float32, 将泛型类型SliceT[T]实例化为具体的类型 Slice[string] var b SliceT [ float32 ] = [ ] float32 {

2022-10-18 16:02:51 2730

原创 高频问题-逃逸分析

写过C/C++的同学都知道,调用著名的malloc和new函数可以在堆上分配一块内存,这块内存的使用和销毁的责任都在程序员。一不小心,就会发生内存泄露。切换到Golang后,基本不会担心内存泄露了。虽然也有new函数,但是使用new函数得到的内存不一定就在堆上。一个变量是在堆上分配,还是在栈上分配,是经过编译器的逃逸分析之后得出的结论。Go语言逃逸分析最基本的原则是:如果一个函数返回对一个变量的引用,那么它就会发生逃逸。在编译原理中,分析指针动态范围的方法称之为逃逸分析。通俗来讲,当一个对象的指针被。

2022-10-18 11:12:56 237

原创 go-内存管理篇(二) 万字总结-golang内存分配篇

本文是讲解Golang内存管理的第二篇,在第一篇中我们提到,Golang的内存分配模式与TCMalloc是极其相似的。所以先来回顾一下TCMalloc相关知识点。Page:TCMalloc也是以页为单位管理内存 默认8KB。Span:TCMalloc是以Span为单位向操作系统申请内存的,由一组连续的Page组成。Size Class:由Span分裂出的对象,由同一个Span分裂出的SizeClass大小相同,SizeClass是对象内存实际的载体。

2022-10-17 16:54:23 4520

原创 go-你不知道的内存对齐

总结- 内存对齐是为了让 cpu 更高效访问内存中数据unsafe.Sizeof(x) 返回了变量x的内存占用大小;两个结构体,即使包含变量类型的数量相同,但是位置不同,占用的内存大小也不同,由此引出了内存对齐;内存对齐包含成员对齐和整体对齐,与 unsafe.AlignOf(x) 息息相关;空结构体作为成员变量时,要避免作为 struct 最后一个字段,会有内存浪费;

2022-10-14 15:14:49 349

原创 go-内存管理篇(一) TCMalloc

当存储的东西越来越多,也就发现物理内存的容量依然是不够用,那么对物理内存的利用率和合理的分配,管理就变得非常的重要。内部碎片:TCMalloc提前分配了多种size-class:8, 16, 32, 48, 64, 80, 96, 112, 128, 144, 160, 176…获取,实则是从FreeList中返回一个空闲的对象,如果对应的Size Class刻度下已经没有空闲的Span可以被获取了,则。进行合并,这里的相同就是指分配的对象大小相同,取一个碎片更少的size进行使用。是对象内存实际的载体。

2022-10-13 17:08:53 994

原创 zookeeper场景篇

在分布式的环境中,我们常常使用集群部署的方式来提高某个服务的可用性,为了让高并发的请求能够平均的分配到集群中的每一个服务,避免有些服务压力过大,而有些服务处于空闲状态这样的情况,我们需要制定一些规则来把请求进行路由,这种分配请求的做法就叫做负载均衡,路由请求的规则就是负载均衡的策略。命名服务是指通过指定的名字来获取资源或者服务的地址,利用 zk 创建一个全局唯一的路径,这个路径就可以作为一个名字,指向集群中的集群,提供的服务的地址,或者一个远程的对象等等。排他锁也叫独占锁,顾名思义,也就是对资源进行独占。

2022-10-11 12:02:40 1640

原创 golang使用zookeeper进行CURD

Zookeeper是一个分布式数据库(程序协调服务),Hadoop子项目;以树状方式维护节点方数据的增、删、改、查;通过监听可以获取相应消息事件;持久节点:一直存储在服务器上(0)临时节点:会话失效、节点自动清理(FlagEphemeral)顺序节点:节点创建时自动分配序列号(FlagSequence)

2022-10-10 22:08:15 668

原创 实例详解ZooKeeper ZAB协议、领导选举

之前介绍了zookeeper是分布式协调框架添加链接描述,一个分布式系统必然会存在一个问题:因为分区容忍性(partition tolerance)的存在,就必定要求我们需要在系统可用性(availability)和数据一致性(consistency)中做出权衡。这就是著名的 CAP 定理。CAP理论中,P(分区容忍性)是必然要满足的,因为毕竟是分布式,不能把所有的应用全放到一个服务器里面,这样服务器是吃不消的。所以,只能从AP(可用性)和CP(一致性)中找平衡。

2022-09-30 16:40:47 932

原创 初识zookeeper

ZooKeeper 是一个开源的分布式协调框架,它的定位是为分布式应用提供一致性服务ZooKeeper 会封装好复杂易出错的关键服务,将高效、稳定、易用的服务提供给用户使用。ZooKeeper = 文件系统 + 监听通知机制。(重点)简介了介绍zookeeper数据模型,监听机制,持久化,指令以及一些特性。zk是基于内存进行读写操作的,有时候会进行消息广播,因此不建议在节点存取容量比较大的数据。dataDir(快照)目录、dataLogDir(事务日志)两个目录会随着时间推移变得庞大,容易造成硬盘满了。

2022-09-27 17:15:05 708

原创 golang标准库 net/rpc方法介绍

RPC(Remote Procedure Call)远程过程调用,它可以使一台主机上的进程调用另一台主机的进程,由以访为其他若干个主机提供服务,也就是我们常说的C/S服务,Server与Client之间通过rpc方式进行通信。使用时,服务端和客户端的请求和响应类型应保持一致,否则会触发panicnet/rpc通过反射解析服务结构体、调用方法、请求参数、服务端响应通过加锁保护服务端的 Request 和 Response 结构体,通过重用已经创建的对象实例来减少堆内存申请。

2022-09-22 15:18:52 980

原创 RPC入门

远程过程调用,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之间携带信息数据。举个例子。平时你妈叫你回家吃饭面对面发就是本地过程调用,你妈通过微信,或者电话告诉你。然后你在回家吃饭就是远程过程调用。

2022-09-21 11:16:01 745

原创 TCP三次握手,四次挥手

最近学习了计算机网络的知识,看了很多的视频,并参考了很多资料,写下了这篇文章,如果有什么写的并不准确的地方,还请大佬不吝赐教。TCP 是面向连接的、可靠的、基于字节流的传输层通信协议。面向连接:只能一对一才能连接,不能像 UDP 协议可以一个主机同时向多个主机发送消息。可靠的:TCP提供可靠交付的服务。通过TCP连接传送的数据,无差错、不丢失、不重复、并且按序到达;字节流:用户消息通过 TCP 协议传输时,消息可能会被操作系统分组成多个的 TCP 报文,并且 TCP 报文是有序的。

2022-09-18 16:19:10 996 1

原创 goframe使用lua脚本

Lua是一个高效的轻量级脚本语言。Redis中使用 Lua 的好处减少网络开销,在 Lua脚本 中可以把多个命令放在同一个脚本中运行;原子操作,Redis 会将整个脚本作为一个整体执行,中间不会被其他命令插入(编写脚本过程中无需担心会出现竞态条件)复用性,客户端发送的脚本会永远存储在 Redis中,意味着其他客户端可以复用这一脚本。Redis Lua脚本与事务从定义上来说, Redis 中的脚本本身就是一种事务, 所以任何在事务里可以完成的事, 在脚本里面也能完成。

2022-09-06 00:34:59 493

原创 golang-值接收者和指针接收者的区别

方法能给用户自定义的类型添加新的行为。它和函数的区别在于方法有一个接收者,给一个函数添加一个接收者,那么它就变成了方法。接收者可以是值接收者,也可以是指针接收者。在调用方法的时候,值类型既可以调用值接收者**的方法,也可以调用**指针接收者的方法;指针类型既可以调用指针接收者的方法,也可以调用**值接收者**的方法。

2022-08-24 20:17:39 876 1

原创 golang-内存管理-GC回收

go 1.5 采用三色标记法,插入写屏障机制(只在堆内存中生效),最后仍需对栈内存进行STW;go 1.8 采用混合写屏障机制,屏障限制只在堆内存中生效。避免了最后节点对栈进行STW的问题,提升了GC效率;插入写屏障没有完全保证完整的强三色不变式(栈对象的影响),所以赋值器是灰色赋值器,最后必须 STW 重新扫描栈;混合写屏障消除了所有的 STW,实现的是黑色赋值器,不用 STW 扫描栈;混合写屏障的精度和删除写屏障的一致,比以前插入写屏障要低;

2022-08-22 16:21:17 2014 1

原创 你不看就会后悔的【golang -channel 】!!!!

Go依赖于成为CSP的并发模型,通过Channel实现这种同步模式。golang 的哲学是通过 channel 进行协程(goroutine)之间的通信来实现数据共享。CSP 模型是“以通信的方式来共享内存”,不同于传统的多线程通过共享内存来通信。用于描述两个独立的并发实体通过共享的通讯 channel (管道)进行通信的并发模型。这种方式的优点是通过提供原子的通信原语,避免了竞态情形(race condition)下复杂的锁机制。对 channel 的操作行为结果总结(重点)操作closepanic。

2022-08-19 19:57:22 243

原创 别问redis内存满了怎么办

分析:你redis只能存数据,可是你写了,那会删的数据。怎么删的,这个问题思考过么?还有,你的数据已经设置了过期时间,但是?

2022-08-12 17:28:53 1420

空空如也

空空如也

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

TA关注的人

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