Leetcode 14 最长公共前缀

编写一个函数来查找字符串数组中的最长公共前缀。 如果不存在公共前缀,返回空字符串 “"。 示例 1: 输入: ["flower","flow","flight"] 输出: "fl" 示例 2: 输入: ["dog","racecar","car"] 输出: "" 解释: 输入不存在公共前缀。 说明: 所有输入只包含小写字母 a-z 。 思路: 现在只想到暴力方法,对几个字符串遍历判断,如果相等,则记录下,如果不相等,则停止。特殊情况,只输入一个字符串的时候,此时,返回本身 golang实现版本 纵向扫描法 func longestCommonPrefix(strs []string) string { if len(strs) == 0 { return "" } if len(strs) == 1 { return strs[0] } var commPrefix string for _,v := range strs[0] { hasPrefix := true tempPrefix := commPrefix + string(v) for i := 1; i < len(strs); i ++ { if !...

October 26, 2022 · nobject

Nowcoder Ab1

描述 请你实现一个栈。 操作: push x:将 加x 入栈,保证 x 为 int 型整数。 pop:输出栈顶,并让栈顶出栈 top:输出栈顶,栈顶不出栈 输入描述: 第一行为一个正整数 n ,代表操作次数。(1 <= n <= 100000) 接下来的 n,每行为一个字符串,代表一个操作。保证操作是题目描述中三种中的一种。 输出描述: 如果操作为push,则不输出任何东西。 如果为另外两种,若栈为空,则输出 "error“ 否则按对应操作输出。

October 25, 2022 · nobject

Redis 面试概览

redis基本数据结构 1. 字符串:redis没有直接使用C语言传统的字符串表示,而是自己实现的叫做简单动态字符串SDS的抽象类型。C语言的字符串不记录自身的长度信息,而SDS则保存了长度信息,这样将获取字符串长度的时间由O(N)降低到了O(1),同时可以避免缓冲区溢出和减少修改字符串长度时所需的内存重分配次数。 2. 链表linkedlist:redis链表是一个双向无环链表结构,很多发布订阅、慢查询、监视器功能都是使用到了链表来实现,每个链表的节点由一个listNode结构来表示,每个节点都有指向前置节点和后置节点的指针,同时表头节点的前置和后置节点都指向NULL。 3. 字典hashtable:用于保存键值对的抽象数据结构。redis使用hash表作为底层实现,每个字典带有两个hash表,供平时使用和rehash时使用,hash表使用链地址法来解决键冲突,被分配到同一个索引位置的多个键值对会形成一个单向链表,在对hash表进行扩容或者缩容的时候,为了服务的可用性,rehash的过程不是一次性完成的,而是渐进式的。 4. 跳跃表skiplist:跳跃表是有序集合的底层实现之一,redis中在实现有序集合键和集群节点的内部结构中都是用到了跳跃表。redis跳跃表由zskiplist和zskiplistNode组成,zskiplist用于保存跳跃表信息(表头、表尾节点、长度等),zskiplistNode用于表示表跳跃节点,每个跳跃表的层高都是1-32的随机数,在同一个跳跃表中,多个节点可以包含相同的分值,但是每个节点的成员对象必须是唯一的,节点按照分值大小排序,如果分值相同,则按照成员对象的大小排序。 5. 整数集合intset:用于保存整数值的集合抽象数据结构,不会出现重复元素,底层实现为数组。 6. 压缩列表ziplist:压缩列表是为节约内存而开发的顺序性数据结构,他可以包含多个节点,每个节点可以保存一个字节数组或者整数值。(新版本已被替换) 7. listpack: redis5之后替换ziplist sds 简单动态字符串 结构: //最长 2^8-1 长度的 sdshdr struct __attribute__ ((__packed__)) sdshdr8 { //len 表示已使用长度 uint8_t len; /* used */ //buf分配的总长度, 也就是数组的总大小, 剩余大小 = alloc - len uint8_t alloc; /* excluding the header and null terminator */ //低3位保存类型标志 unsigned char flags; /* 3 lsb of type, 5 unused bits */ //字符数组 char buf[]; }; - 参考: https://zhuanlan....

