<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[V_A_L的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/V_A_L</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; V_A_L]]></copyright><item><title><![CDATA[JAVA多线程&线程池]]></title><link>https://blog.youkuaiyun.com/V_A_L/article/details/124645744</link><guid>https://blog.youkuaiyun.com/V_A_L/article/details/124645744</guid><author>V_A_L</author><pubDate>Sun, 08 May 2022 11:50:05 +0800</pubDate><description><![CDATA[JAVA多线程&amp;线程池

懂线程者，更胜于面试，更优于性能，与君共勉；

线程

进程和线程：一个进程包括多个线程。把视频软件理解为一个进程，而把视频+音频+弹幕可以理解为是视频软件中互相协作的三个线程；
并行与并发：并行指的是多个线程同时执行各自的任务；并发则是指，单个线程抢占时间片，高速来回切换执行不同的任务。表面上多个线程持续运行，实际上单个线程走走停停。

线程的状态
1.1 new() ，创建线程，该线程进入新建状态；
1.2 start(),   创建线程后，调用线程的start()方法]]></description><category></category></item><item><title><![CDATA[简述五种常见的IO模式]]></title><link>https://blog.youkuaiyun.com/V_A_L/article/details/124003293</link><guid>https://blog.youkuaiyun.com/V_A_L/article/details/124003293</guid><author>V_A_L</author><pubDate>Wed, 06 Apr 2022 23:32:55 +0800</pubDate><description><![CDATA[一次IO读取操作，分为几个步骤：

用户线程发送read()请求，从用户态切换到内核态；
操作系统接收到请求后，通过DMA将数据从磁盘copy到内核缓冲区；
然后CPU从内核态切换到用户态，将内核缓冲区的数据copy到用户空间；


简单来说，一次IO操作分为数据准备与数据复制两个过程；
阻塞IO（BIO）
所谓阻塞IO，即用户线程发起io读取请求时，操作系统会根据请求准备对应数据，此时，用户线程就会处于阻塞状态。直到操作系统将数据准备完毕并且将数据copy到用户空间，此时用户线程才会接触阻塞状态；

非.]]></description><category></category></item><item><title><![CDATA[零拷贝-易懂讲解]]></title><link>https://blog.youkuaiyun.com/V_A_L/article/details/123910448</link><guid>https://blog.youkuaiyun.com/V_A_L/article/details/123910448</guid><author>V_A_L</author><pubDate>Fri, 01 Apr 2022 23:16:44 +0800</pubDate><description><![CDATA[零拷贝-易懂讲解
相信大家平时在学习类似Kafka,netty等技术时都会经常见到“零拷贝”这个词，也知道“零拷贝”的出现会让网络数据传输效率更高，那么，本着知其然并知其所以然的原则，今天一起来了解一下它倒是是个啥玩意儿
引言

Linux的设计哲学之一就是：对不同的操作赋予不同的执行等级，就是所谓特权的概念，即与系统相关的一些特别关键的操作必须由最高特权的程序来完成。
Intel的X86架构的CPU提供了0到3四个特权级，数字越小，特权越高，Linux操作系统中主要采用了0和3两个特权级，分别对应的就是内]]></description><category></category></item><item><title><![CDATA[java-性能优化篇]]></title><link>https://blog.youkuaiyun.com/V_A_L/article/details/123390866</link><guid>https://blog.youkuaiyun.com/V_A_L/article/details/123390866</guid><author>V_A_L</author><pubDate>Thu, 10 Mar 2022 00:13:26 +0800</pubDate><description><![CDATA[java-性能优化篇

因为一次公司倒闭，感悟到人生不容易，选择以物联网做副业，从事物联网卡代理，希望认识更多好朋友，合作共赢.
(当你身上有了担子，你就会发现，收入来源太单一，会使你没有安全感！)

公司项目已经完成阶段性上线，目前正在对残留的一些性能问题进行优化，今天针对优化过程中的一系列流程进行整理，希望能帮助到各位。我们单纯的先从软件层面出发（硬件的说实话，不是很good at）
第一步：分析性能问题
首先，可以依据类似听云这类全链路日志，可以看到整个接口的调用链路以及响应时间。每个sql语句的耗时]]></description><category></category></item><item><title><![CDATA[ThreadLocal及其扩展]]></title><link>https://blog.youkuaiyun.com/V_A_L/article/details/122728181</link><guid>https://blog.youkuaiyun.com/V_A_L/article/details/122728181</guid><author>V_A_L</author><pubDate>Fri, 28 Jan 2022 10:52:53 +0800</pubDate><description><![CDATA[ThreadLocal及其扩展

