自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 如何优雅的用golang封装配置项(Functional Options)

导读最近要封装一个公共服务,涉及到配置项的地方总是找不到合理的方案,后来看了一下grpc在配置方面的封装,了解到原来是golang特有的Functional Options编程模式,今天分享给大家,希望你能用到,咱们直接来看代码版本V1上面代码很容易,就是想初始化一下Server的配置选项,看起来好像没什么问题,其实问题非常多既然是初始化一些配置选项,那么当然是有的是必选项(Addr, Port),有的是可选项(Timeout,MaxConns),可选项不选的话还得给个默认值,显然这种方式是不满

2023-02-24 17:00:46 646

原创 传个参数都有坑,我蚌埠了!

最近在工作中发现一个坑,关键是这个坑还不报错,所以在此记录一下,顺便也对相关知识点做一个总结。希望对您有用,如果这篇文章对您有帮助,记得点赞关注哦。关于这个坑,还得从「不定参数」说起不定参数不定参数,顾名思义,也就是「参数个数不确定」的时候golang支持的一种机制举个例子我们想实现一个多个数字累加的方法,既然是多个数字,那么数字的个数肯定是不确定的,所以我们可以如下编写func NumberSum(args ...int) (res int) 

2022-12-07 15:36:36 256

原创 golang的两把利器,协程和管道

golang的协程相信大家都不陌生,在golang中的使用也很简单,只要加上一个关键字「go」即可,虽然说大家都知道,但是真的在实际使用中又遇到这样那样的问题,坑其实还是挺多的。而网上很多文章和教程,要么就是讲的太简单,给你简单介绍一下协程和管道的使用,「点到为止」,要么就上来给你撸GPM模型,看的人「一脸懵逼」,所以我以「实际使用过程中遇到的问题」这个角度出发,可能会分多篇总结一下golang的协程相关的知识点,希望对你有用,如果觉得还不错,记得点个赞,点个关注。ps:如果你从来没有了解过golang的

2022-11-20 17:49:17 615

原创 Golang 的 “omitempty” 关键字略解

