<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[shui2104的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/shui2104</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; shui2104]]></copyright><item><title><![CDATA[Java-AQS学习]]></title><link>https://blog.youkuaiyun.com/shui2104/article/details/123042318</link><guid>https://blog.youkuaiyun.com/shui2104/article/details/123042318</guid><author>shui2104</author><pubDate>Mon, 21 Feb 2022 11:14:53 +0800</pubDate><description><![CDATA[AQS 学习记录
​	AQS(AbstractQueuedSynchronizer)抽象同步队列，为线程的同步和等待等操作提供一个基础模板类，JUC并发包中的大部分并发工具类都是基于AQS实现的。
​	AQS的核心是一个state的状态和一个双向链表。state代表着被抢占的锁的状态，0表示锁未被占用，非0的时候代表有线程获取到了锁，是否可以将state从0设置为1，代表着线程是否可以获取锁成功。如果线程没有获取到锁，则会被包装成一个Node节点，存放到一个双向链表中。
​	AQS的部分源码如下：
​
​	]]></description><category></category></item><item><title><![CDATA[Linux管道]]></title><link>https://blog.youkuaiyun.com/shui2104/article/details/121954184</link><guid>https://blog.youkuaiyun.com/shui2104/article/details/121954184</guid><author>shui2104</author><pubDate>Wed, 15 Dec 2021 15:47:33 +0800</pubDate><description><![CDATA[Linux管道"|"
管道
​	进程间通信的的方式之一。在Linux的世界中，一切皆文件。所以管道也是一种文件。实际上，管道是只存在于内存中的文件。常说的管道指的是无名管道，主要用于父进程与子进程之间，或者两个兄弟进程之间。为了解决管道只能在拥有血缘关系的进程间使用的问题，Linux提供了FIFO方式连接进程，FIFO又被称为命名管道(named PIPE)。命名管道是一种特殊的文件类型，归Linux内核管理。
实现机制
​	管道是一个由内核管理的缓冲区(一般为4K大小)。管道的两端分别连接两个进程，一端连]]></description><category></category></item><item><title><![CDATA[关于 command ＞ /dev/null 2＞&1]]></title><link>https://blog.youkuaiyun.com/shui2104/article/details/121796955</link><guid>https://blog.youkuaiyun.com/shui2104/article/details/121796955</guid><author>shui2104</author><pubDate>Wed, 08 Dec 2021 17:45:39 +0800</pubDate><description><![CDATA[关于 command &gt; /dev/null 2&gt;&amp;1
​	程序会处理外部的输入，然后将运算的结果输出到指定的位置。常见的后台运行的程序，输入可能来自于外部的文件，运算的结果也写入到其他文件中。
​	在交互式程序里(比如和Linux交互的bash)，输入通常都是用户的键盘和鼠标，输出则是用户的屏幕。当然也会有将输出的结果存储到文件中的需求，例如，从几个G的log文件中删选感兴趣的部分，这个时候就会用到输入输出的重定向。
文件描述符-FD
​	在Linux的环境下，一切皆文件。通过文件可以]]></description><category></category></item><item><title><![CDATA[ActiveMQ消息持久化]]></title><link>https://blog.youkuaiyun.com/shui2104/article/details/111037584</link><guid>https://blog.youkuaiyun.com/shui2104/article/details/111037584</guid><author>shui2104</author><pubDate>Fri, 11 Dec 2020 15:43:24 +0800</pubDate><description><![CDATA[消息的存储方式
Queue消息模型
​	采用存储采用先进先出（FIFO），一个消息只能被一个消费者消费，当消息被确认消费之后才会被删除。
Topic消息模型
​	每个订阅者获取的消息实际是消息的一个副本，只有一个消息副本会被存储，MQ 提供了一个指针来指向消息存储并且分发消息副本到订阅者，消息直到所有的持久化订阅者都被接收才能被删除。
持久化存储

KahaDB消息存储
AMQ消息存储
JDBC消息存储
内存消息存储

KahaDB
​	默认的持久化方式，KahaDB存储是一个基于文件的快速存储消息，所有的]]></description><category></category></item><item><title><![CDATA[ActiveMQ使用]]></title><link>https://blog.youkuaiyun.com/shui2104/article/details/110880512</link><guid>https://blog.youkuaiyun.com/shui2104/article/details/110880512</guid><author>shui2104</author><pubDate>Tue, 08 Dec 2020 19:47:33 +0800</pubDate><description><![CDATA[​	JMS：Java消息服务(即Java Message Service)，Java平台上有关面向MOM的技术规范。目的是通过提供标准的产生、发送、接收和处理消息的API简化企业应用的开发，类似JDBC和数据库通信方式的抽象。
​	ActiveMQ：ActiveME是基于JMS的开源的消息中间件。提供标准的、面向消息的、能够跨多种语言和系统的应用集成消息中间件。
​	消息：服务之间进行传送的数据单位。可以很简单，比如字符串；也可以是对象等。
JMS中的相关角色
Broker：消息服务器，作为server提供]]></description><category></category></item><item><title><![CDATA[HashMap元素插入和扩容]]></title><link>https://blog.youkuaiyun.com/shui2104/article/details/110306554</link><guid>https://blog.youkuaiyun.com/shui2104/article/details/110306554</guid><author>shui2104</author><pubDate>Sun, 29 Nov 2020 10:41:59 +0800</pubDate><description><![CDATA[HashMap的特点