October 21, 2022 · nobject

mysql 要点整理

一条sql语句是怎么执行的 1.客户端 --> 2.连接器(管理连接,权限校验)--> 3.分析器(词法分析,语法分析)-->4.优化器(执行计划生成,索引选择)-->5.执行器(操作引擎,返回结果)-->6.存储引擎(存储数据,提供读写接口) 2~5 是server层,大部分核心功能在此 6是存储引擎层,负责数据的存储和提取 不同的存储引擎共用一个server 连接器:mysql -h host -P port -u user -p 此步会进行权限的校验,成功则会从数据库中读取该用户支持的权限,不成功则直接会提示access denied for user 分析器:词法分析,识别各种关键字,根据词法分析的结果,进行语法分析,如出错,一般会收到“you have an error in your SQL syntax” 优化器:决定使用哪个索引,关联查询的时候表连接顺序等 执行器:执行语句,再次判断权限,但是对表的操作权限,有权限,则根据表的引擎调用对应的数据引擎的接口 select notExistField from t; 查询一个字段不存在的语句,是发生在分析器这个步骤中。 binlog与redolog的写入流程 redo log(重做日志) redo log是innodb特有的日志。当一条记录更新时,先写将其写到redo log,并更新内存。innodb引擎会在适当的时候,将这个操作记录更新到磁盘中,往往是在系统比较空闲的时候 redo log的大小是固定的,可以配置为一组合4个文件,每个文件大小1G,总共可记录4G,当写满时,会循环到开头重新写 有了redo log innodb可以保证在数据库异常重启时,之前提交的记录也不会丢失,这个能力称为crash-safe bin log(归档日志) bin log属于mysql server层自带的日志,与存储引擎无关。binlog日志只能用于归档,并不带有crash-safe能力 两者区别 1. redo log 是 InnoDB 引擎特有的;binlog 是 MySQL 的 Server 层实现的,所有引擎都可以使用。 2. redo log 是物理日志,记录的是“在某个数据页上做了什么修改”; binlog 是逻辑日志,记录的是这个语句的原始逻辑,比如“给 ID=2 这一行的 c 字段加 1 ”。 3....

October 21, 2022 · nobject

Docker 原理

