自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

耕云者~

成长没有捷径可走,需要的是一个一个坚实的突破。

  • 博客(93)
  • 资源 (2)
  • 收藏
  • 关注

原创 gorm 遇坑总结

gorm debug 出来的语句可以正常执行,但是程序就是有问题??

2022-10-26 19:24:36 1217

原创 golang gorm 零值更新不生效问题处理

快速指南: 通过结构体变量更新字段值, gorm 库会忽略零值字段。就是字段值等于 0, nil, “”, false 这些值会被忽略掉,不会更新。如果想更新零值,可以使用 map 类型替代结构体。一、问题我们都知道,使用 golang 定义一个变量并且不赋初始值时,初始值就默认为 0 值,比如 0, nil, “”, false 等。在使用 gorm 包进行数据库操作时,如果想要进行字段的更新,只需要将要变动的字段进行修改,然后执行 db.Updates() 操作即可。假定有如下结构体定义:.

2022-05-11 20:01:45 5335 2

原创 golang for 循环 + 协程没用?

问题在写巡检脚本的时候,遇到了如下问题,特此记录。最开始写的代码如下:{ var wg sync.WaitGroup for _, a := range activeList { wg.Add(1) go func(ia *model.ImportantActivity) { defer wg.Done() if err := GetBusinessData(ia); err != nil { log.Error(err)

2022-01-28 15:22:14 1482

原创 Linux 网络包收发流程及缓冲区问题

网络包的接收流程当一个网络帧到达网卡后,网卡会通过 DMA 方式,把这个网络包放到收包队列中;然后通过硬中断,告诉中断处理程序已经收到了网络包。接着,网卡中断处理程序会为网络帧分配内核数据结构(sk_buff),并将其拷贝到 sk_buff 缓冲区中;然后再通过软中断,通知内核收到了新的网络帧。接下来,内核协议栈从缓冲区中取出网络帧,并通过网络协议栈,从下到上逐层处理这个网络帧:在链路层检查报文的合法性,找出上层协议的类型(比如 IPv4 还是 IPv6),再去掉帧头、帧尾,然后交给网络层。网

2021-07-11 11:49:56 1648 3

原创 numa总结

文章目录numa架构是啥numa的由来numa带来的问题redis 在NUMA架构上出现问题的过程解决方案为什么Interleave的策略就解决了问题?numa架构是啥NUMA(Non-Uniform Memory Access)服务器的基本特征是具有多个CPU模块,每个CPU模块由多个CPU(如4个)组成,并且具有独立的本地内存、I/O槽口等。由于其节点之间可以通过互联模块(如称为Crossbar Switch)进行连接和信息交互,因此每个CPU可以访问整个系统的内存(这是NUMA系统与MPP系统的重

2021-06-18 19:58:04 1335

原创 Redis集群丢数据问题——机器宕机没有自动切库,手动takeover后,老主库重启又抢回master

文章目录背景事故描述问题分析日志记录关键日志疑惑与猜测原因排查查看资料集群间通信手动故障转移配置纪元的主要作用:同版本集群测试准备测试流程日志分析根据日志查看源码逻辑has old slots configurationis back online网络问题确认异常信息信息确认集群间通信问题排查通信端口连接情况抓包确认之前疑惑的解答总结后续操作急救措施反思改进措施背景机器发生了宕机,查看后发现有个节点没有自动切库成功,为了保证集群对外能正常服务,所以决定手动强制切库,保证集群对外的可用性。事故描述先使

2021-05-17 18:28:59 1568

原创 在MAC上使用CLion调试Redis源码和RedisBloom

环境说明CLion:Version 2020.2.5Redis:redis-4.0.12RedisBloom:最新版在MAC上使用CLion调试 Redis源码根据上一篇的摸索和实践,在MAC上使用CLion调试Redis源码可以归纳如下:参照这个文章,在下载好的redis-4.0.12版本的代码里配置好 CMakeLists.txt文件;下载好 Version 2020.2.5的CLion,并使用 New CMake Project from Sources这种方法打开配置好````C

2021-05-07 18:38:26 744

原创 MAC上用CLion调试Redis源码及报错排查

(本文仅作为记录,还有待完善的地方)问题点:Clion 使用了 cmake 来管理项目,所以我们需要在 Redis 源码根目录下为它创建好 CMakeLists.txt 才能进行构建。尝试调试最新版Redis报错排查刚开始参考 mac + CLion + redis5 本地调试/运行 进行调试,过程中遇到了一些新的问题,记录如下:deps/hiredis/CMakeLists.txtCMake Error at deps/hiredis/CMakeLists.txt:168 (add_librar

2021-05-07 18:34:56 1507

原创 结合 tcprstat 和tcpdump、wireshark 工具定位Redis响应慢的原因

文章目录一、背景说明二、工具说明2.1 tcprstst2.2 tcpdump2.3 Wireshark三、使用步骤3.1 使用 tcpdump 进行抓包3.2 使用 tcprstat 进行时延探测记录3.3 使用 Wireshark 对包进行分析四、总结一、背景说明之前使用过 tcpdump / wireshark,线上也有时延探测工具 tcprstat,但是一直感觉差点意思,每次抓包或者看响应时间,都对不上号,不能较好的定位问题。知道机缘巧合发现了这个改良后的 tcprstat,如获至宝,经验证后

2021-04-30 19:06:19 1112 2

原创 Redis缓存命中率如何提高

一、缓存命中率命中:可以直接通过缓存获取到需要的数据,而不是从数据库中获取不命中:无法直接通过缓存获取到想要的数据,需要再次查询数据库或者执行其它的操作。原因可能是由于缓存中根本不存在,或者缓存已经过期。通常来讲,缓存的命中率越高则表示使用缓存的收益越高,应用的性能越好(响应时间越短、吞吐量越高),抗并发的能力越强。由此可见,在高并发的互联网系统中,缓存的命中率是至关重要的指标。如何查看Redis缓存命中率redis-cli -h xx -p xx info stats可以看到keyspa

2021-02-23 22:38:54 3305

原创 Redis分布式锁的演进和局限性

分布式锁的由来分布式应用进行逻辑处理时经常会遇到并发问题。比如一个操作要修改用户的状态,修改状态需要先读出用户的状态,在内存里进行修改,改完了再存回去。如果这样的操作被多个线程同时执行了,就会出现并发问题,因为同一个线程读取和保存状态这两个操作不是原子的。所谓原子操作是指不会被线程调度机制打断的操 作;这种操作一旦开始,就一直运行到结束,中间不会有任何 context switch 线程切换。)这个时候就要使用到分布式锁来限制程序的并发执行,保证同一时刻只能有一个进程在修改用户的状态。分布式锁

2021-01-29 20:06:59 294

原创 字节序、大端字节序(Big Endian)、小端字节序(Little Endian)总结

什么是字节序?字节序,简单来说,指的是 超过一个字节的数据类型在内存中存储的顺序有几种字节序?大端字节序(Big Endian)高位字节数据存放在内存低地址处,低位字节数据存放在内存高地址处。小端字节序(Little Endian)高位字节数据存放在内存高地址处,低位数据存放在内存低地址处。如上图所示,int32类型的数值 12345678用一个字节表示不了,需要用到4个字节,也就有了字节序的问题。数值 12345678(一千两百三十四万五千六百七十八),这里的最高位数据就是1,最低位数据

2021-01-10 10:13:55 19807 4

原创 Golang中 int int8 int16 int32 int64的区别和取值范围

先说结论吧,方便快速查询验证。总结区别int 类型大小为 8 字节int8 类型大小为 1 字节int16 类型大小为 2 字节int32 类型大小为 4 字节int64 类型大小为 8 字节go语言中的int的大小是和操作系统位数相关的,如果是32位操作系统,int类型的大小就是4字节; 如果是64位操作系统,int类型的大小就是8个字节取值范围int8: -128 ~ 127int16: -32768 ~ 32767int32: -2147483648 ~ 214

2021-01-08 19:19:47 22596 1

原创 Redis重大版本整理(Redis2.6-Redis7.0)

Redis借鉴了Linux操做系统对于版本号的命名规则:node 版本号第二位若是是奇数,则为非稳定版本(例如2.7、2.9、3.1),若是是偶数,则为稳定版本(例如2.6、2.8、3.0、3.2)。当前奇数版本就是下一个稳定版本的开发版本,例如2.9版本是3.0版本的开发版本,因此咱们在生产环境一般选取偶数版本的Redis。下面是重大版本新功能的归纳:Redis6.0多线程 IO(Threaded I/O)众多新模块(modules)API更好的过期循环(expire cycle)支持SS

2020-12-01 22:18:38 17136

原创 Linux如何查看某个进程收发包的数量

工作中定位排查一些问题,记录在此,积累经验。背景简述有两台机器之间网络不佳,影响上面的主从服务同步。使用ping命令简单测试之后发现,同一AZ(可用区)下的时延竟然有100多ms,正常情况下应该在1ms以内。之前没遇到过这样的情况,联系网络组的同事,通过监控发现两台机器的pps(Packet Per Second)很高,超过限制,被限流了,所以这两台机器之间的时延很大。那怎么找到造成pps升高的进程呢?实操小结使用iftop -P命令,可以看到机器上各个端口之间的流量情况,可以定位到对应的进程

2020-11-29 22:57:59 6193 1

原创 Redis RDB文件的解析工具梳理(rdr/redis-rdb-tools)

前言目前关于Redis rdb文件解析的工具,目前了解到的主要有python写的 redis-rdb-tools 工具,和用golang写的 rdr 工具。https://github.com/sripathikrishnan/redis-rdb-toolshttps://github.com/xueqiu/rdrRDR(redis data reveal) is a tool to parse redis rdbfile. Comparing to redis-rdb-tools, RD

2020-11-29 18:00:47 4074

原创 tmux linux后台管理工具快速使用指南

常用操作新建tmux new -s demo# 新建一个名称为demo的会话断开当前会话使用快捷键组合先按Ctrl+b, 再按d,就可以断开当前会话。进入之前的会话tmux a# 默认进入第一个会话tmux a -t demo# 进入到名称为demo的会话关闭会话tmux kill-session -t demo# 关闭demo会话tmux kill-server# 关闭所有会话查看所有的会话tmux list-session# 查看所有会话tmux ls# 查看所有会话,提倡使用

2020-10-30 19:56:45 255

原创 Redis 3.0.7版不支持带密码的cluster rebalance操作

一、前言二、操作2.1 模拟和执行2.2 fix2.3 换5版本的redis-cli继续尝试2.4 查看源码三、总结一、前言因业务需要扩容,考虑到集群单实例容量已经超过10GB,算是比较大的情况了。所以不能直接调整maxmemory参数进行扩容,需要加节点动态扩容。业务集群版本是3.0.7版本的。二、操作2.1 模拟和执行在对3.0.7版带密码的集群加好新主从,模拟迁槽位没有问题:./redis-trib.rb rebalance --password "xxx" --use-empty-m.

2020-09-28 22:44:56 651

转载 Mediakit报告设备商的空间不足以执行此操作的纯MAC解法

转载自:http://zablog.me/2018/03/09/diskutil/

2020-09-06 15:01:30 981

原创 通过工具寻找TiDB瓶颈

通过工具寻找TiDB瓶颈一、课前准备1.1 启动Tidb集群二、分析性能2.1 CPU profile2.1.1 通过tidb dashboard进行分析2.1.2 通过debug.zip分析tidb性能2.1.3 通过perf命令分析Tikv CPU 性能2.2 IO2.2.1 Grafana: Disk-Performance2.2.2 iostat2.2.3 iotop2.2.4 iosnoop2.2.5 其他IO工具2.3 Memory2.3.1 TiDB Memory2.3.2 TiKV M

2020-08-29 16:46:54 603 2

原创 tidb源码编译安装,从入门到差点放弃

11.安装环境依赖2.开始```git clone```编译代码2.1 尝试gitee2.2 科学上网2.3 dockerfile2.4 最后尝试3.代码学习与修改用deepin linux环境测试clone&makedeployPDTiKVTiDBtest原本以为编译安装应该还好,可能会遇到一些环境问题,Google下应该就能解决,但还是太年轻了,,,看完视频课之后,准备安装前,看到这样一篇博客,TiDB在Centos7上通过源码编译安装,大概看了一下,觉得还行,就开始参考着上手,准备在cen

2020-08-25 17:57:27 1975 2

原创 对TiDB进行基准测试

对TiDB进行基准测试一、前期准备1.1 测试机配置说明1.2 搭建TiDB集群1.3 小插曲二、压测工具安装和熟悉2.1 sysbench2.1.1 安装2.1.2 导入数据2.1.3 测试2.2 go-ycsb2.2.1 安装2.2.2 导入数据2.2.3 测试2.3 go-tpc2.3.1 安装2.3.2 tpc-C2.3.3 tpc-H2.3.4 补充三、测试并分析性能监控3.1 默认最小集群版测试3.1.1 sysbench3.1.2 go-ycsb3.1.3 go-TPC3.1.3.1 go-t

2020-08-25 16:04:15 1535

原创 Python 实例方法、类方法、静态方法区别总结

实例方法、类方法、静态方法区别总结一、总结1.1 定义形式上:1.2 调用方式上:1.3 使用最多,可以直接处理实例对象的逻辑;二、示例一个代码定义和执行的过程回顾一、总结1.1 定义形式上:类方法和静态方法都是通过装饰器实现的,实例方法不是;实例方法需要传入self参数,类方法需要传入cls参数,而静态方法不需要传self或者cls参数。注意:不管self参数,还是cls参数,都是一种约定俗成的用法,其实是可以使用其他的参数名代替。但是不建议使用其他参数名,毕竟代码不是只是写给自己看的。1

2020-07-28 22:02:37 1876

原创 Python 新式类和经典类(老式类)的区别

新式类和经典类的区别1、新式类对象可以直接通过```__class__```属性获取自身类型:type2、对于多重继承的属性搜索顺序不一样3、新式类增加了__slots__内置属性, 可以把实例属性的种类锁定到__slots__规定的范围之中4、新式类增加了__getattribute__方法前言:从Python2.2开始,Python 引入了 new style class(新式类)Python 2.x中默认都是经典类,只有显式继承了object才是新式类Python 3.x中默认都是新式类,不

2020-07-27 20:19:24 830

原创 锁:根据业务场景选择合适的锁

互斥锁能够满足各类功能性要求,特别是被锁住的代码执行时间不可控时,它通过内核执行线程切换及时释放了资源,但它的性能消耗最大。需要注意的是,协程的互斥锁实现原理完全不同,它并不与内核打交道,虽然不能跨线程工作,但效率很高。如果能够确定被锁住的代码取到锁后很快就能释放,应该使用更高效的自旋锁,它特别适合基于异步编程实现的高并发服务。如果能区分出读写操作,读写锁就是第一选择,它允许多个读线程同时持有读锁,提高了并发性。读写锁是有倾向性的,读优先锁很高效,但容易让写线程饿死,而写优先锁会优先服务写线程,但对读线

2020-07-12 11:36:19 348

原创 协程:快速地实现高并发服务

总结协程融合了多线程与异步化编程的优点,既保证了开发效率,也提升了运行效率。有限的硬件资源下,多线程通过微观上时间片的切换,实现了同时服务上百个用户的能力。多线程的开发成本虽然低,但内存消耗大,切换次数过多,无法实现高并发。异步编程方式通过非阻塞系统调用和多路复用,把原本属于内核的请求切换能力,放在用户态的代码中执行。这样,不仅减少了每个请求的内存消耗,也降低了切换请求的成本,最终实现了高并发。然而,异步编程违反了代码的内聚性,还需要业务代码关注并发细节,开发成本很高。协程参考内核通过 CPU 寄存

2020-07-12 11:35:26 617 1

原创 零拷贝:高效地传输文件

基于用户缓冲区传输文件时,过多的内存拷贝与上下文切换次数会降低性能。零拷贝技术在内核中完成内存拷贝,天然降低了内存拷贝次数。它通过一次系统调用合并了磁盘读取与网络发送两个操作,降低了上下文切换次数。尤其是,由于拷贝在内核中完成,它可以最大化使用 socket 缓冲区的可用空间,从而提高了一次系统调用中处理的数据量,进一步降低了上下文切换次数。零拷贝技术基于 PageCache,而 PageCache 缓存了最近访问过的数据,提升了访问缓存数据的性能,同时,为了解决机械磁盘寻址慢的问题,它还协助 IO 调度

2020-07-12 11:34:26 318

原创 goredis客户端配置

代码定义:type Options struct { // The network type, either tcp or unix. // Default is tcp. Network string // host:port address. Addr string // Dialer creates new network connection and has priority over // Network and Addr options. Dialer func(ctx c.

2020-07-12 11:27:24 958

原创 docker RUN vs CMD vs ENTRYPOINT

RUN vs CMD vs ENTRYPOINTRUN 执行命令并创建新的镜像层,RUN 经常用于安装软件包。CMD 设置容器启动后默认执行的命令及其参数,但 CMD 能够被 docker run 后面跟的命令行参数替换。ENTRYPOINT 配置容器启动时运行的命令。Shell 和 Exec 格式我们可用两种方式指定 RUN、CMD 和 ENTRYPOINT 要运行的命令:Shell 格式和 Exec 格式,二者在使用上有细微的区别。Shell 格式<instruction>

2020-06-13 18:51:55 440

原创 docker总结——网络

一、三种网络1.1 none网络故名思议,none网络就是什么都没有的网络。挂在这个网络下的容器除了 lo,没有其他任何网卡。容器创建时,可以通过 --network=none指定使用none网络。这样一个封闭的网络有什么用呢? 封闭意味着隔离,一些对安全性要求高并且不需要联网的应用可以使用 none 网络。比如某个容器的唯一用途是生成随机密码,就可以放到 none 网络中避免密码被窃取。1.2 host网络连接到host网络的容器共享 Docker host的网络栈,容器的网络配置与ho

2020-06-13 18:51:00 312

原创 docker总结——容器

一、运行容器 attach VS execattach 与 exec 主要区别如下:attach 直接进入容器 启动命令 的终端,不会启动新的进程。exec 则是在容器中打开新的终端,并且可以启动新的进程。如果想直接在终端中查看启动命令的输出,用 attach;其他情况使用 exec。docker exec -it <container> bash|sh是执行 exec 最常用的方式ps: 如果只是为了查看启动命令的输出,可以使用 docker logs 命令;-f的作用与tai

2020-06-13 18:49:59 316

原创 docker总结——镜像

一、base 镜像不依赖其他镜像,从 scratch 构建其他镜像可以之为基础进行扩展所以,能称作 base 镜像的通常都是各种 Linux 发行版的 Docker 镜像,比如 Ubuntu, Debian, CentOS 等。Linux 操作系统由内核空间和用户空间组成。如下图所示:1.1 rootfs内核空间是 kernel,Linux 刚启动时会加载 bootfs 文件系统,之后 bootfs 会被卸载掉。用户空间的文件系统是 rootfs,包含我们熟悉的 /dev, /proc,

2020-06-13 18:48:18 419

原创 MAC docker-19.03.8版配置国内代理的解决办法

1、点击docker图标的“Preferences”,进入设置2、点击“Docker Engine”;3、在右侧框中输入如下内容;"registry-mirrors": [ "https://docker.mirrors.ustc.edu.cn", "https://hub-mirror.c.163.com" ]4、点击按钮 Apply & Restart 重启即可在终端输入命令docker info看到如下信息就说明配置成功:参考:https://zh

2020-06-07 11:12:09 2731

转载 优雅地删除 Redis bigkey

文章目录redis bigkey的定义直接删除大Key的风险如何优雅地删除各类大KeyHash KeySet KeyList KeySorted set keyredis bigkey的定义关于Redis大键(Key),我们从[空间复杂性]和访问它的[时间复杂度]两个方面来定义大键。前者主要表示Redis键的占用内存大小;后者表示Redis集合数据类型(set/hash/list/sorted set)键,所含有的元素个数。以下两个示例:1个大小200MB的String键(String Objec

2020-05-23 18:18:19 1042

原创 Go学习总结——并发编程

1、CSP vs Actor和Actor的直接通信不同,CSP模式则是通过channel进行通讯的,更松耦合一些Go中channel是有容量限制并且独立于处理Groutine,而如Erlang,Actor模式中的mailbox的容量是无限的,接收进程也总是被动地处理消息2、多路选择和超时控制selecttime.After3、channel的关闭和广播向关闭的channel...

2020-04-28 16:59:20 151

原创 Go学习总结——包依赖管理

1、package基本复用模块单元,以首字母大写来表明可被包外代码访问代码的package可以和所在目录不一致同一目录里的Go代码的package要保持一致,取名不能错误2、init方法在main被执行前,所有依赖的package的init方法都会被执行不同包的init函数按照包导入的依赖关系决定执行顺序,Go语言可以自动处理这种依赖关系每个包可以有多个init函数包的每个源...

2020-04-28 16:58:35 521

原创 Go学习总结——错误处理

1、Go的错误机制没有异常机制error 类型实现了error接口可以通过error.New来快速创建错误实例在处理错误或者调用函数接收错误的时候,要避免嵌套,要从及早失败的角度编写代码,让代码更清晰2、panic和recoverpanic用于不可以恢复的错误panic退出前会执行defer指定的内容3、panic vs os.Exitos.Exit退出时不会调用def...

2020-04-28 16:57:57 142

原创 Go学习总结——函数

1、函数是一等公民可以有多个返回值所有参数都是值传递,slice/map/channel会有引用的错觉函数可以作为变量的值函数可以作为参数和返回值2、Go接口接口为非入侵性,实现不依赖于接口定义所有接口的定义可以包含在接口使用者包内倾向于使用小的接口定义,很多接口只包含一个方法较大的接口定义,可以由多个小接口定义组合而成只依赖于必要功能的最小接口3、扩展与复用内嵌...

2020-04-28 16:57:04 136

原创 Go学习总结——基础

1、测试文件名一定要以xxx_test.go结尾2、交换变量 a,b = b,a3、连续常量的定义const( Monday = iota + 1 Tuesday Wednesday)const ( open = 1 << iota close pending)4、Go语言的特性Go 对于数据类型的转换是比较严苛的,不支持隐式类型转换,也不支持别名...

2020-04-28 16:55:54 251

原创 pycharm安装MySQLdb遇到的坑

文章目录python版本和MySQLdbpycharm(Windows)的默认python版本可能的错误3.1 Could not find a version that satisfies the requirement mysqldb (from versions3.2 Unable to find vcvarsall.bat3.3 C++ for Python\9.0\VC\Bin\amd6...

2020-03-19 20:31:59 3989 2

VCForPython275.zip

安装MySQLdb时可能需要的环境 Visual C++ 9.0

2020-03-19

数据库简介

mysql数据库简介,资源有点老,但是还不错,希望大家喜欢

2018-12-14

空空如也

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

TA关注的人

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