json和struct转换简单介绍熟悉 Golang 的朋友对于 json 和 struct 之间的转换一定不陌生,为了将代码中的结构体与 json 数据解耦,通常我们会在结构体的 field 类型后加上解释说明,注意:「结构体的属性首字母必须大写,否则json解析会不生效」type Person struct { Name string `json:"json_key_name"` Age  int &

2022-11-12 18:12:19 979

原创 被妖魔化的服务发现原来这么简单

微服务在当今的互联网架构中的重要性我在这里就不多说了,随着微服务的大范围应用,「服务发现」这个词也变的越来越火热。在平时的工作中,我发现现在很多人喜欢把一些很简单的事情说的很复杂,比如什么BFF架构,这中台那中台的。其实服务发现也是一样,很多文章把这块内容写的过于妖魔化,导致很多人看起来云里雾里的感觉好像很高深的样子,接下来就放弃这块了。「其实服务发现是个很简单的过程」,稍微有点编码基础的人都能看懂。今天对此做一个总结,如果对您有用,记得「点个赞点个关注」,如果有问题也可以留言,我看到了会第一时间回复。传

2022-11-02 19:06:31 67

原创 golang中数组和切片到底有什么区别?

数组大家都知道是具有「固定长度及类型的序列集合」,但是golang中又引入了「切片」,语法上看起来还和数组差不多,为什么会引入这些呢?切片和数组到底有什么区别呢?接下来咱们来一个一个的看数组 array定义数组var arr [5]int = [4]int{1,2,3,4,5}上述语句表示的意思是,我们来定义一个变量arr 为5个长度的int的数组类型,也就是[5]int,同时给赋值上了初始值 1、2、3、4、5,内存分布如图紧密挨在一起的数据结构集合注意

2022-10-27 19:12:18 612

原创 聊聊golang的make和new函数

今天在聊make和new函数之前,咱们先来看一种现象当然如果你对golang的指针还不是很了解,可以先看看这篇文章,以做到无缝连接👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇看完这个,我彻底理解了golang的指针case1var a inta = 1fmt.Println(a)//返回结果//1这个例子很简单,咱们定义了一个int类型的变量,然后赋值直接输出,这个没什么好疑问的,但是咱们把这个例子改一下case2  var p&n

2022-10-22 12:22:16 204

原创 手把手教你用golang撸rpc

引言"微服务"这个概念想必不用我说大家都知道,就算没接触过也听说过。简单来说就是以前系统中的,用户,搜索,内容,等等模块都在一起,这样会导致代码「越来越冗余,越来越难维护」,所以往往需要拆分这些服务,微服务在拆分的时候,会根据业务功能模块把一个单体的应用拆分成许多个独立的项目,每个项目完成一部分的业务功能,然后独立开发和部署。这些独立的项目就成为一个微服务。进而构成一个「服务集群」。看下面两张图可能会对微服务的概念更加直观单体服务单体服务微服务微服务RPC介绍微服务中很重要的一个内容就是「RP

2022-10-20 18:58:47 1535 2

原创 看完这个,我彻底了解了golang的指针

golang中一个非常鲜明的特点就是引入了指针的使用,这个在py、php、java中都是不支持的,但是很多读者都反馈说对指针不是很了解,所以今天写了这篇文章,当然我尽量用通俗的语言,希望对您有用。什么是指针想了解什么是指针,你先得了解数据是怎么取到的func main() { var a int a = 1 fmt.Println("a的值为", a)}上述代码非常简单,我相信不会golang的读者应

2022-10-20 18:53:07 541

原创 常见排序算法的golang实现

五种基础排序算法对比五种基础排序算法对比1:冒泡排序算法描述 比较相邻的元素。如果第一个比第二个大,就交换它们两个; 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对,这样在最后的元素应该会是最大的数; 针对所有的元素重复以上的步骤,除了最后一个; 重复步骤1~3,直到排序完成。 动图演示冒泡排序代码演示funcbubbleSort(arr[]int)[]int{iflen(arr)<=1{...

2022-05-17 15:44:40 116

原创 log4j漏洞的产生原因和解决方案,零基础都能看懂

核弹级bug Log4j,相信很多人都有所耳闻了,这两天很多读者都在问我关于这个bug的原理等一些问题,今天咱们就专门写一篇文章,一起聊一聊这个核弹级别的bug的产生原理以及怎么防止产生原因其实这个主要的原因,和日志有关,日志是应用软件中不可缺少的部分,Apache的开源项目log4j是一个功能强大的日志组件,提供方便的日志记录。最简单的日志打印我们看如下场景:这个场景大家应该很熟悉了,就是用户登录,咱们今天不用关心登录是怎么实现的,只用关心用户名name字段就可以了,代码如下

2021-12-13 16:44:45 832 2

原创 腾讯二面:20亿个QQ号码如何去重?

背景之前找工作在腾讯面试遇到了一个很有意思的面试题,当时我记得现场还没有答出来,后来回家想了一下其实也没有那么难,而且还挺有意思的,今天做个整理分享给大家,希望对你有用题目如下文件中有20亿个QQ号码,请设计算法对QQ号码去重,相同的QQ号码仅保留一个,内存限制1G. 这个题目的意思应该很清楚了,不过为了方便大家理解,我画了一个比较有年代感的动画,希望大家喜欢方法一排序去重其实说到去重,最简单的方法就是先排序,排序之后重复的QQ号码必然在一起,保留第一个,把其余重复的去掉就行,

2021-12-06 09:51:39 1282

原创 面试官:咱们来聊一聊mysql主从延迟

背景前段时间遇到一个线上问题,后来排查好久发现是因为主从同步延迟导致的,所以今天写一篇文章总结一下这个问题希望对你有用。如果觉得还不错,记得加个关注点个赞哦思维导图思维导图常见的主从架构随着日益增长的访问量,单台数据库的能力已经捉襟见肘。因此采用主库写数据,从库读数据这种将读写分离开的主从架构便随之衍生了出来。一主一从一主一从一主多从一主多从一主一从和一主多从是最常见的主从架构,实施起来简单并且有效,不仅可以实现高可用,还能读写分离,进而提升集群的并发能力

2021-11-17 16:35:53 678

原创 mysql分表之后怎么平滑上线?

分表的目的项目开发中,我们的数据库数据越来越大,随之而来的是单个表中数据太多。以至于查询数据变慢,而且由于表的锁机制导致应用操作也受到严重影响,出现了数据库性能瓶颈。当出现这种情况时,我们可以考虑分表,即将单个数据库表进行拆分,拆分成多个数据表,然后用户访问的时候,根据一定的算法,让用户访问不同的表,这样数据分散到多个数据表中,减少了单个数据表的访问压力。提升了数据库访问性能。举个栗子举个栗子比如咱们最常见的用户表(user表)id user_id 其他字段 主键

2021-10-28 10:31:23 236

原创 如何用redis统计海量UV?

前言我们先思考一个常见的业务问题:如果你负责开发维护一个大型的网站,有一天老板找产品经理要网站每个网页每天的 UV 数据,然后让你来开发这个统计模块,你会如何实现?统计uv的常用方法以及优缺点其实要是单纯的统计pv是比较好办的,直接用redis的incr就行,但是uv的话,它要去重,同一个用户一天之内的多次访问请求只能计数一次。这就要求每一个网页请求都需要带上用户的 ID,无论是登陆用户还是未登陆用户都需要一个唯一 ID 来标识。set比较容易想到的是为每一个页面一个独立的 set 集合

2021-10-12 15:05:52 433

原创 12306抢票算法居然被曝光了,居然这么简单

导读相信大家应该都有抢火车票的经验,每年年底,这都是一场盛宴。然而你有没有想过抢火车票这个算法是怎么实现的呢? 应该没有吧,咱们今天就来一一探讨。其实并没有你想的那么难bitmap与位运算redis的bitmap基本使用咱们之前已经介绍过了,如果不是很熟悉的朋友可以看看这里 redis bitmap的基本操作和应用今天在这里咱们主要是先回顾一下位运算12306抢票算法详解我们以北京到西安这趟高铁为例,比如我的路线就是从北京到西安,车上如果只剩最后一张票了,那么如果有其他人,在

2021-09-27 15:01:23 414

原创 手把手教你Golang的协程池设计

前言现在很多公司都在陆续的搭建golang的语言栈,大家有没有想过为什么会出现这种情况?一是因为go比较适合做中间件,还有一个原因就是go的并发支持比较好,也就是咱们平时所谓的高并发,并发支持离不开协程,当然协程也不是乱用的,需要管理起来,管理协程的方式就是协程池,所以协程池也并没有那么神秘,今天咱们就来一步一步的揭开协程池的面纱,如果你没有接触过go的协程这块的话也没有关系,我会尽量写的详细。goroutine(协程)先来看一个简单的例子funcgo_worker(namestrin..

2021-09-22 15:47:28 651

原创 看了这篇还不会Linux性能分析和优化,你来打我

前言一般互联网的项目都是部署在linux服务器上的,如果linux服务器出了问题,那么咱们平时学习的高并发,稳定性之类的是没有任何意义的,所以对linux性能的把握就显得非常重要,当然很多同学可能觉得这些是运维同学的事情,但是我不这么认为,不管你是架构师,还是crud boy,对项目有个全局的掌控是一项非常重要的基本素质,所以总结了这篇文章,希望对您有用,如果您觉得我写的还不错,看完记得点个赞,点个再看哦。咱们废话不用多说,直接进入正题。影响linux服务器性能的因素cpuCPU是操作系统稳

2021-05-06 17:02:33 178

原创 redis实际应用-限流

为什么要做限流首先让我们先看一看系统架构设计中,为什么要做“限流”。旅游景点通常都会有最大的接待量,不可能无限制的放游客进入,比如故宫每天只卖八万张票,超过八万的游客,无法买票进入,因为如果超过八万人,景点的工作人员可能就忙不过来,过于拥挤的景点也会影响游客的体验和心情,并且还会有安全隐患;「只卖N张票,这就是一种限流的手段」。软件架构中的服务限流也是类似,也是当系统资源不够的时候,已经不足以应对大量的请求,为了保证服务还能够正常运行,那么按照规则,「系统会把多余的请求直接拒绝掉,以达到限流的效

2021-04-22 16:54:30 247

原创 防盗链的原理以及实现

大家在访问网站的时候,经常会看到图片展示不出来的时候,如下图大家有没有想过这是为什么嘛?其实这是一种简单的防盗链的处理,那么盗链是什么呢?为什么需要防呢?咱们今天来一起揭开它神秘的面纱。盗链的概念盗链是指在自己的页面上展示一些并不在自己服务器上的一些内容, 获取别人的资源地址,绕过别人的资源展示页面,直接在自己的页面上向最终用户提供此内容。 一般被盗链的都是图片、 音乐、视频、软件等资源。通过盗链的手段可以减轻自己服务器的负担比如我直接在自己的网站上<imgsrc="htt.

2021-04-06 15:16:07 1209

原创 mysql一张表到底能存多少数据?

前言程序员平时和mysql打交道一定不少,可以说每天都有接触到,但是mysql一张表到底能存多少数据呢?计算根据是什么呢?接下来咱们逐一探讨知识准备数据页在操作系统中,我们知道为了跟磁盘交互,内存也是分页的,一页大小4KB。同样的在MySQL中为了提高吞吐率,数据也是分页的,不过MySQL的数据页大小是16KB。(确切的说是InnoDB数据页大小16KB)。详细学习可以参考官网 我们可以用如下命令查询到。mysql>SHOWGLOBALSTATUSLIKE'innodb...

2021-02-19 11:10:59 5470 4

原创 mysql事务的实现原理

此篇文章算是对mysql事务的一个总结,基本把mysql事务相关的知识点都涵盖到了,面试问来问去无非也就是这些,在了解这些之前我们先对mysql在执行的过程中 有一个整体的认识,如下图 如上图所示,MySQL服务器逻辑架构从上往下可以分为三层:(1)第一层:处理客户端连接、授权认证等。(2)第二层:服务器层,负责查询语句的解析、优化、缓存以及内置函数的实现、存储过程等。(3)第三层:存储引擎,负责MySQL中数据的存储和提取。MySQL中服务器层不管理事务,事务是由存储引擎实现的。MySQL

2021-02-01 10:42:33 1855

原创 redis不小心清空了数据库(flushall),只能跑路吗?

前言前段时间这个新闻在行业内闹的沸沸扬扬 一名程序员因为对公司不满,删除了公司的数据库,后来被判7年,这也给咱们程序员敲响了一记警钟,无论发生什么,这种做法都是非常不妥当的,不光是职业道德的问题,而且还会收到法律的制裁。但是我们都知道redis中有一个叫flushall的命令,如果不小心在线上执行了会怎么办呢?「tips:本文仅仅作为理论讲解,如果要尝试请在本地环境尝试,若在线上执行之后导致数据无法恢复,后果自负!!!」恢复数据思路 大家都知道redis和memcache都作为缓存使用

2021-01-17 18:18:20 1099 9

原创 微信附近的人,用redis也能实现?(GEO)

相信微信附近的人的功能大家都应该用过![](https://imgkr2.cn-bj.ufileos.com/7eb2aa9c-f094-4f2c-8ec6-ef1e923a1776.jpeg?UCloudPublicKey=TOKEN_8d8b72be-579a-4e83-bfd0-5f6ce1546f13&Signature=8O9UcDXfJu6w3oGQ1DBTtKxs%252FxQ%253D&Expires=1609400305)我可以很随意的通过我自己的定位能看到我附近的人,

2020-12-30 17:46:30 334

原创 面试官问redis分布式锁,如何设计才能让他满意?

前言对于分布式锁的问题我也查过很多资料,感觉很多方式实现的并不完善,或者看着云里雾里的,不知所以然,于是就整理了这篇文章,希望对您有用,有写的不对的地方,欢迎留言指正。首先咱们来聊聊什么是分布式锁,到底解决了什么问题?直接看代码 $stock = $this->getStockFromDb();//查询剩余库存 if ($stock>0){ $this->ReduceStockInDb(); // 在数据库中进行减库存操作 echo "successful"; }

2020-12-01 09:47:27 498 2

原创 redis五种数据类型的应用

redis的五种数据类型和使用场景string类型string类型多用于缓存set key value(value可以为json字符串)setnx多用于分布式锁(后面详细整理)计数器incr article:{文章id}:readcountget article:{文章id}:readcountweb集群session共享redis实现session共享https://www.cnblogs.com/cxx8181602/p/9759645.html分布式系统全局序列号(分库分表的主键

2020-11-04 14:08:50 218

原创 redis缓存穿透穿透解决方案-布隆过滤器

redis缓存穿透穿透解决方案-布隆过滤器我们先来看一段代码 cache_key = "id:1" cache_value = GetValueFromRedis(cache_key); //判断缓存是否有数据 if cache_value != nil{ //如果有 直接返回数据 return cache_value } db_value = GetValueFromDb(cache_key) // 从数据库中查询数据 if db_value == n

2020-10-26 10:40:48 394

原创 Redis 对过期数据的处理

Redis 对过期数据的处理在 redis 中,对于已经过期的数据,Redis 采用两种策略来处理这些数据,分别是惰性删除和定期删除惰性删除惰性删除不会去主动删除数据,而是在访问数据的时候,再检查当前键值是否过期,如果过期则执行删除并返回 null 给客户端,如果没有过期则返回正常信息给客户端。它的优点是简单,不需要对过期的数据做额外的处理,只有在每次访问的时候才会检查键值是否过期,缺点是删除过期键不及时,造成了一定的空间浪费。源码robj *lookupKeyReadWithFlags(red

2020-10-18 22:45:34 893

原创 redis的两种持久化的机制,你真的了解么?

redis提供了两种持久化的机制 RDB和AOF机制RDB(redis Database):RDB保存某一个时间点之前的快照数据。AOF(Append-Only File):指所有的命令行记录以redis命令请求协议的格式完全持久化存储保存为AOF文件混合持久化(4.0版本以后):指进行AOF重写时子进程将当前时间点的数据快照保存为RDB文件格式,而后将父进程累计命令保存为AOF格式。RDB快照有两种触发方式1:为通过配置参数,如下:通过一定的时间周日内看,命令执行的个数,超过阈值立即执行快照

2020-10-16 10:32:25 319

原创 redis源码之dict

大家都知道redis默认是16个db,但是这些db底层的设计结构是什么样的呢?我们来简单的看一下源码,重要的字段都有所注释typedef struct redisDb { dict *dict; /* The keyspace for this DB 字典数据结构,非常重要*/ dict *expires; /* Timeout of keys with a timeout set 过期时间*/ dict *blo

2020-10-15 10:14:19 275

原创 redis源码之SDS

#1:SDS介绍我们在redis中执行命令set key name的时候,key和name都是字符串类型,而且字符串(string)在redis中是会经常用到的类型,那redis是如何保存字符串的呢?我们接下来往下看众所周知,redis是c写的,在c中使用char来保存字符串,并且用\0作为字符串的结尾,但是redis不是这样保存的,redis是使用一种叫SDS的结构来保存字符串的。结构如下(redis3.2以前) struct sdshdr{ int len; int free;

2020-10-09 10:56:45 313

原创 PHP 导出csv文件乱码解决方案

我们经常导出csv文件都喜欢直接用file_put_contents('file_name', $file);这种方式直接导出,如果没有中文字符还好,要是有中文字符的话就会出现乱码的情况,让人很是头疼,下面是乱码解决方案 $str = "导出的含有中文字符的内容";$fp = fopen("export.csv", "a");//在写入数据之前先把bom头写到文件里  fwrite...

2018-11-06 20:55:18 485

原创 工作中遇到的一些小问题

1:php在用excel类的时候得注意,excel名称不能太长  否则会报错  Maximum 31 characters allowed in sheet title;解决方法   $xls_name = mb_strimwidth($xls_name, 0, 28, "...");  //excel的文件名太长会报错,需要截取...

2018-01-04 09:55:08 1088

原创 php简单工厂模式

p.p1 {margin: 0.0px 0.0px 10.0px 0.0px; font: 11.0px Tahoma; color: #000000; font: 11.0px Tahoma; color: #000000; -webkit-text-stroke: #000000;简单工厂模式工厂模式的意义: 在开发中,经常存在客户端和服务端分离开发的情况,也就是说服务端...

2017-06-20 11:38:53 211

原创 sql语句

mysql【创建账号】:create user 'finance'@'%' IDENTIFIED BY ‘xxx’;【给数据库权限】:grant all on database.* to 'finance'@'%';all可以换成 select,update,….【撤销权限】:revoke all on *.* from 'finance'@'%';【跳过权限检测启动mysql】解决root账号无...

2017-06-16 15:13:45 174

原创 svn命令使用

1、将文件checkout到本地目录de &gt;svn checkout path(path是服务器 上的目录)例如:svn checkout svn://192.168.1.1/pro/domainde&gt;2、往版本库中添加新的文件de &gt;svn add file例如:svn add test.php(添加test.php)svn add *.php(添加当前目录下所有的...

2017-05-03 19:40:19 271

原创 C语言中易错的地方(3)指针

1:指针 查看变量的地址的方式 int a = 10; printf("%08X%d\n",&amp;a); 或者 printf("%p\n",&amp;a); 表示地址的方式(指针) int a = 5; int* pa = &amp;a; 表示 pa指向了一个int型变量  也可以称其为pa所在的内存为一个int型的整数 我们成int*为指针类型,pa为指针类型的变量(简称指针) 关于指针 1...

2015-12-24 22:52:20 285

原创 C语言中易错的地方(一)

c++中易错的地方1:scanfint a;int b;scanf("%d-=%d",&amp;a,&amp;b);printf("a=%d,b=%d",a,b);在scanf中  a和b前面的&amp;一定不能掉在输入的时候,一定要严格的按照%d-=%d的格式写,比如这次就应该输入11-=12  11和12为a和b的int类型2:内存的表示 物理内存的单元是“字节” 一个字节占8个位,如下图所示...

2015-11-30 22:58:24 316

原创 索引简介

索引 定义:索引是数据库系统内部自动维护的隐藏的"数据表",可以极大的加快数据的查找速度。这个隐藏的数据表,其中的数据是自动排序好的,其查找速度就是建立在这个基础上的。 通常,所谓索引,其实是指一个表的某个或者某些字段作为索引数据字段就可以了,形式为 :  索引类型(要建立索引的字段名) 索引的类型主要分为以下几种 普通索引: 形式 : key(字段名)    加快查询速度 唯一索引: 形式 :...

2015-09-14 22:27:18 205

原创 文件下载函数

function download($file_path,$file_name){ $file_name = iconv("UTF-8","GB2312",$file_name); $file = $file_path.$file_name; if(!file_exists($file)){ echo "该文件不存在"; die(); } $filesize = filesize($fil...

2015-05-14 23:33:43 216

空空如也

空空如也

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

TA关注的人

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