虚拟机与docker的区别 可以从以下几个维度具体阐述Docker和虚拟机的区别: 架构 Docker和虚拟机的架构不同,虚拟机是一种完整的虚拟化技术,它需要在物理主机上运行一个虚拟机监视器(hypervisor)来实现虚拟化,每个虚拟机都有自己的操作系统和内核。而Docker是一种轻量级的虚拟化技术,它利用Linux操作系统的容器(container)功能来实现虚拟化,每个Docker容器共享宿主机的操作系统和内核。 资源消耗 由于虚拟机需要模拟整个硬件环境,因此它需要更多的资源,包括内存、CPU和磁盘空间等。而Docker容器只需要使用宿主机的操作系统和内核,因此它的资源消耗更少。 启动速度 由于虚拟机需要启动整个操作系统和内核,因此它的启动速度较慢。而Docker容器只需要启动应用程序和相关依赖,因此它的启动速度较快。 部署方式 虚拟机通常使用镜像(image)来部署应用程序,镜像包括整个操作系统和应用程序等。而Docker使用容器镜像(container image)来部署应用程序,容器镜像只包括应用程序和相关依赖等,因此它更加轻量级,可以更快地部署应用程序。 隔离性 虚拟机之间的隔离性更高,每个虚拟机都有自己的操作系统和内核,可以避免依赖冲突等问题。而Docker容器之间也有隔离性,但是它们共享宿主机的操作系统和内核,因此在某些情况下可能存在一些隔离性问题。 安全性 虚拟机提供了更高的安全性,每个虚拟机都有自己的操作系统和内核,可以避免恶意软件和攻击等问题。而Docker容器也提供了一定的安全性,但是由于共享宿主机的操作系统和内核,因此在某些情况下可能存在一些安全问题。 综上所述,Docker和虚拟机都有各自的优点和缺点,应根据实际情况选择合适的虚拟化技术。如果需要运行不同操作系统的应用程序或者需要更高的隔离性,可以选择虚拟机;如果需要运行相同操作系统的应用程序或者需要更轻量级的虚拟化环境,可以选择Docker。 docker的实现原理 Docker的实现原理涉及以下几个关键技术: Linux Namespaces:Docker使用Linux命名空间技术来实现容器内部的虚拟隔离环境,例如PID命名空间、UTS命名空间、IPC命名空间、网络命名空间和挂载命名空间等。这些命名空间使用Linux内核提供的特殊机制来实现,使得Docker能够在一个宿主机上创建多个容器,每个容器之间完全隔离。 Cgroups:Docker使用Linux控制组(Cgroups)技术来限制容器使用的资源,例如CPU、内存、硬盘I/O、网络带宽等。Cgroups技术可以将进程分为多个层次结构,并为每个层次结构分配特定的资源限制和优先级,以确保容器使用的资源不会超出宿主机的资源限制。 Union FS:Docker使用联合文件系统(Union FS)技术来实现容器的分层存储。使用Union FS ,Docker将基础镜像的文件系统与容器所需的文件系统叠加在一起,使得容器能够共享基础镜像,减少存储空间和网络带宽。 容器镜像:Docker容器镜像是Docker的核心概念,容器镜像文件包含了应用程序及其所有依赖的库和环境等,Docker引擎可以使用这些镜像来创建容器。Docker容器镜像是基于Union FS实现的分层存储结构,容器镜像的所有层都是只读的,因此修改其中一个层不会影响其他层,这使得Docker容器镜像变得方便、灵活和可复用。 容器网络:Docker使用特殊的网络接口来实现容器的网络,Docker容器默认使用Bridge模式,Docker Daemon将为每个容器创建一个虚拟网桥,并将其连接到主机网桥上,这使得容器之间可以互相通信以及与外部网络进行通信。 总之,Docker实现原理是基于Linux系统的命名空间、Cgroups、Union FS等技术,通过这些技术实现了容器虚拟隔离、资源限制、分层存储和容器网络等功能,从而使得Docker成为一种轻量级的容器化技术,提供了生产环境中管理应用程序的一种新方法。 Namespace pid namespace 不同用户的进程就是通过pid namespace隔离的,且不同的namespace中可以有相同的pid net namespace 网络隔离是通过net namespace实现的,每个net namespace有独立的network devices, ip addresses, ip routing tables, /proc/net目录 docker默认采用veth的方式将container中的虚拟网卡同host上的一个docker bridge:docker0连接在一起 ipc namespace container中进程交互还是采用linux常见的进程间交互方式 mnt namespace mnt namespace允许不同的namespace的进程看到的文件结构不同,这样每个namespace中的进程所看到的文件目录就被隔离开了 uts namespace uts(unix time-sharing system)namespace允许每个container拥有独立的hostname和domain name, 使其在网络上可以被视作一个独立的节点而非host的一个进程 user namespace 每个container可以有不同的user和group id,也就是说可以在container内部用container内部的用户执行程序而非host上的用户 CGroup docker网络错误怎么排查 Docker中出现网络问题的原因有很多,例如网络配置错误、DNS问题、防火墙设置等。下面是一些排查网络问题的方法:...

October 19, 2022 · nobject

sentinel go

