<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[tom和cat的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/sinat_32023305</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; sinat_32023305]]></copyright><item><title><![CDATA[Mac M1安装Homebrew教程]]></title><link>https://blog.youkuaiyun.com/sinat_32023305/article/details/125039336</link><guid>https://blog.youkuaiyun.com/sinat_32023305/article/details/125039336</guid><author>sinat_32023305</author><pubDate>Mon, 30 May 2022 01:27:27 +0800</pubDate><description><![CDATA[网上一堆安装教程结果各种报错信息；最后发现一个靠谱文章：https://blog.youkuaiyun.com/fgx_123456/article/details/109529180

MacOS系统使用Homebrew官方地址时，报错：


Mac:~ jc$ /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"
curl: (35) LibreSSL SSL_connect]]></description><category></category></item><item><title><![CDATA[Redis阻塞的几种原因]]></title><link>https://blog.youkuaiyun.com/sinat_32023305/article/details/122564257</link><guid>https://blog.youkuaiyun.com/sinat_32023305/article/details/122564257</guid><author>sinat_32023305</author><pubDate>Tue, 18 Jan 2022 17:14:42 +0800</pubDate><description><![CDATA[客户端最先感知阻塞等Redis超时行为，应用方会收到大量Redis超时异常，比如Jedis客户端会抛出JedisConnectionException异常。加入日志监控报警工具可快速定位阻塞问题，同时需要对Redis进程和机器做全面监控。

导致阻塞问题的场景大致分为内在原因和外在原因:

1）内在原因包括：

1.1、数据集中过期

Redis的主动过期的定时任务，也是在Redis主线程中执行的，如果出现了需要大量删除过期key的情况，那么主线程会出现阻塞（最大25s）。而且这个访问延迟的情况，不会记录在]]></description><category></category></item><item><title><![CDATA[一文解析TOP命令]]></title><link>https://blog.youkuaiyun.com/sinat_32023305/article/details/119953396</link><guid>https://blog.youkuaiyun.com/sinat_32023305/article/details/119953396</guid><author>sinat_32023305</author><pubDate>Fri, 27 Aug 2021 15:57:21 +0800</pubDate><description><![CDATA[top命令是用户监视 Linux 上的进程和系统资源使用情况是最常用到的命令



根据上图内容，我们来慢慢逐行解读；

（1）top - 14:54:08 up 954 days, 3:44, 1 user, load average: 13.57, 15.63, 16.76

top：当前时间

up：机器运行了多少时间

users：当前有多少用户

Load Average平均负载：过去 1 分钟、5 分钟和 15 分钟内的平均负载。

平均负载其实就是平均活跃进程数，直观上的理解就是单位...]]></description><category></category></item><item><title><![CDATA[双缓冲机制]]></title><link>https://blog.youkuaiyun.com/sinat_32023305/article/details/119912101</link><guid>https://blog.youkuaiyun.com/sinat_32023305/article/details/119912101</guid><author>sinat_32023305</author><pubDate>Wed, 25 Aug 2021 15:55:16 +0800</pubDate><description><![CDATA[在看HDFS Editlog写机制中提到了双缓冲机制

针对写入本地磁盘文件，大量客户端同时写会导致写入本地磁盘文件时出现多线程安全问题，HDFS如何保证安全呢？

两个方面

对每个写入的edits log分配一个全局顺序递增的transactionid(txid),基于这个序号可以标识每个edits log的先后顺序。
	针对txid,要保证全局顺序一致，就要加锁保证安全，也就是每个修改元数据的线程都要先拿到锁然后生成txid才能写入edits log
流程：





其他使用场景

（1）逻辑处..]]></description><category></category></item><item><title><![CDATA[五种方案解决幂等问题]]></title><link>https://blog.youkuaiyun.com/sinat_32023305/article/details/119610885</link><guid>https://blog.youkuaiyun.com/sinat_32023305/article/details/119610885</guid><author>sinat_32023305</author><pubDate>Wed, 11 Aug 2021 16:51:39 +0800</pubDate><description><![CDATA[方案一：数据库唯一主键实现幂等性



缺点：无法使用change buffer，InnoDB为了进行唯一性检查，必须有一次磁盘IO读页

方案二：业务状态校验

业务上根据业务ID的唯一性和业务处理的结果去做判断，但是这部分判断的逻辑需要考虑原子性。否则会因为并发问题导致幂等失效。解决途径一就是加锁，根据当前的服务环境选择单机或分布式锁。二是可采用现成方案Tomato，通过滑动窗口或者固定窗口拦截控制时间内的请求