从JDK1.8开始HashMap的存储结构变成了数组+链表+红黑树，单链表中元素个数超过指定阈值，会转化为红黑树结构存储(提高查询效率)；
从1.7到1.8，在hash冲突的时候，链表的插入将头插法改为尾插法，防止在高并发的情绪出现循环链表；
HashMap的默认数组大小为16，代表hash数组的长度；
默认的加载因子是0.75，代表存入元素大于数组大小*加载因子就进行扩容；
HashMap是线程不安全的，方法都未使用synchronized关键字；
允许key和value值为nul]]></description><category></category></item><item><title><![CDATA[高并发系统的限流]]></title><link>https://blog.youkuaiyun.com/shui2104/article/details/110230265</link><guid>https://blog.youkuaiyun.com/shui2104/article/details/110230265</guid><author>shui2104</author><pubDate>Fri, 27 Nov 2020 14:18:56 +0800</pubDate><description><![CDATA[在开发高并发系统时，有三把利器用来保护系统：缓存、降级和限流。

缓存的目的是提升系统访问速度和增大系统能处理的容量，可谓是抗高并发流量的银弹；
降级是当服务出问题或者影响到核心流程的性能则需要暂时屏蔽掉，待高峰或者问题解决后再打开；
限流：而有些场景并不能用缓存和降级来解决，比如稀缺资源（秒杀、抢购）、写服务（如评论、下单）、频繁的复杂查询（评论的最后几页），因此需有一种手段来限制这些场景的并发/请求量，就是限流。

​	限流的目的是通过对并发访问/请求进行限速或者一个时间窗口内的的请求进行限速来保护系统]]></description><category></category></item><item><title><![CDATA[多线程_Sync 和 Volatile]]></title><link>https://blog.youkuaiyun.com/shui2104/article/details/109959068</link><guid>https://blog.youkuaiyun.com/shui2104/article/details/109959068</guid><author>shui2104</author><pubDate>Sun, 22 Nov 2020 17:47:46 +0800</pubDate><description><![CDATA[Synchronized
​	为啥要用锁？线程安全问题：1.存在共享数据 ；2.多线程共同操作共享数据。
public class T{
  private int count = 0;
  private Object o = new Object();
  public void method(){
    synchronized(o){//任何线程执行下面的代码都需要先获取o的锁
      count--;
      System.out.println(Thread.currentThread]]></description><category></category></item><item><title><![CDATA[Redis雪崩、击穿、穿透]]></title><link>https://blog.youkuaiyun.com/shui2104/article/details/109832077</link><guid>https://blog.youkuaiyun.com/shui2104/article/details/109832077</guid><author>shui2104</author><pubDate>Fri, 20 Nov 2020 00:41:21 +0800</pubDate><description><![CDATA[Redis雪崩、击穿、穿透
缓存预热
问题：服务器启动之后，迅速宕机。
排查特征：请求数量多，主从之间数据吞吐较大，数据同步操作频繁。
​	缓存预热就是系统启动之前，提前将相关的缓存数据直接加载到缓存系统，避免在用户请求的时候，先查询数据库，然后再将数据缓存的问题。用户直接查询实现被缓存的缓存数据。
方案
前期准备

日常例行统计数据访问记录，统计访问频度较高的热点数据。
利用LRU数据删除策略，构建数据存留队列。

准备工作

将统计结果中的数据分类，根据级别，Redis优先加载级别较高的热点数据
利用分]]></description><category></category></item><item><title><![CDATA[Mysql_索引相关优化]]></title><link>https://blog.youkuaiyun.com/shui2104/article/details/109634921</link><guid>https://blog.youkuaiyun.com/shui2104/article/details/109634921</guid><author>shui2104</author><pubDate>Thu, 12 Nov 2020 00:39:54 +0800</pubDate><description><![CDATA[索引的相关优化
索引的基本知识
​	索引能够大大的提高系统的性能。
索引的优点

通过创建唯一性索引，可以保证数据库表中每一行数据的唯一性
大大加快数据的检索速度，这也是创建索引的最主要原因
加快表与表之间的连接，在实现数据的参考完整性方面特别有意义
在使用分组和排序，子句进行数据检索时，同样可以显著减少查询中分组和排序的时间
通过使用索引，可以在查询的过程中，使用优化隐藏器，提高系统的性能。


