自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(50)
  • 资源 (1)
  • 问答 (1)
  • 收藏
  • 关注

原创 安装 ROS 与mqtt_bridge 指北

ROS官方提供了一个叫做mqtt_bridge的功能包,这个功能包提供了ROS与MQTT的双向通信功能。该包主要通过Python3 语言实现(这里划个重点),以下是官网地址:​​​​​​http://wiki.ros.org/mqtt_bridge在ROS系统中我们希望通过mqtt的方式进行通信,在Topic中进行读写操作。我们采用的方式就是通过ROS官方推出的mqtt_bridge软件包实现。安装ROS (非ROS2) 操作环境:Ubuntu 20.04.5一、前置操作: 确

2022-11-09 18:29:33 2521 2

原创 体验 Shifu 解决报错流程

打开技术文档,首先看了一下目录,简单了解一下框架结构,目录的其中重点是“下载安装” 和 ”本机安装测试“,这两部分。安装前提是:都需要安装Docker,文中是安装 Docker Desktop,我们是Linux安装Docker就行从文档中总结得出,Shifu安装方式共分为三种: 就是各种组件配置安装很麻烦,并且没有deviceshifu的pods资源,无法进行资源的交互,也就是无法使用shifu的API,使用数字孪生的命令(这也是卡了我许久的原因,一直以为是环境配置错误,所以一直回滚数据,但运行时还是

2022-09-28 20:08:26 1208

原创 Redis的全量同步和增量

slave节点第一次连接master节点时slave节点断开时间太久,中的offset已经被覆盖时。

2022-09-23 09:59:54 1656

原创 Redis主从复制的操作和配置

usr/local/redis/redis-4.0.9/src/redis-server 为安装目录下的redis-server服务文件地址。可以发现,只有在7001这个master节点上可以执行写操作,7002和7003这两个slave节点只能执行读操作。我们在一台服务器上开启三个Redis服务,模拟redis集群,一主两从,结构如下。端口信息为7001,7002,7003(若使用的服务器记得开启端口的防火墙)利用redis-cli连接7001,执行。利用redis-cli连接7003,执行。

2022-09-20 17:54:25 465

原创 Redis到底是多线程还是单线程

因此,对于Redis的核心网络模型,在Redis 6.0之前确实都是单线程。抛开持久化不谈,Redis是纯 内存操作,执行速度非常快,它的性能瓶颈是网络延迟而不是执行速度,因此多线程并不会带来巨大的性能提升。引入多线程会面临线程安全问题,必然要引入线程锁这样的安全手段,实现复杂度增高,而且性能也会大打折扣。Redis v4.0:引入多线程异步处理一些耗时较旧的任务,例如异步删除命令unlink。Redis v6.0:在核心网络模型中引入 多线程,进一步提高对于多核CPU的利用率。

2022-09-19 17:33:27 120

原创 Redis的持久化(RDB和AOF)

方式save指令bgsave指令读写同步异步阻塞客户端指令是否额外内存消耗否是启动新进程否是。

2022-09-19 17:29:42 189

原创 Go语言各种扩容机制(防止混淆)

即buckets数量不变,经过重新组织后overflow的bucket数量会减少,即节省了空间又会提高访问效率。数据搬迁过程中原bucket中的键值对将存在于新bucket的前面,新插入的键值对将存在于新bucket的后面。考虑到如果map存储了数以亿计的key-value,一次性搬迁将会造成比较大的延时,Go采用逐步搬迁策略,即。的搬迁动作,把松散的键值对重新排列一次,以使bucket的使用率更高,进而保证更快的存取。后续对map的访问操作会触发迁移,将oldbuckets中的键值对逐步的搬迁过来。

2022-09-17 11:52:23 569 1

原创 简介GC垃圾回收

​ 以上便是Golang的GC全部的标记-清除逻辑及场景演示全过程。GoV1.3- 普通标记清除法,整体过程需要启动STW,效率极低。GoV1.5- 三色标记法, 堆空间启动写屏障,栈空间不启动,全部扫描之后,需要重新扫描一次栈(需要STW),效率普通GoV1.8-三色标记法,混合写屏障机制, 栈空间不启动,堆空间启动。整个过程几乎不需要STW,效率较高。

2022-09-14 17:49:57 220

原创 Docker镜像的制作(容器转镜像和DockerFile)

【代码】Docker镜像的制作(容器转镜像和DockerFile)

2022-09-13 18:46:03 701

原创 Docker数据卷和数据卷容器操作

有了上面数据卷的概念,我们再设想一下若数据卷数量过多的情况下,我们如何进行管理?所以有了管理数据卷的数据卷容器概念。图左:容器与宿主机上的某一目录或文件进行挂载 -v 于是容器中和宿主机之间通过挂载的数据卷进行通信,实现了容器数据的持久化和外部机器和容器之间的通信。图右:我们也可以使用多个容器,与宿主机的同一个数据卷(文件或目录)进行挂载。我们现创建c3容器为数据卷,将c1 c2 容器挂载到c3上。创建启动c3数据卷容器,使用-v 参数设置数据卷。启动容器时,使用 -v 参数设置数据卷。

2022-09-13 15:03:13 335

原创 Docker底层原理浅析

Docker镜像创建容器后,会在只读镜像上添加读写层(容器),我们对容器进行的所有更新操作,都是在读写层上改动文件,而新修改的文件会将下面只读镜像中的文件隐藏起来。在统一文件系统中只能看到最新的文件。由于docker中镜像是分层的,tomcat虽然只有70多MB,但他需要依赖于父镜像和基础镜像,所有整个对外暴露的tomcat镜像大小500多MB。我们可以看到docker下载确实是分层的。

2022-09-13 14:26:30 294

原创 Redis和C和golang语言底层String结构分析

str unsafe.Pointer //stringStruct.str:字符串的首地址;len int //stringStruct.len:字符串的长度;}stringStruct.str:字符串的首地址;stringStruct.len:字符串的长度;所以字符串的结构和切片非常相像,只是缺少了切片的cap字段。事实上string和切片,准确的说是byte切片经常发生转换。因为本文的重点是讲述string底层结构,所以不展开[]byte和string的转换关系。

2022-09-06 22:38:34 435

原创 Golang垃圾回收原理GC

Golang的垃圾回收(GC)就是将不再需要的内存块释放掉,否则不能回收的垃圾就是泄露的内存。

2022-09-06 10:45:29 879

原创 浅析Golang中内存管理

Golang内存分配是个相当复杂的过程,其中还掺杂了GC的处理,这里仅仅对其关键数据结构进行了说明,了解其原理而又不至于深陷实现细节。Golang程序启动时申请一大块内存,并划分成spans、bitmap、arena区域arena区域按页划分成一个个小块span管理一个或多个页mcentral管理多个span供线程申请使用mcache作为线程私有资源,资源来源于mcentral。

2022-09-06 09:58:24 713

原创 浅析什么是IO多路复用

单线程或单进程同时监测若干个文件描述符是否可以执行IO操作的能力。

2022-09-05 22:24:06 444

原创 进程线程协程的区别

5)协程并不是取代线程, 而且抽象于线程之上, 线程是被分割的CPU资源, 协程是组织好的代码流程, 协程需要线程来承载运行, 线程是协程的资源, 但协程不会直接使用线程, 协程直接利用的是执行器(Interceptor), 执行器可以关联任意线程或线程池, 可以使当前线程, UI线程, 或新建新程.。1) 地址空间:线程是进程内的一个执行单元,进程内至少有一个线程,它们共享进程的地址空间,而进程有自己独立的地址空间。2) 资源拥有:进程是资源分配和拥有的单位,同一个进程内的线程共享进程的资源。

