细探Redis scan命令
前言 这周遇到的一个小需求是通过Go实现对Redis的hash field实时上限检查,而因为是线上的服务,所以这个上限检查不能对redis pod造成负担,跟组内导师交流学习后了解到可以通过redis的HScan命令来实现这个需求 需要了解的几个词 cursor(游标):数据库中常见的一个概念,通常提供一种从表中检索出的数据进行操作的灵活手段,能从包含数据记录的结果集中每次提取一条记录的机制 rehash:在redis的具体实现中,使用了一种叫做**渐进式哈希(rehashing)**的机制来提高dict的缩放效率 迭代完整性:保证完整遍历被遍历对象的性质 生产环境:不敢乱增加负载的环境(跑一下redis keys命令直接重大事故) Scan命令 Scan命令是什么 SCAN命令是基于游标(cursor)迭代的,SCAN命令并不单纯指代SCAN命令,还包含SSCAN、HSCAN、ZSCAN,每种命令操作对象是有区别的,但用法及功能基本相同 为什么要用Scan命令 当Redis中的数据量很大时,因为Redis是单线程服务,所以一些数据操作会导致Redis服务卡顿,甚至宕机 ...
Go 并发编程与定时器
前言 在最近的日常后台开发中经常遇到定时任务的需求,如定时通知、定时检查等重要的需求,绝对时间一定不会是完全准确的,它对于一个运行中的分布式系统其实没有太多指导意义,但是由于相对时间的计算不依赖于外部的系统,所以它的计算可以做的比较准确,这里简单总结一下定时任务在Go中的实现 需要了解的几个词 Channel:Channel 是Go中的一个核心类型,你可以把它看成一个管道,通过它并发核心单元就可以发送或者接收数据进行通讯 Goroutine:并发是Go语言最大的特点之一,在Go中可以非常方便地实现并发;Go从语言层面支持并发,Goroutine是Go中最基本的执行单元;事实上每一个Go程序至少有一个Goroutine:主Goroutine;当程序启动时,它就会自动创建 Go定时器的数据结构 timer 是 Golang 定时器的内部表示,每一个 timer 其实都存储在堆中,tb 就是用于存储当前定时器的桶,而 i 是当前定时器在堆中的索引,我们可以通过这两个变量找到当前定时器在堆中的位置: 12345678910type timer struct { tb ...
数据库缓存的常用设计模式
前言 在DEM的某需求中涉及缓存模式的设计,终于要用到我少得可怜的数据库知识了,顺便做个总结 想要提高系统的性能,缓存是最直接最简单的方法之一;缓存一方面可以减少数据库负载,另一方面还可以减少相应时间、节省成本 总的来说,缓存的常见设计模式可分成五种 几个需要了解的词 缓存:广义上的缓存,不仅仅指 Redis 这些常用作缓存的工具 命中缓存:指查询操作中直接在缓存中得到结果 数据更新:指同步缓存与数据库中的数据 Cache-Aside Cache-Aside 是使用最为广泛的一种模式。应用直接去缓存中找数据,命中缓存则直接返回,如果未命中缓存,则需要先去数据库中查询数据,并将查询到的数据存储到缓存中,示意图如下: 但因为在这种模式下,只有当未命中缓存时,才会从数据库查询最新的数据,所以这样的方式会导致缓存中的数据与数据库中的数据不一致。一般我们会给缓存中的数据设置过期时间(TTL),数据过期后就会去数据库取最新的数据 Cache-Aside模式对缓存失效具有一定的容忍性,即使缓存集群挂掉,我们仍然可以通过直接访问数据库的方式来进行操作;另外值得一提的一点是:缓存中的数据模型 ...
Docker踩坑日记-1
问题背景 这几天为了测试一个Django的webservice,想在云主机上用docker-compose部署一个本地版本进行测试,但docker-compose up的过程中,build镜像时无法拉取镜像;排查后发现使用自定义网桥(docker中的bridge网桥)network时都无法连接外网,而且容器内无法ping到网关,但宿主机内可以ping到容器的网关,docker network inspect查看自定义的网络,ip分配以及网关设置正常 使用docker默认的bridge网络创建容器,发现也无法访问外网,情况一模一样 解决过程 仔细排查后怀疑是docker network本身的问题,随后使用bridge-utils创建网桥: 暂停docker服务: 1service docker stop 添加网桥: 1brctl addbr br0 设置网段: 1ip addr add 192.168.12.0/24 dev br0 启用网桥br0: 1ip link set dev br0 up 修改docker默认网桥: 1vim /etc ...
ReBucket算法总结
前言 这次接触ReBucket算法是在实际需求中需要完成一个落地的相关功能模块,也算是少有的复现论文到落地项目的功能模块的机会了,这里做一下算法本身的总结,有关的实现后续会放在另一篇文章中 几个需要了解的词 PDM:位置相关模型(Position Dependent Model) 并查集:一种树型的数据结构,用于处理一些不交集(Disjoint Sets)的合并及查询问题 层次聚类方法:一种自底向上的聚类方法(类似并查集,从每个元素都属于自己的集群开始) WER:Windows Error Reporting,微软部署的一套用于及时告警的分布式系统 Grid Search:一项模型超参数(需要人工选择的参数)优化技术,常用于优化三个或者更少数量的超参数,本质是一种穷举法 背景 尽管在日常的开发工作中,开发团队已经在发布产品前花费大量资源和精力进行软件测试,但实际上,已发布的软件仍然有一些错误,而这些错误往往表现为release版本运行时崩溃 针对这个现象,微软部署了一套分布式系统WER(Windows Error Reporting)用于自动从崩溃现场收集崩溃信息、聚类到各个 ...
第一次实习考核总结
第一次实习考核总结 在腾讯的第一次实习考核,总结一下过程与收获 过程 我的实习考核ppt主要有以下内容: 工作项目 难点&解决方案 后续规划 收获 需要提高ppt能力,有一些内容可以更精炼 量化指标很重要,量化指标很重要,量化指标很重要 在接入一个项目,或者一个项目做到尾期的时候,一定要有一个的思考是:如果从头开始这个项目的话,你会怎么设计逻辑 在遇到一些问题,被一些问题卡住的时候,要反思这个问题是否值得花这么多时间;解决问题后也要留下一些经验 总之,意识到了自己的很多不足吧,还是需要更加努力 不能摸鱼力
浅尝antlr4
浅尝Antlr4 前言 Antlr是什么 In a word, 多源语言多目标语言的一个语法分析框架 以下是官方文档的解释: ANTLR(ANother Tool for Language Recognition)是一个功能强大的解析器生成器,用于读取,处理,执行或翻译结构化文本或二进制文件。它被广泛用于构建语言,工具和框架。ANTLR从语法上生成一个解析器,该解析器可以构建解析树,还可以生成一个侦听器接口(或访问者),从而可以轻松地对所关注短语的识别做出响应。 ANTLR (ANother Tool for Language Recognition) is a powerful parser generator for reading, processing, executing, or translating structured text or binary files. It’s widely used to build languages, tools, and frameworks. From a grammar, ANTLR generates a parser ...
DEM项目日志
前言 在Whosbug项目即将上线,已经开始mr合流、code review的时候,突然被领导拉去做DEM了(还是挺突然的) DEM 是基于Go开发的一套完善的告警系统,而我当时对于Go语言的使用仅限于简单使用iris框架和日常刷算法题,所以分配到这个需求还是很虚的 DEM一期开发工作 和Whosbug不同,这次DEM的项目开发工作,我是半途加入的,而且是远程工作,所以免不了项目接入成本和环境成本,也是这次经历让我明白了为什么那么多公司不愿意提供远程实习的岗位 过程 接入项目 接到需求的第一天与学长进行了对接会议,当天和之后的一天按学长的介绍读了下我负责的alert模块的代码,熟悉一点了之后,开始尝试着手写负责的功能模块 完成功能模块 这部分工作在熟悉了数据流和数据结构后比我想象的要简单,一些细节问题上问了下学长之后,一个下午就写完了,与学长确认后认为应该妹有问题,但还是需要测试的 测试环境准备 配置好vscode的远程调试(卡了三天) 配置好依赖和一系列环境变量(卡了三天) 至此终于能正常调试了 大概这就是remote吧,踩了少说十个坑… 功能模块的单元测试 搭好环境过 ...
K8s-RoadMap
K8s 是什么 ? 容器编排工具,简单来讲,就是把一系列服务联合或非联合部署起来 Kubernetes 是什么? K8s 有何优势 ? 多种应用混合部署以降低成本 管理大规模复杂应用 更好的应用可观测性 (容器维度,而非机器维度) 以 K8s 为核心的丰富的工具链 几个必须了解的词 kubectl: kubectl 是管理 k8s 集群的命令行客户端 Helm3: K8s 应用打包/发布工具 Docker: 容器引擎 Docker Docker 是新时代虚拟化,云原生的基础, 尽管有多种容器化的方案,但是 Docker 目前是事实标准 Docker 的官方文档emmmm,还是看别的博客文章吧: 什么是 Docker 使用 Dockerfile 定制镜像 Docker 常用指令详解 K8s Node/Pod/Container Container 自然不用说,是docker中的基本概念(实例化的Image) Node 相当于物理节点,一个 Node 中可能有多个 Pod ,每个 Node 会对应一个子网段,如10.10.10.1/24,而其中的每个 Pod ...
Whosbug项目日志1
Whosbug项目日志1 前言 从八月份的企业实训到现在,关于whosbug断断续续也开发了一个多月了(实际开发时间), 在正式上线前小小总结一下吧 开发初期 过程 刚从腾讯那里拿到这个需求(或者说idea吧)的时候,还觉得挺简单的,基于Git不就可以很快找到是谁的问题了嘛但仔细想了想,这个需求是需要从项目报错的日志出发,最终找到责任人,这就涉及源码结构了(或者说语法分析、源码分析),还是…比较复杂的 作为开发小组组长,当时决定先花半周到一周的时间确定下来项目架构以及数据库设计等(作为软件工程专业学生,还是要明白需求分析以及系统设计的重要性的) 几天过后确定了初步的架构: 并完成了数据库的设计(这里就不po出来了) 分工后就开始正式的开发流程了,使用的协作平台是coding,每天联调任务的感觉还是挺新奇的(毕竟之前基本上都是单人开发或者双人开发,而且基本都不用任务协同) 难点 项目初期的架构设计还是有一定难度的,尤其是对基于git以及源码的分析结果的数据结构设计等 个人对docker、CICD以及Django不是很熟悉(docker只有一点点了解,Django之前没有用 ...