自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 leetcode-括号生成-Golang

22. 括号生成数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。示例 1:输入:n = 3输出:[“((()))”,“(()())”,“(())()”,“()(())”,“()()()”]示例 2:输入:n = 1输出:[“()”]提示:1 <= n <= 8暴力var result []stringfunc dfs(cur string, n int) { if len(cur) == 2*n { if vali

2022-05-12 11:16:32 158

原创 Golang GMP并发模型(一)

cpu线程切换,涉及到系统调用和上下文切换,进程或线程数量越多,切换的成本就越大,也越浪费cpu利用率越低多进程带来了同步竞争(如锁、竞争资源冲突等),使开发设计越来越复杂高消耗的调度cpu高内存占用, 进程占用内存 虚拟内存4GB(32 bit os),线程占用内存约4MB调度器的设计策略复用线程work stealing机制当从本地线程绑定的P本地队列、全局队列都找不到可执行的G,会从别的P本地队列中偷取G并放入当前P本地队列上执行从全局队列取的G数量:N = min(len(

2022-05-12 00:23:44 120

原创 leetcode全排列-Golang

46. 全排列给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。示例 1:输入:nums = [1,2,3]输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]示例 2:输入:nums = [0,1]输出:[[0,1],[1,0]]示例 3:输入:nums = [1]输出:[[1]]var ans [][]intvar list []intfunc permute(nums [

2022-05-11 23:43:42 277

原创 Redis实现分布式锁

什么是分布式锁如果不同的系统或同一个系统的不同主机之间共享了某个资源时,往往需要互斥来防止彼此干扰来保证一致性。Redis实现分布式锁时的问题原子性使用lua脚本没有释放锁设置lock的过期时间释放别人的锁为保证只释放自己加的锁,位lockKey设置唯一id, 释放时先判断再释放大量失败的请求使用自旋,或阻塞一段时间后再次抢锁主从复制问题redisson框架为了解决这个问题,提供了一个专门的类:RedissonRedLock,使用了Redlock算法可重入

2022-05-11 21:36:10 247

原创 回溯法 leetcode题集

回溯法解决问题的过程实质上是在树形结构中从根节点开始进行深度优先遍历。如果在前往某个节点时对问题的解的状态进行了修改,那么在回溯到它的父节点时要记得清除相应的修改。如果明确知道某个子树没有必要遍历,那么在遍历的时候应该避开这些子树以优化效率。通常将使用回溯法时避开遍历不必要的子树的方法成为剪枝78. 子集给你一个整数数组 nums ,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)。解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。示例 1:输入:nums = [1,2,3

2022-05-10 17:46:37 181

原创 leetcode 前缀树

目录[208. 实现 Trie (前缀树)](https://leetcode.cn/problems/implement-trie-prefix-tree/)[677. 键值映射](https://leetcode.cn/problems/map-sum-pairs/)[211. 添加与搜索单词 - 数据结构设计](https://leetcode.cn/problems/design-add-and-search-words-data-structure/)[648. 单词替换](https://lee

2022-05-09 22:21:49 134

原创 Elasticsearch 7.x 索引&mapping&文档基础操作

目录索引的操作新增索引(job)获取索引元数据删除索引查询所有索引元数据查询索引的摘要信息启用/ 关闭索引mapping的作用和操作常见的数据类型操作新增映射获取映射如何修改?文档的操作创建文档重建文档获取文档删除文档索引的操作新增索引(job)put http://localhost:9200/job获取索引元数据get http://localhost:9200/job删除索引delete http://localhost:9200/job查询所有索引元数据get http://

2022-05-08 00:58:13 1352

原创 分布式ID

目录UUID雪花算法由来组成代码实现优缺点UUIDUUID是基于当前时间、计数器(counter)和硬件标识(通常为无线网卡的MAC地址)等数据计算生成的。GUID有时专指微软对UUID标准的实现,通常表示成32个16进制的数字组成的字符串,实质上还是一个128位长的二进制整数。在windows生态中,经常使用。UUID是由开放软件基金会标准化,作为分布式计算环境的一部分。4c37637b-cc8f-11ec-ba3f-5081409b7484存在的问题uuid长度过长,占用较大存储空间

2022-05-06 21:41:55 124

原创 限流算法&分布式限流

目录固定窗口算法滑动窗口算法漏桶算法令牌桶算法分布式限流固定窗口算法固定窗口算法又叫做计数器算法,主要通过一个支持原子操作的计数器来累计 1 秒内的请求次数,当 1 秒内计数达到限流阈值时触发拒绝策略。每过 1 秒,计数器重置为 0 开始重新计数。存在不足:滑动窗口算法滑动窗口算法是对固定窗口算法的改进, 和算法题里所涉及到的滑动窗口算法一样的漏桶算法漏桶算法,又称leaky bucket一个系统处理请求,就像一个固定容量的水桶去溜进来的水,同时也让水流出去,但是它无法预见有多少水流进来和

2022-05-05 22:00:29 566

原创 Redis 事务

目录事务Multi, Exec, discardwatch和unwatchwatchunwatch事务Redis事务的主要任务就是串联多个命令, 防止别的命令插队、按顺序地执行Redis事务是一个单独的隔离操作: 事务中的所有命令都会序列化事务执行的过程中, 不会被其他客户端发送来的命令请求所打断Multi, Exec, discard从输入multi命令开始, 输入的命令都会依次进入命令队列, 但不会执行, 直到输入exec后, Redis会将之前的命令队列中的命令依次执行组队的过程中可

2022-05-05 10:07:47 95

原创 Redis 主从复制

这里写目录标题概念配置建立复制断开复制安全性只读传输延迟原理复制过程数据同步心跳异步复制概念Redis主从复制,参与复制的Redis实例分为主节点和从节点。以一主多从的模式建立分布系统,是redis搭建高可用集群的基础,为容错、故障转移提供支持配置默认情况下,Redis都是主节点。每个从节点只能有一个主节点,而主节点可以同时具有多个从节点。建立复制配置从节点的方法在配置文件中加入 slaveof {masterHost} {masterPort}启动命令+参数, redis-server

2022-05-05 08:55:31 1027

原创 Redis持久化

RDBRDB持久化是把当前进程数据生成快照并保存到磁盘的过程触发机制手动触发save和bgsave命令自动触发配置文件中的save m n 表示m秒内存在n次修改,自动触发bgsave如果从节点全量复制, 主节点自动执行bgsave生成rdb文件,并发送给从节点在没有开启aof时,执行shutdown命令时,自动执行bgsavesave命令阻塞当前Redis服务器,直到RDB过程完成为止bgsave命令AOFAOF(append only file)持久化: 以独

2022-05-04 20:48:23 153

原创 Redis全局命令&键管理

全局命令查看所有键keys *keys命令的时间复杂度为O(n),因为keys命令会遍历所有键. 线上环境禁止使用127.0.0.1:6379[2]> KEYS *(empty list or set)127.0.0.1:6379[2]> select 0OK127.0.0.1:6379> KEYS *1) "k1"2) "name"3) "student:2019205242"键总数dbsizedbsize命令的时间复杂度为O(1),因为可以直接获取redi

2022-05-03 21:17:25 847

原创 Centos安装Redis

从官网下载最新稳定版wget https://download.redis.io/redis-stable.tar.gztar解压tar -xzvf redis-stable.tar.gz编译安装,首先更新一下gccyum install -y gcc-c++ autoconf automakecd redis-stablemakemake install修改配置文件vim redis.conf===================bind * -::* # all ava

2022-05-03 15:16:42 533

原创 RabbitMQ 延迟队列 Golang

使用场景订单在十分钟之内未支付则自动取消新建店铺,如果在十天内都没有上传商品,则自动发送消息提醒用户注册成功后,如果三天内没有登录则进行短信提醒插件RabbitMQ实现延迟队列需要使用插件# 查看插件rabbitmq-plugins list# 复制插件到容器docker cp 插件名 容器id:/plugins# 启用插件rabbitmq-plugins enable rabbitmq_delayed_message_exchange消息在ttl之后才会进入队列,进入队列

2022-04-28 00:02:52 1707

原创 go-zero rpc拦截器

rpc服务添加拦截器s := zrpc.MustNewServer(....)//...s.AddUnaryInterceptors(interceptor)拦截逻辑func interceptor(ctx context.Context, req interface{}, info *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (interface{}, error) { // 获取metadata 进行请求合法拦截, 不合法直接retu

2022-04-27 11:01:28 968

原创 RabbitMQ之死信队列

死信队列:死信队列用于处理无法被正常消费的消息。一条消息初次消费失败会被重试消费,若重试次数达到最大值(默认16次,在客户端可配置)时,依然消费失败,则其将被投递到该消费者对应的特殊队列(即死信队列)中,这种消息被称为死信消息。应用场景:为了保证订单业务的消息数据不丢失,需要使用到RabbitMQ的死信队列机制,当消息出现异常时,将消息投入死信队列中。用户商城下单成功点击去支付后在指定时间内未支付时自动失效死信的原因:消息TTL过期队列达到最大长度,即队列已满消息被拒,并且不放回实战

2022-04-25 23:32:24 1755

原创 快速排序&随机快速排序

快速排序快速排序主要体现了分治思想;选择一个元素为pivot, 使pivot左边的元素都小于pivot,右边的元素都大于等于pivot然后对左右两部分也进行上述操作package mainimport ( "fmt" "math/rand" "time")func main() { array := []int{2, 3, 8, 7, 1, 2, 2, 2, 7, 3, 9, 8, 2, 1, 4} QuickSort(array) fmt.Println(array)}

2022-04-25 16:34:18 348

原创 leetcode 53. 最大子数组和

####53. 最大子数组和暴力204 / 209 个通过测试用例func maxSubArray(nums []int) int { n := len(nums) ans := nums[0] for i := 0; i < n; i++ { sum := 0 for j := i; j < n; j++ { sum += nums[j] ans = max(ans, sum)

2022-04-23 23:28:08 1089

原创 leetcode 前缀和-题集

目录[560. 和为 K 的子数组](https://leetcode-cn.com/problems/subarray-sum-equals-k/)[303. 区域和检索 - 数组不可变](https://leetcode-cn.com/problems/range-sum-query-immutable/)[304. 二维区域和检索 - 矩阵不可变](https://leetcode-cn.com/problems/range-sum-query-2d-immutable/)[724. 寻找数组的中心下

2022-04-22 11:51:43 225

原创 青训营-刷题打卡-控制并发执行goroutine的数量

给定包含 N 个任务 task 的数组 tasks 和整数 K,和一个可并发调用的执行函数 execute,要求实现以下逻辑:execute并发调用次数不超过10以最快速度执行完所有task使用golang实际上就是控制并发执行goroutine的数量,这里给出两种解决方法,使用chan的方法更普遍package mainimport ( "context" "golang.org/x/sync/semaphore" "sync")type Task intfunc h.

2022-04-21 11:47:24 254

原创 操作系统之 死锁

什么是死锁在并发条件下, 两个或两个以上的进程在运行过程中因争夺资源而产生的一种僵局,若无外界作用,这组进程将无法推进死锁产生的条件产生死锁的四个必要条件互斥条件只有对必须互斥使用的资源的争抢才会导致死锁,哲学家的筷子,编程里的互斥锁不剥夺条件进程获得的互斥资源在未使用之前,不能由其他进程强行夺走,只能主动释放请求和保持条件进程已经保持了至少一个资源,但又提出了新的资源请求循环等待条件存在一个进程资源的循环等待链,链中的每一个进程已获得的资源同时被下一个进程所请求(循

2022-04-20 18:24:02 996

原创 RabbitMQ之Topics

Topics主题模式是在Routing模式基础上提供了对RouteKey模糊匹配的功能,可以简化程序的编写主题模式下,模糊匹配表达式规则为:*匹配单个关键字# 匹配搜友关键字主题模式使用的交换机类型为topic发送到topic exchange的消息不能有任意的路由键 - 它必须是一个单词列表,由点分隔。这些词可以是任何东西,但通常它们指定与消息相关的一些特征。路由键中可以有任意多的单词,最多为 255 个字节。消费者代码package mainimport ( "log" "

2022-04-19 20:41:22 391

原创 RabbitMQ之路由模式

routing发布订阅模式是无条件的将所有消息发送给所有绑定队列路由模式则是根据Routing Key有条件的将数据筛选后发送给消费者路由模式使用的交换机的类型为directdirect exchange背后的路由算法很简单——消息进入绑定键与消息的路由键完全匹配的队列。使用相同的绑定键绑定多个队列是完全合法的。生产者package mainimport ( "log" "os" "rabbit/utils" "strings" "github.com/streadway/

2022-04-19 19:33:49 1613

原创 RabbitMQ 之发布订阅模式

publish/subscribe发布订阅模式中,生产者不再直接与队列绑定,而是将数据发送至交换机Exchange交换机Exchange用于将数据按某种规则送入与之绑定的队列,进而供消费者使用。发布订阅模式中,交换机将无差别的将所有消息送入与之绑定的队列,所有消费者拿到的消息完全相同,交换机的类型为fanoutexchange的类型有directtopicheadersfanout生产者package mainimport ( "log" "os" "rabbit/uti

2022-04-19 18:39:06 1849

原创 RabbitMQ之work queue

work queue主要思想: 避免立即执行资源密集型任务,而不得不等待它完成。安排任务在之后执行,我们将任务封装为消息并放送到队列。而后台的工作进程从消息队列中读取消息并执行任务。当有多个工作线程时,这些线程将一起处理这些任务。这个概念在 Web 应用程序中特别有用,在这些应用程序中,无法在短暂的 HTTP 请求窗口中处理复杂的任务。work queue适合在集群环境中做异步处理,能最大程度发挥每一台服务器的性能生产者代码, 简单的往队列发送20条消息package mainimport

2022-04-19 17:45:59 533

原创 RabbitMQ 常用命令

# 前台启动服务rabbitmq-server# 后台启动服务rabbitmq-server -detached# 停止服务rabbitmqctl stop# 终止应用rabbitmqctl stop_app# 启动应用rabbitmqctl start_app用户管理# 当前用户和角色root@42c7b53e0ca1:/# rabbitmqctl list_usersListing users ...user tagsadmin [administrator]

2022-04-19 12:49:54 626

原创 RabbitMQ HelloWorld

1. hello world生成者代码package mainimport ( "github.com/streadway/amqp" "log")func failOnError(err error, msg string) { if err != nil { log.Fatalf("%s: %s", msg, err) }}func main() { conn, err := amqp.Dial("amqp://admin:admin@localhost:5672/")

2022-04-19 09:15:49 73

原创 字符的最短距离

821. 字符的最短距离解题思路两次遍历,过!func shortestToChar(s string, c byte) []int { nums := make([]int, len(s)) cnt := len(s) for i := 0; i < len(s); i++ { if s[i] == c { cnt = 0 } else { cnt ++ }

2022-04-19 00:30:00 64

原创 leetcode 螺旋矩阵

54. 螺旋矩阵用visited数组记录是否访问过,directions数组表示"移动方向",模拟过程就可以了func spiralOrder(matrix [][]int) (ans []int) { m, n := len(matrix), len(matrix[0]) row, column := 0, 0 directionIndex := 0 total := m * n directions := [][]int{{0, 1}, {1, 0}, {0, -1}, {-1, 0}}

2022-04-11 11:21:57 219

原创 剑指 Offer 13. 机器人的运动范围

剑指 Offer 13. 机器人的运动范围想简单了,套路深,如果路被截了?呜呜呜!!func movingCount(m int, n int, k int)(cnt int){ for i := 0; i < m; i ++ { sum := i % 10 + i / 10 for j := 0; j < n; j ++ { t := sum + j % 10 + j / 10 if t <=

2022-04-06 18:47:44 297

原创 vim常用操作

打开文件# 正常打开文件vim fileName# 打开文件光标定位最后一行vim + fileName# 打开文件,并将光标置于第10行vim +10 fileName# 打开指定搜索单词的位置, 进入命令模式后按n查看下一个匹配vim +/hello fileName三种模式命令行模式下:set nonu # 不显示行号:set nu # 显示行号:n # 定位第n行/word # 向光标之下寻找word?word # 向光标之上寻找word:n1,

2022-04-01 17:28:34 338

原创 二叉树前序、中序、后序遍历,递归&迭代

94. 二叉树的中序遍历// 迭代实现func inorderTraversal1(root *TreeNode) (res []int) { stk := make([]*TreeNode, 0) for len(stk) > 0 || root != nil { for root != nil { stk = append(stk, root) root = root.Left } root = stk[len(stk)-1] stk = stk[:len(st

2022-03-30 12:17:22 715

原创 linux at crontab计划任务

atatd负责at计划任务的服务,首先确保atd服务正常systemctl restart atd # 重新启动atd服务systemctl enable atd # 让atd服务开机自启systemctl status atd # 查看atd目前状态常用命令举例[lsz@localhost ~]$ at now + 5minutesat> mkdir helloat> <EOT> #ctrl+D

2022-03-28 19:02:35 699

原创 Golang new和make 的区别

make和new是go的内置函数,不是关键字如果变量是指针类型或者引用类型,系统不会为他分配内存,默认是nilmake 和 new 都是用来申请内存的, 有了内存,变量就可以使用了区别:make函数返回slice, map, chan 类型本身new函数返回一个指向内存地址的指针make只能用来分配和初始化slice, map, chan类型变量new 可以分配任意类型的变量,并置为零值...

2022-03-15 19:36:41 185

原创 Go进制转换

res := strconv.FormatInt(4, 2) fmt.Println(res) parseInt, _ := strconv.ParseInt("e", 16, 64) fmt.Println(parseInt)

2022-03-11 15:46:55 490

原创 leetcode单词拆分-Golang

139. 单词拆分用set记录wordDict中单词出现情况暴力不过,仔细分析发现其中确实存在重复的判断func wordBreak(s string, wordDict []string) bool { set := make(map[string]bool) for i := 0; i < len(wordDict); i++ { set[wordDict[i]] = true } return help(s, set, 0)}func help(s string, s

2022-03-09 20:13:39 178

原创 Redis入门(一)

查看所有键keys *keys命令的时间复杂度为O(n),因为keys命令会遍历所有键. 线上环境禁止使用127.0.0.1:6379[2]> KEYS *(empty list or set)127.0.0.1:6379[2]> select 0OK127.0.0.1:6379> KEYS *1) "k1"2) "name"3) "student:2019205242"键总数dbsizedbsize命令的时间复杂度为O(1),因为可以直接获取redis内置的键

2022-03-05 13:23:48 524

原创 leetcode环形链表

141. 环形链表解法一: 哈希表func hasCycle(head *ListNode) bool { set := map[*ListNode]bool{} cur := head for cur != nil { if has := set[cur]; has { return true } else { set[cur] = true } cur = cur.Next } retu

2022-02-21 12:12:41 405

原创 哈希表hash

构造哈希函数直接地址法、数字分析法、平方取中法、折叠法、除留余数法、随机数法冲突解决开发地址法再哈希法拉链法建立公共溢出区设计哈希集合705. 设计哈希集合type MyHashSet struct { data []list.List}func Constructor() MyHashSet { return MyHashSet{data: make([]list.List, 911)}}func hash(key int) int { return key % 9

2022-02-11 23:53:08 334

空空如也

空空如也

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

TA关注的人

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