ThreadLocal是JDK提供的，是线程的本地变量，如果创建一个ThreadLocal变量，那么所有访问这个变量的线程都会有这个变量的一个本地副本。
ThreadLocal可以理解为是一个全局的初始变量，但是每个线程访问该变量的后续操作，都是对自身副本的操作,规避了线程安全问题。

一. ThreadLocal
1.Thread,ThrealLocal,ThrealLocalMap的关系？
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-F]]></description><category></category></item><item><title><![CDATA[随笔（大数据）]]></title><link>https://blog.youkuaiyun.com/V_A_L/article/details/119941701</link><guid>https://blog.youkuaiyun.com/V_A_L/article/details/119941701</guid><author>V_A_L</author><pubDate>Thu, 26 Aug 2021 22:19:57 +0800</pubDate><description><![CDATA[很久没更新博客了，不是说不没坚持，是最近发生的事情比较多。今天不讨论具体记录，简单总结这段时间的事情，和未来一段时间的规划。

朝花夕拾-旧事重提
这接近一个月的时间，换了工作，搬了宿舍，吐槽了房地产，怒怼了“好凉凉”。。。
简单说说
主要说工作吧，新的公司从事教育行业，目前所在的项目组任务主要在万亿级的数据报表统计汇总。也是在这样一个功能模块驱使下，开始接触了大数据。
起初—充满好奇
面对一个全新的领域-大数据，深知是机遇也是挑战。疯狂百度了一波大数据Spark生态圈。
存储—hdfs，
计算—mr，
.]]></description><category></category></item><item><title><![CDATA[feign异步调用丢失上下文]]></title><link>https://blog.youkuaiyun.com/V_A_L/article/details/119273843</link><guid>https://blog.youkuaiyun.com/V_A_L/article/details/119273843</guid><author>V_A_L</author><pubDate>Sat, 31 Jul 2021 12:12:43 +0800</pubDate><description><![CDATA[微服务架构下，通过feign进行服务间的调用。但是某些场景下，为了用户体验，及时响应，某些耗时的附加操作需要开启异步任务来调用，但是在这种异步调用方式下，可能会存在上下文丢失的情况。


解决方案：


将主方法的上下文作为参数传入

主方法

  /**
     * 导入数据
     *
     * @param file
     * @param customerId
     * @return
     */
    @Override
    public void listImport.]]></description><category></category></item><item><title><![CDATA[异步任务读取不到已插入的数据]]></title><link>https://blog.youkuaiyun.com/V_A_L/article/details/119273830</link><guid>https://blog.youkuaiyun.com/V_A_L/article/details/119273830</guid><author>V_A_L</author><pubDate>Sat, 31 Jul 2021 12:10:40 +0800</pubDate><description><![CDATA[异步任务，一般使用于耗时的附加功能，如果在主方法的事务中向数据库插入数据，此时调用异步任务读取主事务插入的数据，可能会存在查询不到数据的问题。

发生场景：

上述场景中，主方法向用户表中插入数据，但是剩余的业务逻辑还未执行结束，此时开启一个异步线程，异步任务中的业务逻辑是读取主方法新增的user，并根据user的邮箱发送消息；此时如果主方法中的事务还未提交，那么异步任务中读取新增的user可能会出现读取不到的情况。
解决方式：


判断主方法中，业务执行结束并且事务提交过程需要多久，然后在异步方法中让线.]]></description><category></category></item><item><title><![CDATA[JavaAPI操作Zookeeper连接报错]]></title><link>https://blog.youkuaiyun.com/V_A_L/article/details/119192007</link><guid>https://blog.youkuaiyun.com/V_A_L/article/details/119192007</guid><author>V_A_L</author><pubDate>Wed, 28 Jul 2021 22:50:49 +0800</pubDate><description><![CDATA[JavaAPI操作Zookeeper连接报错
测试代码如下：
public class ZKClient {
        String connectString ="47.98.183.176:2181"; //ZKip地址+客户端通信端口号
        int sessionTimeOut = 10000; //会话超时时间，该时间内，如果没有连接成功，则超时
        ZooKeeper zkClient;

    @Test
    public void createZnode()]]></description><category></category></item><item><title><![CDATA[Zookeeper基础讲解]]></title><link>https://blog.youkuaiyun.com/V_A_L/article/details/119147001</link><guid>https://blog.youkuaiyun.com/V_A_L/article/details/119147001</guid><author>V_A_L</author><pubDate>Tue, 27 Jul 2021 16:28:21 +0800</pubDate><description><![CDATA[简介：
