Uncategorized

面试ip查找问题

面试ip查找问题 现在有一台服务器内存是4G,硬盘无限大,服务器上存储了大量nginx 或者apache的访问日志,如何查询一个ip是否在服务器中访问过(注意不能借助第三方组建或者中间件工具,redis mysql es 等) 检索指定ip是否访问过? 在服务器协议个程序读取指定目录一条一条文件进行过滤找到了就通知在哪一个文件, 直接使用grep检索指定目录 如何检索一批ip是否访问过? 同样写一个程序一个文件一行读取后会被ip组进行比较 使用sed awk grep 进行检索 如果需要将这个功能封装成一个服务 使用布隆过滤器 判断是否一定不存在,一定不存在的pass 存在的再进行检索 将ipv4的数据分段,每一段是一个文件树的一层,组成一颗矮胖的二叉树 使用bitmap将所有数据读取到内存中后使用内存做索引,直接用bitmap检索ip段是否出现

架构设计

令牌桶的使用和场景

令牌桶的使用和场景 场景:需要在业务代码中拉取指定第三方平台的报表数据,但是第三方平台有qps限制,平台有实时报表数据需要定期同步到我们的服务器做数据报表和数据分析处理,除了拉取的场景,还有数据操作的场景,我方服务器可能需要频繁操作第三方服务器的某些对象和数据,两部分操作是共享第三方平台的qps限制的。 问:如何设计拉取系统和操作系统的拉取方式,保证所有请求在授权拉取第三方平台时不会超过qps限制,并且能最大程度的拉取最大体量的数据保证数据更新效率和操作时效性 方案1: 没有任何设计和优化的场景 项目最开始是在后端接口api中,直接调用第三方平台进行数据操作和修改,没有任何限制 在这个基础上新增了一个数据同步机制,新启动一个进程同步数据,写入数据库 这个方案没有任何设计,也是最原始的实现方案,比较简单没有任何限制和约束,如果在高峰期做集中数据操作,可能会出现问题,如果超过服务器支持的qps则本地数据同步或者对象操作会出现异常 方案2: queue 在方案1的基础上,将所有与第三方平台交互的操作提前设计publish到队列中,所有与第三方交互的逻辑全部在队列中处理, qps为10则创建10个queue,每个queue中以queue+id为加锁的key名称, 每一个queue中只要操作第三方服务器,都需要获取queue锁,抢到锁才能操作或者拉取数据 这个方案限制了并发数量为要求的并发数量,但是有致命缺点,每一秒的请求有可能请求多次,导致超出qps的请求会操作失败,queue 的方案没有完善的解决并发,并且qps的请求限制 方案3: 令牌桶 在方案1的基础上,将所有与第三方平台的交互操作都加上获取令牌的约束,获取到令牌才可以进行数据交互, 令牌桶做成一个独立的服务,每次请求令牌桶获取令牌时,令牌桶都以秒为单位发放令牌,这1秒只生成8个令牌,获取完了就没有了只能阻塞等待获取令牌桶。 这个方案在该场景下比较合理并且完善,在单位qps的条件下只能允许数量的请求发送,较为完善的实现了场景要求的效果

Uncategorized

开发流程中Mysql设计表和优化表的过程

开发流程中Mysql设计表和优化表的过程 在实际开发过程中,先有开发需求,要解决实际问题和诉求在进行需求分析规划和排期, 我的实际开发流程 产品的需求文档,讲解需求,功能描述等 整理要实现的需求和功能点,和产品,需求方做功能确认 整理需求写开发文档 整理表关系,画er图,完善开发文档 写开发文档,实际完善和填充表字段和表结构 整理需求中涉及到的模块和开发顺序流程 如果涉及到老的业务流程和表结构的需要和之前的代码所有人同事进行确认沟通 开发过程中表结构可能还有缺陷,需要进行完善和补充, 有些场景下明确知道会有大量频繁查询的固定组合sql 可以提前建立索引 需要注意在设计表结构的时候需要和需求方确定一定的数据体量的预期,预期是20w 数据量,实际2000w数据量,这种数据量差异设计的表结构一定是不匹配,并且有问题的 开发上线后,需要根据慢查询sql 和实际接口响应,包括数据的增量状态来调整和完善表结构, 实际项目中,某些变化比较大,增量较大的项目可能会有较大的差异,需要注意实时分析和调整 今天面试某有声app科技公司有问到该问题,当时回答的不是很完善,回来整理了一下,希望对你有所帮助!