​	当然索引的维护也需要相应的开销：

创建索引和维护索引需要时间，这种时间随着数据量的增加而增加
索引需要占]]></description><category></category></item><item><title><![CDATA[Mysql_执行计划]]></title><link>https://blog.youkuaiyun.com/shui2104/article/details/109557602</link><guid>https://blog.youkuaiyun.com/shui2104/article/details/109557602</guid><author>shui2104</author><pubDate>Sun, 08 Nov 2020 11:50:17 +0800</pubDate><description><![CDATA[执行计划
​	为了优化Sql语句的执行，需要查看Sql的具体执行过程，以加快Sql语句的执行效率。可以使用explain+sql语句来模拟优化器执行sql查询语句，从而了解mysql是如何处理sql语句的。

执行计划中包含的相关信息：




属性
含义




id
select查询的序列号，表示查询中执行select字句或操作表的顺序


select_type
select语句的类型，主要区分普通查询、联合查询、自查询等


table
表名称


type
访问类型，以何种方式去访问数据


po]]></description><category></category></item><item><title><![CDATA[Mysql_schema和数据类型优化]]></title><link>https://blog.youkuaiyun.com/shui2104/article/details/109555136</link><guid>https://blog.youkuaiyun.com/shui2104/article/details/109555136</guid><author>shui2104</author><pubDate>Sun, 08 Nov 2020 00:53:51 +0800</pubDate><description><![CDATA[数据类型的优化
更小的通常更好
​	应该尽量使用可以正确存储数据的最小的数据类型，更小的数据类型通常占用更少的磁盘空间、内存和cpu缓存，并且处理时需要的cpu周期更少，所以处理的更快。但是要确保没有低估需要存储的值的范围。如果无法去儿哪个数据类型，就选择你认为不会超过范围的最小类型即可。
简单就好
​	简单数据类型的操作通常需要更少的cpu处理周期。例如：

整型比字符串代价更低，因为字符比较比整型比较更复杂
使用mysql自建类型而不是字符串来存储日期和时间
用整型存储IP地址(使用mysql的INET]]></description><category></category></item><item><title><![CDATA[Mysql_show_profile]]></title><link>https://blog.youkuaiyun.com/shui2104/article/details/109482063</link><guid>https://blog.youkuaiyun.com/shui2104/article/details/109482063</guid><author>shui2104</author><pubDate>Tue, 03 Nov 2020 23:44:33 +0800</pubDate><description><![CDATA[show profile
​	show profile是Mysql提供的分析当前会话中sql语句执行的资源消耗情况的工具。可用于sql调优的测量。默认关闭，并保持最近15此的运行结果。
分析过程


开启show profile

此方式开启之后只存在于当前会话，可以通过修改全局配置set global profiling = on，来开启。


通过show profiles查看结果

上图中，有每一条sql的执行时间。


可以通过show profile针对具体的某一条sql进行具体的分析查看。

上]]></description><category></category></item><item><title><![CDATA[Redis删除策略]]></title><link>https://blog.youkuaiyun.com/shui2104/article/details/108819770</link><guid>https://blog.youkuaiyun.com/shui2104/article/details/108819770</guid><author>shui2104</author><pubDate>Sun, 27 Sep 2020 00:23:51 +0800</pubDate><description><![CDATA[删除策略
过期数据
​	Redis是一种内存级数据库，所有数据均存放在内存中，内存中的数据可以通过TTL指令获取其状态：

XX:具有时效性的数据
-1:永久有效的数据
-2:已经过期的数据或被删除的数据或未定义的数据

时效性数据的存储结构


删除策略是对expires的维护。

删除数据的策略
定时删除
​	创建一个定时器，当key设置有过期时间，且过期时间到达时，由定时器任务立即执行对键的删除操作。

当前时间和expires中对过期时间一致时，定时器触发删除。

​	优点：节省内存，到时间就删除，]]></description><category></category></item><item><title><![CDATA[Redis-主从复制]]></title><link>https://blog.youkuaiyun.com/shui2104/article/details/108819729</link><guid>https://blog.youkuaiyun.com/shui2104/article/details/108819729</guid><author>shui2104</author><pubDate>Sun, 27 Sep 2020 00:17:23 +0800</pubDate><description><![CDATA[Redis-主从复制
​	为了避免单点Redis服务器故障，准备多台服务器，相互连通。将数据多个副本保存在不同的服务器上，连接在一起，并保证数据是同步的。即使其中某一台服务器宕机，其他服务器依然可以继续提供服务，实现Redis的高可用，同时实现数据冗余备份。

​	主从复制即将master中的数据有效及时的复制到slave中。一个master可以对应多个slave，一个slave只能对应一个master。