ZooKeeper是一个分布式的，开放源码的分布式应用程序协调服务，可以通过ZooKeeper进行统一命名服务、统一配置、集群管理、分布式锁理、负载均衡等，简单来说，Zookeeper=文件系统+监听通知机制。
为了便于理解，可以这么解读：1. ZK内部拥有一个树状的内存模型，每个节点称为znode，可以用来存储少量的节点数据，比如节
点路径以及关联的子节点列表；
​													 2.  集群中如果某个服务器节点下线，不提供服务了，ZK可以将这类信息通知到所有监听了这个节点					.]]></description><category></category></item><item><title><![CDATA[JAVA锁-各种锁]]></title><link>https://blog.youkuaiyun.com/V_A_L/article/details/118916461</link><guid>https://blog.youkuaiyun.com/V_A_L/article/details/118916461</guid><author>V_A_L</author><pubDate>Mon, 19 Jul 2021 22:55:20 +0800</pubDate><description><![CDATA[前提了解：


CAS算法：
Compare And Swap（比较与交换），是一种无锁算法，设置到3个值：V（需要操作的内存值）、A（需要与操作的内存
值进行比较的值）、B（写入的新值），只有当V=A的时候，才会将B更新到V；
举个例子理解，当我们要重新设置某某账户的密码时，会让你输入原始密码验证是否正确，只有正确的时候，新密码才会设置成功；此处就是将手动输入的原始密码与数据库保存的原始密码匹配是否一致，如果一致，则更新新密码；如果更新失败，会循环读取比较



CAS存在的问题：

ABA问题。拿上述例]]></description><category></category></item><item><title><![CDATA[Redis过期删除以及内存淘汰策略]]></title><link>https://blog.youkuaiyun.com/V_A_L/article/details/118864016</link><guid>https://blog.youkuaiyun.com/V_A_L/article/details/118864016</guid><author>V_A_L</author><pubDate>Sat, 17 Jul 2021 22:50:32 +0800</pubDate><description><![CDATA[近期面试，游走于刀锋之上，闻题：key过期如何删除，再之，数据满后何解？研习之，遂记之。



Redis对key设置过期时间，到期后，如何删除？




定时删除
设置某个key 的过期后，同时创建一个定时器，让定时器判断满足过期时间，满足立即删除。

优势: 采用立即删除,能及时进行内存清理,避免大量无效key存在内存中;
劣势:如果过期的key较多,对cpu会造成一定的压力.



惰性删除
key过期时, 不会立即删除, 而是在获取key时判断key是否过期, 如果过期, 获取时直接删除.

优势.]]></description><category></category></item><item><title><![CDATA[Redis缓存问题]]></title><link>https://blog.youkuaiyun.com/V_A_L/article/details/118523787</link><guid>https://blog.youkuaiyun.com/V_A_L/article/details/118523787</guid><author>V_A_L</author><pubDate>Tue, 06 Jul 2021 16:29:39 +0800</pubDate><description><![CDATA[1. 缓存穿透

缓存穿透指的是，高并发情况下，访问redis缓存中的某个key，key不存在，然后请求落入mysql发现依旧没有找到对应的值；此时大量的请求会直接落入mysql，出现mysql服务崩溃。

解决方案：

布隆过滤器；
缓存空对象，请求某个key，如果key不存在，则赋值一个空对象；

2. 缓存击穿

缓存击穿指的是，大量请求落在某个热点数据，一直获取redis中的某个key，如果key过期，还未进行新的赋值操作，大量的请求会直接落在mysql服务器上。

解决方案：

设置热点数据永不过]]></description><category></category></item><item><title><![CDATA[Redis主从复制与哨兵模式]]></title><link>https://blog.youkuaiyun.com/V_A_L/article/details/118521290</link><guid>https://blog.youkuaiyun.com/V_A_L/article/details/118521290</guid><author>V_A_L</author><pubDate>Tue, 06 Jul 2021 15:18:12 +0800</pubDate><description><![CDATA[Redis主从复制
1. 架构模型

主从复制模式至少要有3个redis服务器节点，每个redis服务器启动时，都默认是主机，所以只需要对从机进行配置所属主机。集群环境中，主机只做写入，从机只做读取。



2. 实现方式

由于服务器环境有限，测试将会在一个服务器启动多个redis节点模拟redis集群，实际工作环境中，redis服务端会运行在不同的服务器上。



准备工作：(以下文件仅在同服务器多节点测试使用，实际工作场景，多个服务器不需要配置，只需要配置从机所属主机的ip地址和端口号)


找到re]]></description><category></category></item><item><title><![CDATA[Redis配置文件与持久化方式]]></title><link>https://blog.youkuaiyun.com/V_A_L/article/details/118496083</link><guid>https://blog.youkuaiyun.com/V_A_L/article/details/118496083</guid><author>V_A_L</author><pubDate>Mon, 05 Jul 2021 18:38:09 +0800</pubDate><description><![CDATA[基本配置