Uncategorized

Mysql中int(10)和int(11)有什么区别

Mysql中int(10)和int(11)有什么区别 mysql数据类型中int 数据类型也可以指定长度,但是mysql的int长度和varchar的长度的意义有些不同 不管是int(10)或者int(11)在存储大小和数据内容上是一致的,都是存储的4字节存储范围是-2147483648 – 2147483647 int类型的长度指示作用是显示宽度 当mysql 语句中使用zerofill 时 会在mysqlint字段中补充前导零,如果11位会填充满11位的前导零,10位则填充至10个前导零, 如果不使用zerofill则这个数字的填充位数不生效

Uncategorized

技术面试遇到的有趣的问题

技术面试遇到的有趣的问题 你有什么优势和别人比 审题总结就是你和别人比有什么不一样,’What’s the difference?’ 开放式问题没有标准答案大概可以分几个维度方向去回答这个问题 你的不可替代性 重点描述你的特长和不可替代性,或者在众多求职人中比较稀缺的能力,都可以说 岗位匹配度 重点描述你与岗位的匹配度 你的技术专业垂直度 技术深度,技术面,架构能力,对新知识点的获取积累,总结能力 技术基础 技术内容和基本功 基本面 基本情况,技术积累,技术能力,开发能力 文档和与人协调的能力 文档能力和与人配合的能力在中大型企业是非常需要,非常重要的,一定不要忽视 遇到问题的应急处理能力 遇到问题如何处理,有哪些自己单独负责项目并且解决问题的案例也可以说 表达和技术总结输出能力 技术人看问题的角度和表达方式都是在技术层面,但是实际工作和需求中,可能需要与大量不懂技术的其他职位的同时打交道,并且让他明白你的技术难点和技术方案是一项非常有优势的能力 融洽的与人配合 有些技术人员专业能力非常棒,但是不太能融洽的和同事相处,在中大幸公司与人配合协调的能力非常重要,10句话8句都是怼人的技术不是好技术 是否能站在技术之外看待问题? 在做开发时间长了之后,会有技术的路径依赖,处理一些问题更多的会依赖自己的技术能力,但是实际开发中可以尝试技术以外的方式看待或者处理问题,实际效果可能会更好 软件工程能力 对于程序员来说,产出的是代码,程序,实际项目是通过代码支撑运行,产生价值和收益,但是实际的开发完善和需求过程中,你写代码过程中的需求文档,开发文档,er图,表结构说明,表注释,完善良好的测试用例,关键逻辑的说明文档,api结构文档,业务逻辑说明文档,在软件工程中是对代码的强有力支撑,并且如果有完善的软件工程支撑的代码,会更加健壮完善,更好维护和迭代 总结: 实际面试中有些hr不懂技术,并且在成千上万的简历中,如何留下印象 是你要考虑的问题和方向 以上是一些经验和思考,临时想起来记录一下,希望对你有所帮助!

Golang

go协程工具WaitGroup