https://sentinelguard.io/zh-cn/docs/golang/basic-api-usage.html func MakeGrpcServerInterceptor() func(context.Context, interface{}, *grpc.UnaryServerInfo, grpc.UnaryHandler) (interface{}, error) { sentinel.Logger.Info("sentinel breaker server is open") ruleLoadMap := sync.Map{} return func(ctx context.Context, req interface{}, info *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (resp interface{}, err error) { _scope := "server.grpc." + info.FullMethod _, exists := ruleLoadMap.Load(_scope) //如果该规则不存在,则说明是第一次请求,则需要加载规则,加载规则在并发时可以多次,反正是覆盖,不影响。 if !exists { rules := getRuleByScope(strings.Split(_scope, ".")) circuitbreaker.LoadRulesOfResource(_scope, rules) ruleLoadMap.Store(_scope, "1") } token, e := api.Entry(_scope, api.WithTrafficType(base.Inbound)) if e != nil { sentinel.Logger.ContextErrorWithFields(ctx, logrus.Fields{ "err": "grpc接口熔断", "rule": e.TriggeredRule(), "_scope": _scope, }) return nil, error2....

October 18, 2022 · nobject

Docker 常用命令

在当前目录创建镜像 docker build -t newImage . 运行nginx映射本地端口4000映射容器内80端口 docker run -p 8080:80 nginx 容器相关 查看运行中的容器 docker container ls 查看所有的容器 docker container ls - a 优雅的关闭一个容器 docker container stop <hash> 强制关闭一个容器 docker container kill <hash> 从设备中移除指定的容器 docker container rm <hash> 从设备中移除所有的容器 docker container rm $(docker container ls -a -q) 镜像相关 查看所有的镜像 docker image ls -a 移除指定的对象 docker image rm <image id> 移除所有的镜像 docker image rm $(docker image ls -a -q) docker build -t friendlyhello ....

October 16, 2022 · nobject

linux 常用命令

linux常用命令 ls cp rm mkdir touch vim chmod chgrp chroot ss, tcp ping netstat top等 vim 常用命令 0 跳至行首,不管有无缩进,就是跳到第0个字符 (常用) $ 跳至行尾 (常用) gg 跳至文首 (常用) G 调至文尾 (常用) dd 删除光标所在行 (常用) n+[Enter] n 为数字。光标向下移动 n 行(常用) :1,$s/word1/word2/g 从第一行到最后一行寻找 word1 字符串,并将该字符串取代为 word2 !(常用) dw 删除一个字(word) 𝑦𝑦复制一行 /pattern 向后搜索字符串pattern n 下一个匹配(如果是/搜索,则是向下的下一个,?搜索则是向上的下一个) N 上一个匹配(同上) :w 将缓冲区写入文件,即保存修改 :wq 保存修改并退出 :x 保存修改并退出 :q 退出,如果对缓冲区进行过修改,则会提示 :q! 强制退出,放弃修改 :set nu 显示行号 :set nonu 与 set nu 相反,为取消行号! i 从目前光标所在处输入 [Esc] 退出编辑模式,回到一般模式中(常用) u 复原前一个动作。(常用) [Ctrl]+r 重做上一个动作。(常用) awk 基本用法: awk 动作 文件名 awk '{print $0}' demo....

October 16, 2022 · nobject

K8s 概览

