- 博客(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主从复制的操作和配置
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
原创 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数据卷和数据卷容器操作
有了上面数据卷的概念,我们再设想一下若数据卷数量过多的情况下,我们如何进行管理?所以有了管理数据卷的数据卷容器概念。图左:容器与宿主机上的某一目录或文件进行挂载 -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中内存管理
Golang内存分配是个相当复杂的过程,其中还掺杂了GC的处理,这里仅仅对其关键数据结构进行了说明,了解其原理而又不至于深陷实现细节。Golang程序启动时申请一大块内存,并划分成spans、bitmap、arena区域arena区域按页划分成一个个小块span管理一个或多个页mcentral管理多个span供线程申请使用mcache作为线程私有资源,资源来源于mcentral。
2022-09-06 09:58:24 713
原创 进程线程协程的区别
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
转载 连接冲突域和广播域的设备
冲突域是一种物理分段,指连接到同一导线上所有工作站的集合、同一物理网段上所有节点的集合或是以太网上竞争同一带宽节点的集合。冲突域表示冲突发生并传播的区域,这个区域可以被认为是共享段。在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外键失效问题
2022-07-07
TA创建的收藏夹 TA关注的收藏夹
TA关注的人