方案三：数据库乐观锁实现幂等性



缺点：操作业务前，需要先查询出当前的versio]]></description><category></category></item><item><title><![CDATA[Linux排查命令]]></title><link>https://blog.youkuaiyun.com/sinat_32023305/article/details/117959880</link><guid>https://blog.youkuaiyun.com/sinat_32023305/article/details/117959880</guid><author>sinat_32023305</author><pubDate>Wed, 16 Jun 2021 15:53:08 +0800</pubDate><description><![CDATA[]]></description><category></category></item><item><title><![CDATA[Hbase架构与读写]]></title><link>https://blog.youkuaiyun.com/sinat_32023305/article/details/115522919</link><guid>https://blog.youkuaiyun.com/sinat_32023305/article/details/115522919</guid><author>sinat_32023305</author><pubDate>Wed, 16 Jun 2021 15:51:01 +0800</pubDate><description><![CDATA[Hbase架构图




client


	Client包含了访问HBase的接口
	
	
	维护对应的cache加速HBase的访问，比如caceh的.META元数据信息
	
zookeeper


	实现HMaster的高可用
	
	
	保存了hbase的元数据信息，是所有的hbase表的寻址入口
	
	
	对HMaster和HRegionServer实现了监控
	
HMaster


	负责启动的时候分配Region到具体的RegionServer，执行行各种管理操作，比如Region的分割和合并。]]></description><category></category></item><item><title><![CDATA[详解tomcat的连接数与线程池]]></title><link>https://blog.youkuaiyun.com/sinat_32023305/article/details/117431705</link><guid>https://blog.youkuaiyun.com/sinat_32023305/article/details/117431705</guid><author>sinat_32023305</author><pubDate>Mon, 31 May 2021 22:42:04 +0800</pubDate><description><![CDATA[前言

在使用tomcat时，经常会遇到连接数、线程数之类的配置问题，要真正理解这些概念，必须先了解Tomcat的连接器（Connector）。

在前面的文章详解Tomcat配置文件server.xml中写到过：Connector的主要功能，是接收连接请求，创建Request和Response对象用于和请求端交换数据；然后分配线程让Engine（也就是Servlet容器）来处理这个请求，并把产生的Request和Response对象传给Engine。当Engine处理完请求后，也会通过Conne...]]></description><category></category></item><item><title><![CDATA[零拷贝（mmap+write、sendfile）]]></title><link>https://blog.youkuaiyun.com/sinat_32023305/article/details/115540331</link><guid>https://blog.youkuaiyun.com/sinat_32023305/article/details/115540331</guid><author>sinat_32023305</author><pubDate>Fri, 09 Apr 2021 11:40:22 +0800</pubDate><description><![CDATA[传统读操作



JAVA用传统方式进行读操作时，整体流程如上图，具体如下：

1、应用程序发起读数据操作，JVM会发起read()系统调用。
2、这时操作系统OS会进行一次上下文切换（把用户空间切换到内核空间）
3、通过磁盘控制器把数据copy到内核缓冲区中，这里的就发生了一次DMACopy
4、然后内核将数据copy到用户空间的应用缓冲区中，发生了一次CPU Copy
5、read调用返回后，会再进行一次上下文切换（把内核空间切换到用户空间）

我们看一下一个读操作，发了2次上下文切换，和2次数据cop]]></description><category></category></item><item><title><![CDATA[大数据入门]]></title><link>https://blog.youkuaiyun.com/sinat_32023305/article/details/114669884</link><guid>https://blog.youkuaiyun.com/sinat_32023305/article/details/114669884</guid><author>sinat_32023305</author><pubDate>Wed, 31 Mar 2021 17:22:31 +0800</pubDate><description><![CDATA[大数据概念基本介绍

Hadoop介绍

Hadoop是一个基于java开发的分布式系统基础架构。用户可以在不了解分布式底层细节的情况下，开发分布式程序。充分利用集群的威力进行高速运算和存储。

Hadoop包括一系列的类shell的命令，可直接操作HDFS以及其他Hadoop支持的文件系统（官方链接：https://hadoop.apache.org/docs/r1.0.4/cn/commands_manual.html）

下图为Hadoop生态圈的一些组件