组成 kubectl:客户端命令行工具,作为整个系统的操作入口。 kube-apiserver:以 REST API 服务形式提供接口,作为整个系统的控制入口。 kube-controller-manager:执行整个系统的后台任务,包括节点状态状况、Pod 个数、Pods 和Service 的关联等。 kube-scheduler:负责节点资源管理,接收来自 kube-apiserver 创建 Pods 任务,并分配到某个节点。 etcd:负责节点间的服务发现和配置共享。 kube-proxy:运行在每个计算节点上,负责 Pod 网络代理。定时从 etcd 获取到 service 信息来做相应的策略。 kubelet:运行在每个计算节点上,作为 agent,接收分配该节点的 Pods 任务及管理容器,周期性获取容器状态,反馈给 kube-apiserver。 DNS:一个可选的 DNS 服务,用于为每个 Service 对象创建 DNS 记录,这样所有的 Pod 就可以通过 DNS 访问服务了。 Kubernetes 的所有管理能力构建在对象抽象的基础上,核心对象包括: • Node:计算节点的抽象,用来描述计算节点的资源抽象、健康状态等。 • Namespace:资源隔离的基本单位,可以简单理解为文件系统中的目录结构。 • Pod:用来描述应用实例,包括镜像地址、资源需求等。 Kubernetes 中最核心 的对象,也是打通应用和基础架构的秘密武器。 • Service:服务如何将应用发布成服务,本质上是负载均衡和域名服务的声明。 Master Node: Api服务器(API SERVER):这是 Kubernetes 控制面板中唯一带有用户可访问 API 以及用户可交互的组件。API 服 务器会暴露一个 RESTful 的 Kubernetes API 并使用 JSON 格式的清单文件(manifest files)。 群的数据存储 Cluster Data Store :Kubernetes 使用“etcd”。这是一个强大的、稳定的、高可用的键值存储,被 Kubernetes 用于长久储存所有的 API 对象。 控制管理器 Controller Manager:被称为“kube-controller manager”,它运行着所有处理集群日常任务的控制器。包 括了节点控制器、副本控制器、端点(endpoint)控制器以及服务账户等。 调度器 Scheduler:调度器会监控新建的 pods(一组或一个容器)并将其分配给节点 Worker Node:...

October 16, 2022 · nobject

Golang 面试资料整理

golang基础 defer golang底层 GMP模型 Sync包实现 Interface底层实现 Map底层实现 数据库 mysql mongo redis 消息队列 rabbitMQ kafka rocketMQ 微服务 konga 服务发现 服务熔断 服务降级 docker与k8s docker docker实现原理 docker的常用命令 docker编排 k8s istio 计算机网络 算法 排序算法 查找算法 树

October 15, 2022 · nobject

Redis Multi Set With ttl

最近项目里需要将原来的一批数据,重新赋值。但同时也得设置好过期时间。为了减少网络的开销,第一想法就是使用MSET的命令。 然而使用该命令,会将key的过期时间直接设置成永久,显然,不能直接这么用。 为什么官方没有提供相关的API Unfortunately, we're not going to add more commands that can work on multiple keys because they are inherently difficult to distribute. Instead, explicitly calling EXPIRE for every key you want to expire is much easier to distribute (you can route every command to a different server if needed). If you want to EXPIRE keys atomically, you can wrap multiple calls in a MULTI/EXEC block. 根据官方人员的回复,类似批量设置过期时间的主要难点,是在于分布式集群的环境下,如果MSET对应不同的集群的slot,那么就不太容易处理。所以像mset的操作,在事先不清楚每个key所在的slot的情况下,是不推荐使用的。 同理,批量的设置key的过期时间亦是如此。...

June 14, 2022 · nobject

Golang Http Source Code

如果要更深入的理解golang的http处理,那么net/http包的源码就得研读一番。 我们使用原生的golang来处理http处理,一般我们的代码是这样写的。 package main import ( "fmt" "log" "net/http" ) func main() { // set route and handler 设置路由及处理请求 http.HandleFunc("/hello", helloHandle) http.HandleFunc("/test", testHandle) http.HandleFunc("/", indexHandle) fmt.Println("Listening at port 8080...") // listen at port 8080 监听8080端口 err := http.ListenAndServe(":8080", nil) if err != nil { log.Fatal("ListenAndServe: ", err) } } func indexHandle(w http.ResponseWriter, r *http.Request) { fmt.Fprintln(w, "index") } func helloHandle(w http.ResponseWriter, r *http.Request) { fmt.Fprintln(w, "hello world") } func testHandle(w http....

March 14, 2022 · nobject