redis.conf，配置不区分大小写；
units are case insensitive so 1GB 1Gb 1gB are all the same.



includes，可以引入其他配置文件；
include /path/to/other.conf



bind ,绑定可以访问的ip，默认绑定本机，注销及所有ip都可以访问；
bind 127.0.0.1



protected-mode yes #设置保护模式打开



port，设置运行端口，默认6379
port 63]]></description><category></category></item><item><title><![CDATA[Redis事务原子性]]></title><link>https://blog.youkuaiyun.com/V_A_L/article/details/118407358</link><guid>https://blog.youkuaiyun.com/V_A_L/article/details/118407358</guid><author>V_A_L</author><pubDate>Fri, 02 Jul 2021 10:39:25 +0800</pubDate><description><![CDATA[Redis事务原子性

事务，是一系列的逻辑运行操作。事务具有ACID，原子性，一致性，隔离性，持久性。但是，作为非关系型数据库的Redis，事务是一组命令集，针对这组命令集，事务还是否具有原子性？

实例操作

分析以上指令：

开启事务，键入正确的指令入队，其中加入一些错误的指令lpush name cz,最终执行事务。结果发现，正确的指令都正常执行，只有错误的执行抛出了异常信息。事务执行后，针对事务中创建的list数据，依旧可以获取到值。说明整个事务并没有因为某个指令的错误而全部失败。因此，Redis]]></description><category></category></item><item><title><![CDATA[Redis分布式锁]]></title><link>https://blog.youkuaiyun.com/V_A_L/article/details/118191180</link><guid>https://blog.youkuaiyun.com/V_A_L/article/details/118191180</guid><author>V_A_L</author><pubDate>Thu, 24 Jun 2021 16:35:01 +0800</pubDate><description><![CDATA[Redis分布式锁
1. 引入jar包
        &lt;dependency&gt;
            &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt;
            &lt;artifactId&gt;spring-boot-starter-data-redis&lt;/artifactId&gt;
        &lt;/dependency&gt;

2. 分布式锁实现


setnx命令
set if not e]]></description><category></category></item><item><title><![CDATA[@Async异步任务]]></title><link>https://blog.youkuaiyun.com/V_A_L/article/details/118151043</link><guid>https://blog.youkuaiyun.com/V_A_L/article/details/118151043</guid><author>V_A_L</author><pubDate>Wed, 23 Jun 2021 13:23:29 +0800</pubDate><description><![CDATA[@Async异步任务

在日常项目中经常会遇到一些耗时的附加功能，不影响程序主功能。比如说：发送邮件，下载Excel任务之类；如果需要用户在界面等待当前功能执行结束才能继续做接下来的操作，体验感时绝对很差的，这个时候，就需要开启异步任务，让用户无感知的进行操作。

模拟不使用异步任务

控制器代码

//test控制器
@RequestMapping("/user")
@RestController
@ResponseBody
public class Controller {

    @Autowire]]></description><category></category></item><item><title><![CDATA[URL下载网络资源]]></title><link>https://blog.youkuaiyun.com/V_A_L/article/details/118088735</link><guid>https://blog.youkuaiyun.com/V_A_L/article/details/118088735</guid><author>V_A_L</author><pubDate>Mon, 21 Jun 2021 16:03:52 +0800</pubDate><description><![CDATA[今天碰到这个功能，就正好整理一下很久很久之前写socket通信时，关于信息、资源发送读取的部分代码。

 		URL url = new URL("http://xxx.jpg"); //网络资源地址
        URLConnection connection = url.openConnection();  //打开网络连接
        InputStream inputStream = connection.getInputStream(); //读取图片
        FileOutpu.]]></description><category></category></item><item><title><![CDATA[Mysql索引]]></title><link>https://blog.youkuaiyun.com/V_A_L/article/details/117994820</link><guid>https://blog.youkuaiyun.com/V_A_L/article/details/117994820</guid><author>V_A_L</author><pubDate>Thu, 17 Jun 2021 15:33:55 +0800</pubDate><description><![CDATA[Mysql索引
常闻索引，知其然，不知其所以然，遂微究之。

数据库查询数据的瓶颈在于磁盘的IO读取，所以数据库设计索引时，需要考虑尽量减少磁盘的IO读取次数。

Mysql底层数据结构

索引的作用是用来做数据的快速检索，而快速检索的实现的本质是数据结构，通过选择不同的数据结构，实现各种数据快速检索。

1. Hash
哈希算法：也叫散列算法，就是把任意值(key)通过哈希函数变换为固定长度的key地址，通过这个地址定位具体的数据结构。
举例:从用户表中查询id为7的用户信息,select * from ]]></description><category></category></item></channel></rss>