- 博客(102)
- 资源 (3)
- 收藏
- 关注

原创 集合各实现类的底层实现原理
ArrayList实现原理要点概括参考文献:http://zhangshixi.iteye.com/blog/674856lArrayList是List接口的可变数组非同步实现,并允许包括null在内的所有元素。底层使用数组实现该集合是可变长度数组,数组扩容时,会将老数组中的元素重新拷贝一份到新的数组中,每次数组容量增长大约是其容量的1.5倍,这种操作的代价很高。采用了Fail-Fast机制
2017-02-16 16:11:04
53532
12
原创 客户端报错:Could not get a resource from the pool
客户端报错:Could not get a resource from the pool1. 原因&解决方案并发确实太高,链接池配置参数不合理解决方案:调整配置参数;扩容节点Redis执行队列被大量操作或者耗时操作占用解决方案:优化慢操作;禁止慢操作存在热key解决方案:拆分key,分散压力到各个redis节点;增加本地内存,先查本地内存,查不到再去redis某个节点链接池耗尽解决方案:解决数据倾斜问题执行耗时命令导致ping超时解决方案:禁用耗时命令,如:
2021-11-22 20:18:30
2558
原创 使用pipeline优化性能
使用pipeline优化性能存占用优化1. 请求响应耗时分析一个完整的请求响应,时间耗费主要分为3部分:链接的创建与回收网络IO命令实际例:需要查询100个userId的详情信息常规做法:遍历100个key,循环查询,组装数据返回推荐做法:mget、pipeline批量获取mget、pipeline节省了链接的创建与回收、网络IO的时间2. Redis cluster pipeline实现思路mget、pipeline不适用于cluster集群模式要想适用批处理,需
2021-11-21 11:16:25
755
原创 内存占用优化
内存占用优化1. 利用jemalloc内存分配特性进行优化jemalloc在64位系统中,将内存空间划分为小、大、巨大三个范围;每个范围内又划分了许多小的内存块单位;当Redis存储数据时,会选择大小最合适的内存块进行存储。如图:由于jemalloc分配内存时数值是不连续的,因此key/value字符串变化一个字节,可能会引起占用内存很大的变动,在设计时可以利用这一点。例如,key的长度如果是8个字节,则SDS为8+9=17字节,jemalloc分配32字节;此时将key长度缩减为7个字节,则SD
2021-11-21 11:15:56
1166
原创 快速批量执行redis命令
1. 背景使用redis的时候,经常会有这么一个需求:批量删除某前缀的key怎么做呢?2. 处理步骤2.1 准备好需要删除的key为了避免阻塞redis,最好不要用keys命令进行检索,可以使用scan命令得到keys,如下:./redis-cli -h 192.168.22.1 -p 6379 --scan --pattern 'user*'2.2 批处理拼接del命令可以借用notepad++的批处理命令,Alt + Shift 拼接del,效果如下:del user:10086d
2021-11-13 11:31:55
1886
原创 Redis RDB内存分析
Redis内存分析1. 为什么要对Redis进行内存分析Redis运行久了,内部经常会堆积些冗余数据,或者不合理的使用也会导致内存的占用内存比磁盘贵,优化了内存占用就是省钱2. 怎么构建内存分析数据2.1 下载近期的冷备RDB文件下载RDB文件,将他放置到性能比较好的机器上2.2 安装rdbtoolspip install rdbtools2.3 RDB导出为csv文件看自己需求是分析全量数据,还是分析占比较多的数据,按需选择导出全量数据:rdb -c memory /user
2021-10-24 14:43:55
3021
原创 千万级别Ip库演化历程
千万级别Ip库演化历程购买了第三方提供的千万级别Ip库,以数据库文件*.mmdb的形式提供阶段一:项目启动时加载第三方提供的Ip本地数据库文件问题:库文件较大,加载耗内存,并且库文件放到项目里,增大了包体的大小阶段二:提取Ip数据库文件到外部目录优点:减小包体大小,多项目共用一份数据问题:加载后仍消耗较多内存阶段三:提取Ip数据库数据至redis集群,并借鉴B+树结构,设计了1级索引、2级索引、3级指向最终数据的结构优点:无需关注本地Ip库文件,只与redis缓存打交道问题:存在热数据
2021-08-06 10:53:00
148
原创 RabbitMQ优化消息阻塞系列(三)架构调整
架构调整1. 背景最开始的RabbitMQ架构是主备模式,支持的并发和数据量不高。现决定部署一套采用镜像模式的集群架构,提升并发性能,但怎么从旧架构平滑切换到新架构成了首要问题。2. 平滑切换方案2.1 额外加载新增MQ配置服务A原本加载的是mq主备配置,为了平滑过渡,额外加载mq镜像配置,这两份配置的区别就只是ip、端口、vhost、账号、密码不同,其他譬如交换器、队列的配置都相同。2.2 分批次平滑切换队列按队列的重要级别梳理出若干批队列,第一次先切换优先级低的队列到MQ镜像集群,观
2021-05-27 15:52:09
350
原创 RabbitMQ优化消息阻塞系列(二)参数调优
参数调优1. 调优生产者客户端参数默认消息就是持久化的,如果对应的队列和交换机都没有配置持久化,一旦mq重启,没有配置持久化的队列和交换机将会消失,里面的消息也会消失durable参数在rabbit:queue中,durable=“true” 开启持久化。在rabbit:direct-exchange中,durable=“true” 开启持久化。2. 调优消费者客户端参数prefetch参数在rabbit:listener-container中,一次性预取xx条消息到内存
2021-04-01 16:29:41
2342
原创 RabbitMQ优化消息阻塞系列(一)解决方案梳理
消息阻塞解决方案1. 问题分析1.1 不合理配置参数max-concurrency配置过多,超过了2048默认最大channel限制高流量队列设置prefetch=1MQ本身没有设置更大的channel限制多个队列共用一个connection…1.2 消费者中嵌入太多业务很多业务的处理都冗余在该消费者中1.3 业务中存在太多数据库、缓存操作消费者中存在很多数据库操作和缓存操作,毫秒级的网络开销越积越多,影响消费能力1.4 消费者数量太少高流量队列应配置对应多的消费者1.5 M
2021-03-02 20:16:11
5862
原创 简单定位CPU 暴增问题
1. 概述在高峰时段,某个服务会把我们的8核服务器CPU跑满,受此影响,期间各个接口超时情况严重,影响了应用功能2. 排查步骤2.1 top -c显示完整命令,找出消耗CPU最高的进程2.2 top -Hp pid查看所在进程的线程,找出消耗CPU最高的线程2.3 printf “%x\n” 线程id得到转换的16进制线程id2.4 jstack pid | grep ‘16进制线程id’ -C30 --color查看当前线程的运行情况,将会帮助我们定位到代码3. 原因分析3.1
2020-12-30 18:37:24
687
原创 Gitlab请求合并审核与Code Review
1. 提测、发布流程概述1.1 分支设置假定项目在Gitlab上有三块分支:master,主干;test,测试分支;development**,**功能开发分支。1.2 权限控制说明development开发分支不做具体的保护措施;master、test只允许代码合并负责人merge,不允许任何人push。1.3 Code Review确定好参会人员,提前预定会议室进行代码走读,其中参会人员必须包括请求合并提交人与代码合并负责人;确认参会人员后,
2020-12-30 18:17:47
13829
原创 记第一次上K8S踩的坑
前言前段时间架构升级,从dubbo转到了springcloud,顺便也上了k8s,开始了踩坑之旅正文架构升级进入了调优阶段,但是压测一直过不了,机器压力一直上不去。随之我们展开了一系列排查与调优工作,涉及网络、框架参数、慢sql、内核参数等,基本都撸了一遍,最终结果只是稍有好转,但压力仍然上不去,百思不得其姐。最终在k8s的yaml配置文件中,发现了问题。配置中我们给每个容器都分配了内存,分配了核数,恰恰问题都是出现在分配核数上!这样子分配CPU资源,并没法很好地利用,会造成资源浪费,难怪机器压力
2020-06-18 11:56:15
571
原创 Logback个性化日志定制
定义日志层级理想日志存放路径与格式如下:/data/cloud/logs/cloud.activity.api/${logTag}/%d{yyyyMMdd}/info.log.%i最终会生成:/data/cloud/logs/cloud.activity.api/market-app/20200330/info.log.1对外服务日志与内部服务日志分离我这里部署多个activity服务...
2020-03-31 13:57:24
551
原创 SpringCloud服务启动后,接口第一次请求很慢
SpringCloud服务启动后,接口第一次请求很慢的优化历程症状概述服务启动后,请求任意接口,都很慢,响应时长达到2秒而再次进行请求,响应很快,响应时长毫秒级。初步诊断很可能耗时资源在第一次接收到请求时才进行初始化确定病因上图为第一次请求时打印的日志,由此可知第一次请求时初始化了DataSource、Redis、Servlet还有个网上找到的Ribbon优化,默认client...
2020-03-27 16:34:15
7219
原创 Codis3之参数调优
1. 参数调优1.1 关闭AOF只做纯内存的缓存,其实只需要RDB就好了,不需要AOF,因为AOF性能比RDB差些,消耗的磁盘空间也更大,我们只需要RDB做冷备。相对于AOF持久化机制来说,直接基于RDB数据文件来重启和恢复redis进程,更加快速。使用RDB来进行快速的数据恢复,达到缓存预热的目的。1.2 修改RDB配置redis.conf文件,去配置持久化save 900 1sav...
2019-12-25 09:28:12
572
原创 Codis3之Docker部署实战
1. 环境搭建1.1 Go环境搭建1.1.1 下载下载地址:http://golangtc.com/download1.1.2 解压tar -zxvf go1.10.3.linux-amd64.tar.gz -C /usr/local1.1.3 配置环境变量vim /etc/profileexport GOROOT=/usr/local/go # 安装路径 export ...
2019-12-24 18:25:46
534
原创 记一次Nginx服务器报502 Connection timed out的排查历程
记一次Nginx服务器报502 Connection timed out的排查历程一个风和日丽的下午,测试小妹妹心急火燎地突然跑过来说,同样的脚本,同样的压测参数,但在持续压测2min左右后开始报502错误,重要功能平均响应时间严重超标。重现从测试小妹妹那要来Jmeter脚本,300并发持续5分钟进行压测。不出意外,果然2分钟左右Jmeter就出现502 Bad Gateway错误。...
2019-07-10 14:53:49
6573
2
原创 RocketMq使用经验总结
RocketMq简介基本概念Produce消息生产者,负责产生消息,一般由业务系统负责产生消息。Consumer消息消费者,负责消费消息,一般是后台系统负责异步消费。Push ConsumerConsumer的一种,应用通常向Consumer对象注册一个Listener接口,一旦收到消息,Consumer对象立刻回调Listener接口方法。Pull ConsumerConsum...
2019-07-01 15:43:03
2379
1
原创 七牛云文件上传、处理工具类
概述项目需要,后台所有图片需要上传到七牛云。以下是自己写的工具类实现 /** * 七牛云工具类 */public class QiNiuUtils { private Logger log = LoggerFactory.getLogger(QiNiuUtils.class); private static UploadManager uploadManager;...
2019-04-18 15:07:15
1484
1
原创 Mycat修改配置,无需重启,动态刷新配置
环境介绍192.168.1.131 mysql192.168.1.132 mycat动态加载登上192.168.0.226机器mysql -u用户名 -p密码 -P8066 -h192.168.1.132执行命令会加载schema.xml配置的调整。reload @@config;刷新全部配置reload @@config_all;...
2019-04-02 17:42:04
7454
原创 项目容器化改造(五)Jenkins打包项目镜像
项目容器化改造(五)Jenkins打包项目镜像服务器规划打包镜像需要的内容catalina.sh文件demo-0.0.1-SNAPSHOT.warDockerfile 文件新建api_image打包任务在部署Jenkins的机子上登录Harbor仓库配置SSH hosts设置丢弃旧的构建与参数化构建配置ssh 打包脚本打包测试在Console Output中查看日志在Harbor仓库中查看镜像服...
2019-01-14 22:07:08
1759
1
原创 项目容器化改造(四)构建基础镜像
项目容器化改造(四)构建基础镜像基础镜像制作包含内容Dockerfile文件文件格式命令详解Docker常用命令制作基础镜像编写Dockerfile文件通过Dockerfile文件构建镜像验证镜像是否生成基础镜像制作包含内容我这里使用的是tomcat7和jdk8,下载好tar包后解压Dockerfile文件Dockerfile 是一个文本文件,其内包含了一条条的指令(Instructio...
2019-01-13 20:00:22
1136
原创 项目容器化改造(三)企业级私有仓库Harbor部署
项目容器化改造(三)企业级私有仓库Harbor部署Docker engine安装移除旧版本的Docker安装最新版本启动Docker设置开机启动测试是否安装成功Docker Compose安装安装最新版设置权限测试是否安装成功安装Harbor获取包地址下载解压修改配置安装测试是否安装成功推送、拉取镜像配置http协议的仓库打Tag推送拉取Docker engine安装移除旧版本的Docker...
2019-01-12 14:59:36
724
原创 项目容器化改造(二)Jenkins打包项目jar包
项目容器化改造(二)Jenkins打包项目jar包安装Maven下载Maven解压配置MAVEN_HOME安装Git安装gcc安装g++安装编译所需的包下载安装包解压源码包编译和安装配置Git_HOME安装publish over ssh插件(用于上传打包好的项目到远程Linux)可选插件中找到该插件勾选后点 直接安装配置SSH Server配置打包任务创建自由风格的软件项目![在这里插入图片描述...
2019-01-06 10:15:47
3532
3
原创 项目容器化改造(一)部署jenkins持续集成服务器
项目容器化改造(一)部署Jenkins持续集成服务器总体流程安装Jenkins官网下载Jenkins包查看密码安装推荐的插件设置账号密码安装完成总体流程Jenkins上根据构建参数进行jar构建 ——> Jenkins从github拉取代码 ——>Maven打成jar包 ——> 根据构建参数复制jar到指定目录Jenkins上根据构建参数进行镜像构建 ——> Je...
2019-01-06 08:10:44
873
2
原创 实际开发中Sql性能优化套路
实际开发中Sql性能优化套路sql优化套路定位慢sql造数据解释SqlEXPLAIN结果说明tabletype(重要)possible_keyskeykey_lenrefrowsExtra使用索引查询需要注意使用LIKE关键字的查询使用联合索引的查询使用OR关键字的查询子查询优化数据库结构优化将字段很多的表分解成多个表增加中间表增加冗余字段sql优化套路一般都是压测时,测试报告显示某接口响应时...
2018-12-31 10:47:03
1136
原创 阿里云ECS服务器下的Mycat高可用方案介绍与实战
前言最近在做系统架构升级,其中之一是让mycat集群化,达到高可用的目的,不然单点故障这把达克摩斯之剑悬在头顶,晚上都睡不安稳。以下为调研的几套方案。方案分析HaProxy+Keepalived这套方案是mycat官方推荐的方案。构造虚拟ip,keepalived抢占ip,对应的HaProxy提供服务;看起来很美,但是阿里云不支持浮动ip。我们否决了此方案。SLB有个哥们踩到了阿里...
2018-11-02 10:30:08
2142
原创 redis与zk实现分布式锁
概述分布式锁,如果你有多个机器在访问同一个共享资源,那么这个时候,如果你需要加个锁,让多个分布式的机器在访问共享资源的时候串行起来那么这个时候,那个锁,多个不同机器上的服务共享的锁,就是分布式锁分布式锁当然有很多种不同的实现方案,redis分布式锁,zookeeper分布式锁对比数据库锁:优点:直接使用数据库,使用简单。缺点:分布式系统大多数瓶颈都在数据库,使用数据库锁会...
2018-10-17 13:13:45
2506
原创 大数据量 Mybatis 分页插件Count语句优化
前言当在大数量的情况下,进行分页查询,统计总数时,会自动count一次,这个语句是在我们的查询语句的基础上嵌套一层,如:SELECT COUNT(*) FROM (主sql) 这样在数据量大的情况下,会出问题,很容易cpu就跑满了#优化在mapper.xml中自定义count查询,使用自定义的查询速度会快些参考资料:https://github.com/pagehelper/My...
2018-09-29 18:25:42
18672
3
原创 Mycat全局序列号失效的诡异事件
概述某分库表自增id出现异常,自增id用的物理库自增方式,检查了mycat配置文件,是没有配错的,百思不得其姐原因如果分库分表,使用mycat自增,数据库表id写了AUTO_INCREMENT,并且mybatis里插入语句如下:insert into c_user_info (id, user_id, phone, nickname) v...
2018-08-31 15:38:06
632
原创 从头搭建codis3.0集群
配置hosts映射关系vi /etc/hosts192.168.92.137 item01192.168.92.138 item02192.168.92.139 item03配置hostnameset-hostname item01另外两台台机器的hostname分别设置为item02,item03reboot -f配置3台CentOS为ssh免密码互相通...
2018-08-25 23:20:30
534
原创 打造双层nginx,分发层与应用层
分发层+应用层,双层nginx分发层nginx,负责流量分发的逻辑和策略,这个里面它可以根据你自己定义的一些规则,比如根据productId去进行hash,然后对后端的nginx数量取模将某一个商品的访问的请求,就固定路由到一个nginx后端服务器上去,保证说只会从redis中获取一次缓存数据,后面全都是走nginx本地缓存了后端的nginx服务器,就称之为应用服务器; 最前端的ngi...
2018-08-09 18:04:33
2204
原创 kafka踩坑之消费者收不到消息
生产者发送消息,客户端始终消费不到原因:客户端版本与服务端不一致解决:我这里服务端使用的是:kafka_2.10-0.8.2.1.tgz,客户端原来使用的是0.8.1,需要改为:<dependency> <groupId>org.apache.kafka</groupId> <artifactId>...
2018-08-08 21:37:00
25753
1
原创 基于zookeeper分布式锁的解决方案
1. 概述分布式锁,如果你有多个机器在访问同一个共享资源,那么这个时候,如果你需要加个锁,让多个分布式的机器在访问共享资源的时候串行起来那么这个时候,那个锁,多个不同机器上的服务共享的锁,就是分布式锁分布式锁当然有很多种不同的实现方案,redis分布式锁,zookeeper分布式锁2. 原理我们通过去创建zk的一个临时node,来模拟加锁zk会给你保证说,只会创建一...
2018-08-05 13:42:44
1655
原创 tcpcopy部署测试
tcpcopy部署测试注意:intercept ./configure的时候,提示:pcap.h not found需要安装组件,yum install libpcap-devel不然make时,会报错:make: * No rule to make target build', needed bydefault’. Stop.参考:https://www.cnblogs....
2018-06-23 10:24:55
272
原创 使用Navicat连接Mycat的诡异事件
概述在家搭建Mycat进行测试,当使用Navicat连接时,报错 no mycat database selected,检查了mycat配置文件,是没有配错的,百思不得其姐原因Mycat不支持低版本的工具连接,家里的Navicat是8.0版本,需要升级到较新的版本...
2018-05-29 12:54:46
12282
1
原创 Mycat全局序列号
全局序列号概述全局序列号是MyCAT提供的一个新功能,为了实现分库分表情况下,表的主键是全局唯一,而默认的MySQL的自增长主键无法满足这个要求。全局序列号的语法符合标准SQL规范。其格式为: next value for MYCATSEQ_GLOBAL其中MYCATSEQ_GLOBAL是序列号的名字,MyCAT自动创建新的序列号,免去了开发的复杂度,另外,MyCAT也提供了一个全局...
2018-05-29 12:54:11
490
原创 使用Spring实现读写分离
1 背景我们一般应用对数据库而言都是“读多写少”,也就说对数据库读取数据的压力比较大,有一个思路就是说采用数据库集群的方案, 其中一个是主库,负责写入数据,我们称之为:写库; 其它都是从库,负责读取数据,我们称之为:读库;2 方案解决读写分离的方案有两种:应用层解决和中间件解决。2.1 应用层解决:优点:多数据源切换方便,由程序自动完成;不需要引入中间件...
2018-02-23 16:28:17
1919
SpringBoot之脚手架
2017-09-26
SpringBootDemo
2017-09-26
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人