Hadoop的核心是MapReduc.]]></description><category></category></item><item><title><![CDATA[线程池线程复用源码解析]]></title><link>https://blog.youkuaiyun.com/sinat_32023305/article/details/115250444</link><guid>https://blog.youkuaiyun.com/sinat_32023305/article/details/115250444</guid><author>sinat_32023305</author><pubDate>Fri, 26 Mar 2021 16:54:59 +0800</pubDate><description><![CDATA[先说说使用线程池的好处，比如可以控制线程的数量，节省反复创建线程和销毁线程的开销等，在开发中的使用，一般来说任务量肯定是大于线程数量的，而为了防止出现OOM，都是建议设置相对应业务的合适线程数量。那是在线程池中线程就只有那些，肯定是要做到线程的重复利用，才能执行超过线程的任务量的，那么线程池是怎么做到"线程复用"的呢？

从源码开始逐步分析，从execute()方法开始


//原子变量
private final AtomicInteger ctl = new AtomicInteger(ctlOf(RU]]></description><category></category></item><item><title><![CDATA[内存与地址]]></title><link>https://blog.youkuaiyun.com/sinat_32023305/article/details/114980966</link><guid>https://blog.youkuaiyun.com/sinat_32023305/article/details/114980966</guid><author>sinat_32023305</author><pubDate>Thu, 18 Mar 2021 15:46:49 +0800</pubDate><description><![CDATA[物理地址和物理内存

物理内存不需要我多解释，无非是真实的可见的物理存储器件，就像下面所画的一样，硬件电路通过总线能够依次查找到对应存储单元的值，物理上是高低电位，对应0/1表示。


————————————————-————————————————
|   |   |   |   |   |   |   |   |   A
————————————————-————————————————
|   |   |   |   |   |   |   |   |   B
————————————————-——]]></description><category></category></item><item><title><![CDATA[信号量与管程]]></title><link>https://blog.youkuaiyun.com/sinat_32023305/article/details/114951727</link><guid>https://blog.youkuaiyun.com/sinat_32023305/article/details/114951727</guid><author>sinat_32023305</author><pubDate>Wed, 17 Mar 2021 21:51:58 +0800</pubDate><description><![CDATA[1、信号量#


	信号量机制：

	
		概念：其实就是一个变量，可以用一个信号量来表示系统中某种资源的数量、
		
		
		用户进程通过使用操作系统提供的一对原语来对信号量进行操作，从而方便的实现了进程互斥。
		
		
		这里的一对原语是指wait(S)和signal(S)，也简写为P(S)和V(S)，即申请和释放资源。P、V操作必须成对出现。
		
		
		整数型信号量：

		用一个整数作为信号量，数值表示某种资源数。
			对信号量的操作只有三种：初始化、P操作、V操作。
			不满足让权]]></description><category></category></item><item><title><![CDATA[MapReduce源码解析]]></title><link>https://blog.youkuaiyun.com/sinat_32023305/article/details/114588534</link><guid>https://blog.youkuaiyun.com/sinat_32023305/article/details/114588534</guid><author>sinat_32023305</author><pubDate>Tue, 09 Mar 2021 16:41:30 +0800</pubDate><description><![CDATA[MapReduce编程刨析：

Map

map函数是对一些独立元素组成的概念列表(如单词计数中每行数据形成的列表)的每一个元素进行指定的操作(如把每行数据拆分成不同单词,并把每个单词计数为1),用户可以自定义一个把数据拆分成不同单词并把单词计数为1的映射map函数),事实上每个元素都是被独立操作的,而原始列表没有被修改,因为这里创建了一个新的列表来保存新的答案。


			1

			2

			3

			4

			5

			6

			7

			8

			9

			10

			11

		]]></description><category></category></item><item><title><![CDATA[MapReduce 流程解析]]></title><link>https://blog.youkuaiyun.com/sinat_32023305/article/details/114530408</link><guid>https://blog.youkuaiyun.com/sinat_32023305/article/details/114530408</guid><author>sinat_32023305</author><pubDate>Mon, 08 Mar 2021 14:32:15 +0800</pubDate><description><![CDATA[map 阶段对我们的数据进行分开计算，第二是 reduce 阶段，对 map 阶段计算产生的结果再进行汇总。

还写了一个非常经典的，类似于Java 中 HelloWorld 一样的 WordCount 代码。今天我们就根据这个代码来阐述整个 MapReduce 的运行过程。

先苦口婆心的告诉你，这个知识点是非常非常非常之重要，之前面的 5 家公司，有 3 家公司都问了这个过程，另外两家问了 Yarn 的运行机制，这是后面会去讲的内容，你必须得懂大体的流程是怎么样子，如果能去研究搞清楚每个细节，那当然最好]]></description><category></category></item><item><title><![CDATA[CMS调优参数]]></title><link>https://blog.youkuaiyun.com/sinat_32023305/article/details/113866442</link><guid>https://blog.youkuaiyun.com/sinat_32023305/article/details/113866442</guid><author>sinat_32023305</author><pubDate>Fri, 19 Feb 2021 17:14:16 +0800</pubDate><description><![CDATA[-XX:CMSInitiatingOccupancyFraction和-XX:+UseCMSInitiatingOccupancyOnly