2022-09-05 20:29:18 193

原创 redolog 和 undolog

2.之后等待一段时间后,再进行对磁盘的持久化操作。若此时出现异常的错误(如断电,服务异常中断之类的)事后就会启用重做日志文件,对数据进行回复操作。前者是在内存中,后者在磁盘中。当事务提交之后会把所有修改信息都存到该日志文件中,用于在刷新脏页到磁盘,发生错误时,进行数据恢复使用。重做日志,记录的是事务提交时数据页的物理修改,是用来实现事务的持久性。1.在数据库进行数据更新操作时, 会先在内存结构中的。中 缓存 数据的更新操作。之后会追加到磁盘中的。就没有用了,等待一段周期,要定时清理。......

2022-08-27 10:55:11 489

原创 数据库的日志顺序读写以及数据文件随机读写

当在buffer pool的缓存页里更新了数据之后,必须要写一条redo log日志,这个redo log日志,其实就是走的顺序写。如下图,是一个磁盘文件的示例,里面有很多数据页,然后你可能需要在一个随机的位置读取一个数据页到缓存,这就是。从上图可以看到,写redo log日志的时候,其实是不停地在一个日志文件末尾追加日志的,这就是磁盘顺序写。简单来说,MySQL在工作的时候,尤其是进行增删查改的时候,肯定会先。所谓顺序写,就是在一个磁盘日志文件里,一直在末尾追加日志。,这个过程就是典型的。...