go协程工具WaitGroup waitGroup 是go语言非常常用的一个协程的流程工具,可以在指定位置阻塞等待指定数量的协程执行完成,从字面意思理解即是阻塞等待指定组的协程执行完成,在需要控制或者等待一批协程执行完成时可以使用waitGroup 实现该效果,其实该包的原理也是使用了channel实现的协程同步机制,通过在指定位置添加waitGroup.Wait() 方法来阻塞等待指定数量的协程执行完成,在协程执行完成后调用waitGroup.Done() 方法来通知waitGroup 协程执行完成,waitGroup 内部维护了一个计数器,当计数器为0时,waitGroup.Wait() 方法才会返回,否则会阻塞等待。 type WaitGroup struct { } func (wg WaitGroup) Add(delta int) func (wg WaitGroup) Done() func (wg WaitGroup) Wait() Add(delta int) 每次激活想要被等待完成的协程之前,先调用Add(),用来设置或添加要等待完成的goroutine数量 Done() 表示该协程执行完成,执行Done()会将waitGroup 内部的计数器减1 Wait() 表示等待所有的协程执行完成,当waitGroup 内部的计数器为0时,Wait() 方法才会返回,否则会阻塞等待 一般在所有的协程执行完成后调用Wait() 方法,等待所有的协程执行完成 func (wg WaitGroup) Add(delta int) { // 先从 state 当中把数据和信号量取出来 statep, semap := wg.state() // 在

Golang

Go语言syncMap实现的功能和使用场景

Go语言syncMap实现的功能和使用场景 在go语言提供的标准map类型中,如果涉及到协程读取map的场景,会存在并发读写的问题,并发操作map的会导致数据不一致, 为什么map不是并发安全的? 因为map的读写操作不是原子操作,当多个协程同时读写map时,会发生脏读和脏写导致数据不一致的问题。 在go 语言1.9版本后引入了syncMap,可以提供更加便捷的并发map操作方法, 例如: var m sync.Map 可以使用syncMap的方法来进行并发安全的map操作,例如: m.Store(key, value) m.Load(key) m.Delete(key) 这些方法都是并发安全的,不会导致数据不一致的问题。 但是该数据类型仅适合一定程度上的读多写少场景,syncMap内部使用了读写锁来实现并发安全,当写操作比较多时,会导致读操作的阻塞,影响性能。 源码:https://github.com/golang/go/blob/go1.23.0/src/sync/map.go func (m *Map) Swap(key, value any) (previous any, loaded bool) { read := m.loadReadOnly() if e, ok := read.m[key]; ok { if v, ok := e.trySwap(&value); ok { if v == nil { return nil, false }

Redis

redis-Sub/Pub消息订阅

redis-Sub/Pub消息订阅 Sub/Pub 消息订阅,是redis 中一个处理消息通知和数据一致的机制,它可以实现实时消息系统,比如普通的即时聊天,群聊等功能。 sub/pub 消息订阅案例demo package main import ( “fmt” “time” “github.com/go-redis/redis” ) func main() { client := redis.NewClient(&redis.Options{ Addr: “localhost:6379”, Password: “”, // no password set DB: 0, // use default DB }) pubsub := client.Subscribe(“chat”) go func() { for msg := range pubsub.Channel() { fmt.Println(msg) } }() time.Sleep(time.Second) } 使用场景 独立进程数据交互: redis是基于内存实现的,执行和计算流转效率速度非常快,如有两个独立进程需要进行数据交互和通知时,subpub是一个非常好的数据通知交互的方式,比传统的http请求和websocket请求实现的网络版数据交互方式时间效率要高很多

Uncategorized

Mysql的索引是如何实现数据的快速查找的

Mysql的索引是如何实现数据的快速查找的 inndb的存储引擎,索引实现的数据结构是B+树的一个数据结构,B+树是一个比较矮胖的数据结构,本身的特性比较适合在io磁盘的场景下做数据索引,可以减少大量不必要的io查询操作 B+树的数据结构本身就是一个平衡树,每个节点的子节点数量是固定的,每个节点的子节点数量是相等的 B+树的每个节点都有一个指向下一个节点的指针,这个指针可以用来遍历整个树 B+树的每个叶子节点都有一个指向下一个叶子节点的指针,这个指针可以用来遍历整个树

Uncategorized

Mysql-sql实例分析

Mysql-sql实例分析 Select A,B,C FROM t WHERE D=? AND E=?; 索引:D,E 组合索引 Mysql 执行这个sql 查询数据,会先根据索引D 查找符合条件的叶子节点,然后根据索引E 查找符合条件的叶子节点,最后返回符合条件的结果 问题:索引不变,新增一个字段F,F字段没有索引,sql也不变的场景下,查询效率会不会有变化? 我认为这个场景不会有变化,sql语句使用同样的索引命中同样的叶子结点,然后查询B+树的主树,根据id去检索数据,查询命中数据条目,最后将用户需要的数据字段检出返回给用户

Scroll to Top