- 博客(184)
- 资源 (7)
- 收藏
- 关注

原创 Golang sync/atomic包的原子操作是怎么保证的?
Golang sync/atomic包的原子操作是怎么保证的?在Go语言标准库中,sync/atomic包将底层硬件提供的原子级内存操作封装成了Go的函数。Mutex由操作系统实现,而atomic包中的原子操作则由底层硬件直接提供支持。在CPU实现的指令集里,有一些指令直接封装进atomic包,这些指令在执行过程中是不允许中断的,因此原子操作可以在lock-free的情况下保证并发安全,并且它的性能也能做到随CPU个数的增多而线性扩展。数据类型int32int64uint32uint64u
2021-02-20 16:35:14
1125
1

原创 你的AES加密结果相同吗?
AES加密后的结果,数据接收方解不出来,是哪里的问题?AES的安全性:在密码学的意义上,只要存在一个方法,比穷举法还要更有效率,就能被视为一种“破解”。故一个针对AES 128位密钥的攻击若“只”需要2120计算复杂度(少于穷举法 2128),128位密钥的AES就算被破解了。从应用的角度来看,这种程度的破解依然太不切实际。AES加密方式有五种:电码本模式(Electronic Codebook Book (ECB),将整个明文分成若干段相同的小段,然后对每一小段进行加密。密码分组链接
2021-01-05 19:39:21
6949
1

原创 Golang三行代码发送钉钉机器人消息
dingtalk钉钉机器人消息封装——Golang实现,简化日常通过钉钉群机器人发送提示、报警消息操作。目前自定义机器人支持文本(text)链接(link)markdownActionCard整体跳转独立跳转FeedCard机器人官方文档使用创建钉钉群机器人选择添加自定义机器人。安全设置共有关键词、加签、IP白名单三种设置,需要根据情况进行选择。选择自定义关键词,这里设置的关键词在初始化机器人的时候会用到。获取go get github.com/bli
2020-07-05 16:11:23
3800
6

原创 MySQL——Explain能看出点啥
mysql explain用法和结果的含义explain或desc显示了mysql如何使用索引来处理select语句以及连接表。可以帮助选择更好的索引和写出更优化的查询语句。explain 数据表 或 desc 数据表显示数据表各字段含义explain sql 或desc sql显示sql执行效率explain列解释table 输出的行所引用的表select_typ...
2020-04-20 22:42:57
796

原创 MySQL面试100问
面试官问:“了解MySQL吗?”这不就是一句废话?要是说不了解,那不直接凉了?。面试官:“了解的话,那说说XXX吧。”巴拉巴拉…开启学霸模式MySQL有哪些常见的引擎,说说他们的区别?有哪些索引和他们之间的区别?B+数有什么特点?MySQL建索引要注意什么?说说什么是最左匹配对组合索引的理解有没有遇到过慢查询,如何优化?Mysql有哪几种事物隔离级别及区别?Mysql默认...
2020-04-19 18:03:50
12589
12

原创 Redis——SortedSet排行榜同分
排行榜可以使用SortedSet,但是如果同分的时候会有两种相对难搞的情况:谁排名靠前,按需求展示。同分名次并列。同分不同名SortedSet score是支持浮点数的,只要给每个score加上对应的浮点数,就能实现按先后达到目标值的排序进行展示。如timestamp同分同名次这时一个SortedSet 就不能满足需求了,因为不知道前面有多少组同分的成员。两个SortedS...
2020-03-17 18:27:21
3359

原创 9宫格群头像生成——golang
先看效果头像间有间隔头像间无间隔代码网络图片下载到本地func multiGetImages(urls []string, dir string, prefix string)(localPath []string){ var w = sync.WaitGroup{} w.Add(len(urls)) timestamp := time.Now().UnixNano()...
2020-03-03 15:00:53
1716
1

原创 Redis——exists有可能超出你的预期
Redis的Exists有可能超出你的预期理论上每个key都应该有过期时间(当然也可以是一万年),通常情况下用exists来判断一个key是否存在都没什么问题(一般过期时间都比较长)。但如果过期时间需要精确到秒或十秒及,那么exists就会出乎你的意料。Redis过期键删除策略Redis key过期的方式有三种:被动删除:当读/写一个已经过期的key时,会触发惰性删除策略,直接删...
2019-07-20 18:14:14
8028
1

原创 mac mysql报错:The server quit without updating PID file (/usr/local/var/mysql/mac_name.local
场景:macA更换为macB,使用“迁移助理”迁移所有数据,redis、zk、kafka等都可用,唯独mysql报错。启动:mysql.server start报错:ERROR! The server quit without updating PID file (/usr/local/var/mysql/***.local.pid)解决:详细Stack Overflowbrew r...
2018-12-08 17:11:29
16846
6
转载 Linux网络状态工具命令ss
用来显示处于活动状态的套接字信息。ss命令可以用来获取socket统计信息,它可以显示和netstat类似的内容。但ss的优势在于它能够显示更多更详细的有关TCP和连接状态的信息,而且比netstat更快速更高效。
2022-10-09 11:57:42
563
原创 常见限流方式——静态限流
限流是什么常见限流算法(静态)1.固定窗口算法2.滑动窗口算法3.滑动日志算法4.漏桶算法5.令牌桶算法6.Redis分布式限流参考限流是什么通过对一个时间窗口内的请求量进行限制来保障系统的正常运行。如果我们的服务资源有限、处理能力有限,就需要对调用我们服务的上游请求进行限制,以防止自身服务由于资源耗尽而停止服务。阈值:在一个单位时间内允许的请求量。拒绝策略:超过阈值的请求的拒绝策略,常见的拒绝策略有直接拒绝、排队等。常见限流算法(静态)1.固定窗口算法固定窗口算法又叫计数器算法,是一种.
2022-04-02 17:46:30
938
原创 两个队列实现栈
用两个队列实现栈,并分析相关栈操作的运行时间。思路同:两个栈实现队列type DequeStack struct { pushDeque *Deque popDeque *Deque flag bool // true in push, false in pop}func (d *DequeStack) exchange(from, to *Deque) { to.Clean() for true { if v, ok := from.Pop(); ok { to.Push(v
2020-12-21 00:09:33
256
原创 两个栈实现队列
用两个栈实现队列,并分析相关队列操作的运行时间。单栈push和pop的运行时间都为O(1),所以需要考虑的就是两个栈之间切换所用时间。最坏情况:在push和pop交替操作时,需要将一个栈中的数据转移到另一个栈中,转移所用时间为O(n),n为当前栈中元素个数。最好情况:用flag记录上一次是push还是pop,如果和当前操作一致,则直接操作对应的栈,时间复杂度为O(1)。package mainconst maxSize = 10type StackDeque struct { push
2020-12-20 23:18:56
389
原创 单数组实现双端队列
栈插入和删除元素只能在同一端进行,队列的插入操作和删除操作分别在两端进行,与它们不同的,有一种双端队列(deque),其插入和删除操作都可以在两端进行。写出4个时间均为O(1)的过程,分别实现在双端队列插入和删除元素的操作,该队列使用一个数组实现的。package main// 一个数组实现双端队列const maxSize = 10type Deque struct { leftHead int rightHead int size int // 记录现有元素数量 arr
2020-12-20 22:25:46
551
原创 如何在一个数组中实现两个栈?
如何在一个数组A[1…n]中实现两个栈,使得当两个栈的元素个数之和不为n时,两者都不会发生上溢。要求push和pop操作的运行时间为O(1)。实现:两个栈分别从数组的两端开始,向中间push元素,直到两个指针相遇。package mainimport "fmt"const maxSize = 10const ( sLeft stackType = iota sRight)type stackType inttype Stack struct { arr [max
2020-12-19 23:07:34
926
1
原创 SQL优化
当limit offset rows中的offset很大时,会出现效率问题:操作:查询条件放到子查询中,子查询只查主键ID,然后使用子查询中确定的主键关联查询其他的属性字段;-- 优化前SQLSELECT 各种字段FROM `table_name`WHERE 各种条件LIMIT 0,10;-- 优化后SQLSELECT 各种字段FROM `table_name` main_taleRIGHT JOIN (SELECT 子查询只查主键FROM `table_name`W
2020-12-16 19:02:51
195
原创 IP转int,int转IP
func toInt(ip string) int64 { i := 3 sum := int64(0) for j, v := range strings.Split(ip, ".") { intV, _ := strconv.ParseInt(v, 10, 64) sum = sum + intV*int64(math.Pow(float64(256), float64(i-j)...
2020-05-07 14:46:11
681
原创 备份与恢复
备份与恢复概述按备份方法分:hot backup 热备、在线备份数据库运行中直接备份,对正在运行的数据库没有任何影响。cold backup 冷备、离线备份最为简单,一般只需要拷贝相关的数据库物理文件即可。优点:备份简单、恢复简单、恢复速度快、备份文件易于在不同操作系统和MySQL版本上恢复缺点:备份文件大、不总是可以轻易跨平台。如大小写敏感、浮点数格式等。warm b...
2020-05-05 10:58:24
403
原创 事务
数据库引入事务的主要目的事务会把数据库从一种状态转换为另一种一致的状态,在提交工作时,可以确保要么所有修改都已经保存,要么都不保存。ACID特性原子性 atomicity要么都成功,要么都失败。一致性 consistency事务执行前后,数据库的完整性约束没有破坏。(你的10张银行卡里共有100块,无论这10张银行卡之间怎么转账,也只有100块)隔离性 isolati...
2020-05-05 10:57:05
327
原创 索引与算法
B+树索引的管理创建索引对于索引的添加或删除,MySQL先创建一张临时表,把数据导入临时表,删除原表,然后把临时表重命名为原来的表。因此大表创建和删除索引的时间非常长。快速索引创建法:对于非聚集索引的创建,InnoDB会对表加S锁,创建过程中只能读,不能写。B+树索引的使用顺序读顺序的读取磁盘上的块随机读访问的块不连续,需要磁头不断移动预读取通过一次I/O请...
2020-05-05 10:53:06
313
原创 表
主键三连显示定义主键。如果没有显示指定,查找表中唯一索引,如果有,该列为主键。不符合上面两条,InnoDB自动创建一个6字节大小的指针。逻辑存储结构表空间->段->区->页表空间每张表的表空间存放的只是数据、索引、插入缓冲。其他类型的数据,如undo信息,系统事务信息,二次写缓冲等还是存放在共享表空间中。段每个段开始时,先用32个页大小的碎片页...
2020-05-04 13:42:01
279
原创 文件
参数文件mysql --help | grep my.cnf没有参数文件,取源代码中的默认值。日志文件错误日志# 查看文件位置show variables like 'log_error';二进制日志事务提交前进行记录。记录对数据库执行更改的所有操作,主要作用是恢复和复制。二进制日志文件在默认情况下没有启动,启动后会使性能下降1%。binlog_format(...
2020-05-04 13:38:23
222
原创 InnoDB存储引擎
InnoDB引擎的4大特性插入缓存(物理页的一个组成部分)show engine innodb status\G;INSERT BUFFER AND ADAPTIVE HASH INDEX # 插入缓冲信息对于非聚集索引的插入或更新操作,不是每次直接插入索引页。而是先判断插入的非聚集索引页是否在缓冲池中。如果在,则直接插入,如果不在,先放入插入缓冲区,然后再以一定的频率执行插入缓冲和...
2020-05-04 13:34:37
468
原创 存储引擎和体系结构
MySQL有哪些常见的引擎,说说他们的区别?show engines; #查看支持的引擎MyISAM:非事务处理存储引擎索引放在XX.MYI文件中,数据放在XX.MYD文件中。在线分析处理OLAP。全文索引。InnoDB:具备外键功能的存储引擎、行锁索引也是数据。数据和索引存在一个XX.IDB文件中。在线事务处理OLTP。Mermory:基于内存Memory表至少...
2020-05-04 10:54:14
247
原创 MySQL——碎片整理遇到的那些事
为什么要碎片整理MySQL中使用varchar、text、blob等可变长度的文本数据类型之后需要做额外的MySQL数据表碎片整理。当MySQL从表中删除一行内容,该段空间就会被留空。如果有大量的删除操作,会使留空空间变得比存储列表内容所使用的空间更大。MySQL进行数据扫描时,它扫描的对象实际是列表的容量需求上限,也就是数据被写入的区域中处于峰值位置的部分。如果进行新的插入操作,MySQ...
2020-04-20 22:49:27
559
原创 LeetCode——排序算法
快排利用数组拼接完成func quickSort(arr []int, start, end int) []int { if start < end { mid := arr[start] i := start j := end for i < j { for arr[j] >= mid && i < j { ...
2020-04-19 23:43:48
418
原创 LeetCode——最长不重复子串
func lengthOfLongestSubstring(s string) int { arr := strings.Split(s, "") tempArr := []string{} max := 0 curr := 0 for _, val := range arr { index, contain := contains(tempArr, val) if !cont...
2020-04-19 23:20:23
299
原创 LeetCode——二叉树遍历
type treeNode struct { data int left *treeNode right *treeNode}层序func treeLevel(node *treeNode) { arr := make([]*treeNode, 0) startIndex := 0 arr = append(arr, node) for len(arr)-startIn...
2020-04-19 23:17:14
238
原创 LeetCode——有序数组取交集
func interArr(arr1, arr2 []int) []int { resArr := make([]int, 0) if len(arr1) == 0 || len(arr2) == 0 { return resArr } arr1Index := 0 arr2Index := 0 for arr1Index < len(arr1) && ar...
2020-04-19 23:12:40
692
原创 LeetCode——旋转二分
什么是数组旋转[1,2,3,4,5,6,7,8,9]旋转[5,6,7,8,9,1,2,3,4]上面这个数组为例:其实就是把5之前的数,有序的移到数组右边。解题思路二分法每次二分之后都能得到一个有序的数组和一个旋转的数组(又得到了旋转数组,是不是似曾相识)。每次取中点的值和最左边的值判断,即可得到左边有序还是右边有序。与普通二分不同的是,每次都需要判断目标值是否在有序的数组中...
2020-04-19 23:06:50
450
1
原创 LeetCode——单向链表相关
// 链表翻转type Node struct { data int next *Node}type NodeList struct { head *Node}// 头部增加节点func (n *NodeList) add(val int) { node := Node{data: val} if n.head == nil { n.head = &node...
2020-04-19 23:05:22
256
原创 LeetCode——最长子序列和
找出给定数组中最长子序列的和// 先算出每func Max(x, y int)int{ if x<y{ return x } return y}func MaxSubSum(arr []int, n int) int { res := make([]int, n) res[0] = arr[0] maxs := arr[0] for i := 1; i < n...
2020-04-19 23:02:04
925
原创 LeetCode——接雨水
利用两个数组记录每个位置,左边和右边的最大值。func Min(x, y int) int { if x < y { return x } return y}func Max(x, y int) int { if x < y { return y } return x}func receiveRain(arr []int) int { n := le...
2020-04-19 22:57:16
289
原创 LeetCode——卖股票
func getProfit(arr []int, start, end int) int { min := arr[start] profit := 0 for i := start; i < end; i++ { profit = Max(arr[i]-min, profit) min = Min(min, arr[1]) } return profit}// 分...
2020-04-19 22:41:51
233
原创 Redis zset为什么用跳表
zset相关命令时间复杂度命令时间复杂度功能zaddO(log(N))添加zscoreO(1)获取scorezcardO(1)获取member个数zincrbyO(log(N))修改scorezrank、zrevrankO(log(N))获取排名zrange、zrevrangeO(log(N)+k)根据排名范围获取...
2020-04-19 22:38:15
2495
1
原创 golang——并发、重复抑制、非阻塞缓存
package mainimport ( "fmt" "io/ioutil" "net/http" "sync" "time")type entry struct { res result ready chan struct{} // 重复抑制}type result struct { value interface{} err error}type...
2020-03-11 10:47:50
755
原创 golang——defer
package mainimport "fmt"func a() int{ var i int defer func(){ i++ fmt.Println("defer2:",i) }() defer func(){ i++ fmt.Println("defer1:",i) }() return i // 返回i的副本}func b()(i int){ ...
2020-03-09 14:21:26
225
原创 golang实用库
图片处理调整大小,旋转,裁剪,拼接滤镜、模糊、锐化、亮度、对比度、饱和度、伽玛校正https://github.com/disintegration/imaging缩放,裁剪,更多滤镜https://github.com/disintegration/gift...
2020-03-03 14:26:43
525
app-v4.1.0.0-H5-release-v8_4.1_stage_wx.apk
2019-10-19
kafka-manager-1.3.3.15 2.zip
2019-06-12
java数据结构
2018-02-27
C# 选关版俄罗斯方块
2017-05-29
mysql-connector-java-5.1.17-bin.jar
2017-05-21
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人