2022-08-27 10:50:50 662

原创 Mysql锁的应用

入门概述 我们为什么要学习Linux linux诞生了这么多年,以前还喊着如何能取代windows系统,现在这个口号已经小多了,任何事物发展 都有其局限性都有其天花板。就如同在国内再搞一个社交软件取代腾讯一样,想想而已基本不可能,因 为用户已经习惯于使用微信交流,不是说技术上实现不了解而是老百姓已经习惯了,想让他们不用,即 使他们自己不用亲戚朋友还是要用,没有办法的事情。 用习惯了windows操.....

2022-08-27 09:24:57 742 1

原创 Mysql的事务并发问题和解决办法

含义:多个事务同时对数据进行修改,其中一个事务的数据被另一个事务的操作覆盖,导致丢失修改。含义:一次事务中,两次读操作中,读到的数据行数不一致。读到了新增或者读不到删除的语句。含义:一次事务中,两次读操作中,读出来的数据内容不一致。在写写环境下,MySQL会通过锁来保证并发修改的正常。含义:在事务过程中,读到了其它事务为提交的数据。解决方法:将数据库事务提升到。解决方法:将数据库事务提升到。解决方法:将数据库事务提升到。...............

2022-08-26 14:24:26 3266

原创 通过Map的Val值,求得最大的Keys切片

3.若小于最小值,则遍历map的下一个数进行比较,若大于最小值,则与切片的下一个数字进行比较,判断插入位置。1.文章以逗号分隔,所以通过 strings.Split 求得单词切片集。2.每次遍历的Val值,与切片最小值进行比较。2.出现次数,通过Map结构。

2022-08-22 21:39:23 215

原创 浅析GMP调度模型

地鼠(Gopher)的工作任务是:工地上有若干砖头,地鼠借助小车把砖头运送到火种上去烧制。M 就可以看作图中的地鼠,P 就是小车,G 就是小车里装的砖。

2022-08-17 22:25:31 269

原创 协程和线程的上下文切换详解

什么是上下文切换?上下文切换的时机?CPU通过分配时间片来执行任务,当一个任务的时间片用完,就会切换到另一个任务。在切换之前会保存上一个任务的状态,当下次再切换到该任务,就会加载这个状态。——任务从保存到再加载的过程就是一次上下文切换。切出线程的时间片用完有一个比切出线程优先级更高的线程需要被运行虚拟机的垃圾回收动作。...

2022-08-16 21:11:34 1326

原创 Goroutine协程是什么

是Go语言特有的名词。区别于进程Process,线程Thread,协程Coroutine,因为Go语言的创造者们觉得和他们是有所区别的,所以专门创造了Goroutine。

2022-08-16 18:13:27 216

原创 进程线程协程

线程本身不拥有系统资源,大部分情况下,它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并行多个线程,每条线程并行执行不同的任务,进程是系统进行资源分配的一个独立单位,操作系统内核通过进程控制块(PCB,process control block)来感知进程。同时这两种实现方式又产生了多种不同的组合模型。(User-Level Thread,UTL)和。进程分为用户级和内核级。..................

2022-08-16 18:05:34 244

原创 并发与并行的区别

并发程序的执行通常是不确定的(异步性),这种不确定来源于资源之间的相关依赖和竞态条件,这可能导致执行线程之间的相互等待,使得并发程序即时在多核环境上也无法做到真正并行执行而降级为串行执行。并行程序的每个执行模块在逻辑上是独立的,即线程执行时可以独立完成任务,从而做到同一时刻多个指令能够同时执行。在同一时间段内,多个线程会被分配一定的执行时间片,在 CPU 上被快速轮换执行。也就是w线程执行的时间片时间耗尽或者任务完成了,会被 CPU 调度换下,执行其他的线程任务。...

2022-08-16 17:48:32 112

原创 CGI是什么?golang的net/http/cgi包

在golang标准库中,http/cgi包,很疑惑CGI技术是什么。

2022-08-02 16:28:00 737

转载 连接冲突域和广播域的设备