master：复制写数据，执行写操作时，将出现变化的数据自动同步到slave。读数据的操作基本可忽略]]></description><category></category></item><item><title><![CDATA[Redis持久化和事务]]></title><link>https://blog.youkuaiyun.com/shui2104/article/details/108671343</link><guid>https://blog.youkuaiyun.com/shui2104/article/details/108671343</guid><author>shui2104</author><pubDate>Fri, 18 Sep 2020 19:13:50 +0800</pubDate><description><![CDATA[Redis持久化和事务
持久化
​	利用永久性存储介质将数据进行保存，在特定的时间将保存的数据进行恢复的工作机制称为持久化。防止数据的意外丢失，确保数据安全性。
​	Redis提供了持久化的机制，分别是

RDB(Redis DataBase)：将当前数据状态进保存，快照形式，存储数据结果，存储格式简单，关注点在数据。
AOF(Append Only File)：将数据的操作过程进行保存，日志形式，存储操作过程，存储格式复杂，关注点在数据的操作过程。

RDB
​	RDB持久化是指在指定的时间间隔内将内存中]]></description><category></category></item><item><title><![CDATA[Redis入门]]></title><link>https://blog.youkuaiyun.com/shui2104/article/details/108671285</link><guid>https://blog.youkuaiyun.com/shui2104/article/details/108671285</guid><author>shui2104</author><pubDate>Fri, 18 Sep 2020 19:07:37 +0800</pubDate><description><![CDATA[Redis_入门
​	Redis(REmote DIctionary Server)是C语言开发的开源的高性能键值对(key-value)数据库。

​	NoSQL(NoSQL = Not Only SQL ),指非关系型的数据库。是对不同于传统的关系型数据库的数据库管理系统的统称。




类型
部分代表
特点




列存储
Hbase、Cassandra、Hypertable
顾名思义，是按列存储数据的。最大的特点是方便存储结构化和半结构化数据，方便做数据压缩，对针对某一列或者某几列的查询有非常大的I]]></description><category></category></item><item><title><![CDATA[SpringMVC_2异常处理和拦截器]]></title><link>https://blog.youkuaiyun.com/shui2104/article/details/108504612</link><guid>https://blog.youkuaiyun.com/shui2104/article/details/108504612</guid><author>shui2104</author><pubDate>Wed, 09 Sep 2020 23:19:19 +0800</pubDate><description><![CDATA[SpringMVC_异常处理和拦截器
文件上传
SpringMVC文件上传
​	DispatcherServlet中定义了一个MultipartResolver属性，如果用户配置了该Bean，启动容器的时候，会自动注入参数，如果用户没有配置，则默认为null。当DispaterServlet收到请求时，它的checkMultipart()方法会调用MultipartResolver的isMultipart()方法判断请求中是否包含了文件且multipartResolver属性存在实例。如果满足条件，则调用M]]></description><category></category></item><item><title><![CDATA[SpringMVC_1入门]]></title><link>https://blog.youkuaiyun.com/shui2104/article/details/108504593</link><guid>https://blog.youkuaiyun.com/shui2104/article/details/108504593</guid><author>shui2104</author><pubDate>Wed, 09 Sep 2020 23:18:25 +0800</pubDate><description><![CDATA[SpringMVC_1

三层架构

表现层：通常所说的web层。负责接收客户端请求，向客户端响应结果。通常客户端使用http协议请求web层，web层需要接受请求数据并完成响应。
业务层：通常所说的service层。负责业务逻辑的处理，和开发项目的需求息息相关。web层依赖业务层，但是业务层不依赖web层。业务层在业务处理可能依赖持久层。对数据持久化需要保证事务一致性(也就是事务应该放在业务层来控制)。
持久层：通常指dao层。负责数据持久化，包括数据库和数据访问层，数据库是对数据进行持久化的载体，数据访]]></description><category></category></item><item><title><![CDATA[SpringJDBCTemplate和事务控制]]></title><link>https://blog.youkuaiyun.com/shui2104/article/details/108370130</link><guid>https://blog.youkuaiyun.com/shui2104/article/details/108370130</guid><author>shui2104</author><pubDate>Wed, 02 Sep 2020 20:50:18 +0800</pubDate><description><![CDATA[Spring_JDBCTemplate和事务控制
JDBCTemplate

​	它是Spring提供的一个对象，是对原始的Jdbc Api对象的简单封装。Spring提供了很多操作模版类。

操作关系型数据库：JdbcTemplate、HibernateTemplate
操作nosql数据库：RedisTemplate
操作消息队列：JmsTemplate

JdbcTemplate作用
​	用于和数据库交互，实现对表的CRUD操作。
JdbcTemplate的获取
&lt;?xml version="1]]></description><category></category></item></channel></rss>