由于CMS收集器不是独占式的回收器，在CMS回收过程中，应用程序仍然在不停地工作。在应用程序工作过程中，又会不断产生垃圾。这些新垃圾在当前CMS回收过程中是无法清除的。同时，因为应用程序没有中断，所以在CMS回收过程中，还应该确保应用程序由足够的内存可用。因此，CMS回收器不会等待堆内存饱和时才进行垃圾回收，而是当堆内存使用率达到某一阈值时便开始进行回收，以确保应用程]]></description><category></category></item><item><title><![CDATA[性能分析 -- 各种毛刺]]></title><link>https://blog.youkuaiyun.com/sinat_32023305/article/details/113063620</link><guid>https://blog.youkuaiyun.com/sinat_32023305/article/details/113063620</guid><author>sinat_32023305</author><pubDate>Tue, 26 Jan 2021 01:35:14 +0800</pubDate><description><![CDATA[前言

大家在观察压测&amp;日常线上请求的平响、cpu使用时通常都能见到n多的毛刺，有的毛刺凸显并且有规律可循，有的杂乱无章，这些毛刺到底是因为什么产生的，对应的解决解决套路是怎么样的？

排队和并发

说毛刺之间先来看一下cpu工作的模式：排队和并发，并发指的是我们在某一时刻同时处理多个任务，而排队是指对于cpu而言任务调度处理的机制。这两者直接决定了任务处理的时延，落到用层面也就是我们的用户体验。
认知cpu底层性能的工具和方法有很多种，如果之前没有相对清晰的认知可以看下这篇文章：https://z]]></description><category></category></item><item><title><![CDATA[Redis升降配后Redisson出错：Unable to send command!]]></title><link>https://blog.youkuaiyun.com/sinat_32023305/article/details/108704328</link><guid>https://blog.youkuaiyun.com/sinat_32023305/article/details/108704328</guid><author>sinat_32023305</author><pubDate>Sat, 28 Nov 2020 10:09:57 +0800</pubDate><description><![CDATA[出现问题

最近在公司开发环境发现一个问题，是这样的，开发环境的机器不断打日志，由于日志的定时清理不及时，导致磁盘满了，然后redis由于没法持久化，所以就连不上了，这个时候发现之后我们重启了redis，然后就回家了。

第二天应用在使用redisson的分布式锁的时候就发现错误：org.redisson.client.WriteRedisConnectionException: Unable to send command!，就是分布式锁的命令无法执行，导致许多业务都出现问题。

一开始以为是redis出]]></description><category></category></item><item><title><![CDATA[jdk版本和垃圾收集器对应关系]]></title><link>https://blog.youkuaiyun.com/sinat_32023305/article/details/108732109</link><guid>https://blog.youkuaiyun.com/sinat_32023305/article/details/108732109</guid><author>sinat_32023305</author><pubDate>Sat, 28 Nov 2020 10:05:21 +0800</pubDate><description><![CDATA[1. 使用jcmd

假设java进程id为1000


# Linux
jcmd 1000 PerfCounter.print |grep gc.collector.*name
# Windows
jcmd 1000 PerfCounter.print |findstr gc.collector.*name


1
	2
	3
	4
以串行收集器(-XX:+UseSerialGC )为例，返回信息如下：


sun.gc.collector.0.name="Copy"
sun.gc.collector.1]]></description><category></category></item><item><title><![CDATA[MySQL优化——force index]]></title><link>https://blog.youkuaiyun.com/sinat_32023305/article/details/107577997</link><guid>https://blog.youkuaiyun.com/sinat_32023305/article/details/107577997</guid><author>sinat_32023305</author><pubDate>Thu, 26 Nov 2020 16:51:47 +0800</pubDate><description><![CDATA[不啰嗦，直接入正题。问题是这样的。请问下面的sql语句，要想加快查询速度，该怎么创建索引？以下，以mysql数据库为准。


select * from test where a=? and b&gt;? order by c limit 0,100

结果可能会出乎你的意料。我们首先准备一下运行环境，然后按照最左前缀原则和explain关键字来进行验证。结果真是颠覆了xjjdog多年的认知。

准备阶段

为了进行验证，我们创建一个简单的数据表。里面有a、b、c三个简单的int字段。


CREATE T]]></description><category></category></item></channel></rss>