冲突域是一种物理分段,指连接到同一导线上所有工作站的集合、同一物理网段上所有节点的集合或是以太网上竞争同一带宽节点的集合。冲突域表示冲突发生并传播的区域,这个区域可以被认为是共享段。在OSI模型中,冲突域被看作是OSI第一层的概念,连接同一冲突域的设备有集线器、中继器或其它简单的对信号进行复制的设备。其中,使用第一层设备(如中继器、集线器)连接的所有节点可被认为是在同一个冲突域内,而第二层设备(如网桥、交换机)和第三层设备(如路由器)既可以划分冲突域,也可以连接不同的冲突域。广播域是指可以接收到同样广播消息

2022-07-29 21:12:53 915

原创 GO中map的底层实现

当我开始学习map底层时,便思考一个问题,hash到底是什么?散列?数据结构?一种算法?于是便学习了一下关于各语言中的map实现笼统的来说,go的map底层是一个hash表,通过键值对进行映射。键通过哈希函数生成哈希值,然后go底层的map数据结构就存储相应的hash值,进行索引,最终是在底层使用的数组存储key,和value。使用红黑树组织,性能稍低但是稳定性很好。使用模版在编译期生成代码,好处是效率高,但是缺点是代码膨胀、编译时间也会变长。...

2022-07-21 17:37:11 3068

原创 什么是Hash(哈希)?

概念哈希即可以是一种数据结构,也可以是一种函数概念,那么在查找时通过该函数可以很快找到该元素。哈希()方法,哈希方法中使用的转换函数称为,构造出来的结构称为哈希算法不过是一个均匀的运算,它的输入可以是字符串,可以是数据,可以是任何文件,经过哈希运算后,变成一个固定长度的输出,该输出就是哈希值。但是哈希算法有一个很大的特点,...

2022-07-21 15:56:42 17145

转载 Golang 标准库限流器 time/rate 实现剖析(下)

限流器是微服务中必不缺少的一环,可以起到保护下游服务,防止服务过载等作用。上一篇文章 《Golang 限流器 time/rate 使用介绍》 简单介绍了 time/rate 的使用方法,本文则着重分析下其实现原理。建议在正式阅读本文之前,先阅读下上一篇文章。上一篇文章讲到,time/rate 是基于 Token Bucket(令牌桶) 算法实现的限流。本文将会基于源码,深入剖析下 Golang 是如何实现 Token Bucket 的。其代码也非常简洁,去除注释后,也就 200 行左右的代码量。同时,我也提

2022-07-11 22:21:32 351 1

转载 Golang 标准库限流器 time/rate 使用介绍(上)

限流器是后台服务中的非常重要的组件,可以用来限制请求速率,保护服务,以免服务过载。限流器的实现方法有很多种,例如滑动窗口法、Token Bucket、Leaky Bucket 等。其实 Golang 标准库中就自带了限流算法的实现,即 。该限流器是基于 Token Bucket(令牌桶) 实现的。简单来说,令牌桶就是想象有一个固定大小的桶,系统会以恒定速率向桶中放 Token,桶满则暂时不放。而用户则从桶中取 Token,如果有剩余 Token 就可以一直取。如果没有剩余 Token,则需要等到系统中被

2022-07-11 22:19:19 512

原创 常用限流方法总结

我在写博客接口的时候一直在思考一个问题,因为我曾经用抓包软件模拟请求去图书馆抢座位,当时一不小心重复访问了上千次,导致本就脆弱的服务当场崩溃(我不确定是不是我干的)。所以思考这个问题:常用的限流设计方法有哪些?降级降级是当服务出现问题或者影响到核心流程时,需要暂时屏蔽掉,待高峰或者问题解决后再打开限流限流的目的是通过对并发访问/请求进行限速,或者对一个时间窗口内的请求进行限速来保护系统,一旦达到限制速率则可以拒绝服务、排队或等待、降级等处理熔断熔断是什么?熔断一般是指依赖的外部接口出现故障的情况断绝和外部接

2022-07-11 22:15:48 1517

原创 点赞操作实现

我准备实现一个点赞功能,如何实现点赞的增加和取消?1.首先增加和取消所需要的限制条件是{一个用户 对 一个文章/评论 进行点赞操作}2.我需要判断当前用户是否已经进行了点赞操作3.我并不希望一个用户永远只能给一篇文章点赞一次。所以我可以给用户点赞记录做一个有效期:如一星期后,该用户还可以给该文章点赞1.首先我并不想将点赞操作放入文章,评论中各写一份逻辑。所以我将点赞操作独自抽离出来。2.我们需要获取用户ID 文章/评论ID 判断是文章还是评论3.我们使用redis缓存记录对于点赞数:我们直接设置

2022-07-11 21:40:54 1634

原创 关于Redis中Hash或Set类型元素字段设置过期时间的思考

在写点赞功能实现时,突发奇想,假如我想给每个用户的点赞记录缓存,做一个过期时间,那么我该如何实现? 通过查阅资料,得知早有人给 Redis 项目提出类似的 issue:要求支持元素级别的过期。项目的维护者也早已指出:不可能支持这样的 feature,因为违背了 Redis 的设计理念:简单、高效。 不过,在 Google Group 上看到 Redis 的作者针对这类需求给出了 2 个实现方案:用 redis 的普通 set 类型实现。将过期时间写入元素名中或另添加一个该元素的过期时间字段比如平常只是 ad

2022-07-11 11:02:10 11647 1

转载 什么是ZooKeeper

上次写了一篇 什么是消息队列?以后,本来想入门一下Kafka的(装一下环境、看看Kafka一些概念啥的)。后来发现Kafka用到了ZooKeeper,而我又对ZooKeeper不了解,所以想先来学学什么是ZooKeeper,再去看看什么是Kafka。ZooKeeper相信大家已经听过这个词了,不知道大家对他了解多少呢?我第一次听到ZooKeeper的时候是在学Eureka的时候(外行人都能看懂的SpringCloud,错过了血亏!),同样ZooKeeper也可以作为注册中心。后面听到ZooKeeper的时候

2022-07-09 11:57:05 127

原创 关于Redis哨兵模式的思考

若要使用哨兵模式,就不得不提到Redis的主从复制(知识就是这么一环接一环的): 一般来说,要将Redis运用于工程项目中,只使用一台Redis是万万不能的,原因如下:例如:在一般,多读取,少更新的项目中,我们可以搭建如下redis集群: 通过发送命令,让Redis服务器返回监控其运行状态,包括主服务器和从服务器。当哨兵监测到master宕机,会自动将slave切换成master,然后通过发布订阅模式通知其他的从服 务器,修改配置文件,让它们切换主机。 然而哨兵也可能挂掉,所以我们一般不采用单个哨兵的模式

2022-07-09 11:51:38 387

原创 Bloom布隆过滤器使用API(GO)

API清单 func EstimateParameters(n uint, p float64) (m uint, k uint) func Locations(data []byte, k uint) []uint64 type BloomFilter func From(data []uint64, k uint) *BloomFilter func New(m uint, k uint) *BloomFilter func NewWithEstimates(n uint

2022-07-09 08:52:44 271

翻译 Go语言Bloom过滤器md说明

Bloom过滤器是集合的简明/压缩表示,其中主要要求是进行成员资格查询;i、 例如,项目是否为集合的成员。当元素确实存在时,布卢姆过滤器将始终正确报告集合中元素的存在。Bloom过滤器可以使用比原始集少得多的存储空间,但它允许一些“误报”:有时它可能报告某个元素在该集中,而它不在该集中。当你构建时,你需要知道你有多少元素(期望的容量),以及你愿意容忍的期望假阳性率是多少。常见的假阳性率为1%。假阳性率越低,需要的内存就越多。同样,容量越大,使用的内存就越多。您可以按以下方式构造能够接收100万个元素、误报率

2022-07-08 22:33:35 330

原创 关于Redis三大问题的解决方案笔记

缓存击穿: 就是说某个访问非常频繁的热点 key ,处于集中式高并发访问的情况,当这个 key 在失效的瞬间,大量的请求就击穿了缓存,直接请求数据库,直接穿过了Redis。解决方式:缓存穿透: 指的是缓存和数据库中都不存在的数据被请求,这种情况通常是被黑客攻击力,如果不做好防御很容易导致数据库被请求打死。比如黑客使用负数id查询你的某个表,我们的id通常不会设置为负数。解决方式:数据库未查询到,则在缓存中设置一个空值,这种办法无法解决采用不同负数id请求的情况。使用布隆过滤器,将数据库中所有的数据映射到布隆

2022-07-08 22:09:15 361

个人博客数据库设计 gorm

关于gorm的数据库设计

2022-07-08

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

TA关注的人

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