<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[a779868946的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/a779868946</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; a779868946]]></copyright><item><title><![CDATA[高频面试题：如何保证数据库和es数据一致性]]></title><link>https://blog.youkuaiyun.com/a779868946/article/details/147523547</link><guid>https://blog.youkuaiyun.com/a779868946/article/details/147523547</guid><author>a779868946</author><pubDate>Sat, 26 Apr 2025 00:00:04 +0800</pubDate><description><![CDATA[在实际项目开发中，我们经常将MySQL作为业务数据库，ES作为查询数据库，用来实现读写分离，缓解MySQL数据库的查询压力，应对海量数据的复杂查询，这其中有一个很重要的问题，就是如何实现MySQL数据库和ES的数据同步，今天和大家聊聊MySQL和ES数据同步的各种方案，我们先看看下面5种常用的数据同步。影响性能，写入两个存储，响应时间变长，本来 MySQL 的性能不是很高，再加一个 ES，系统的性能必然会下降。要保持分布式数据的一致性，这个问题其实是一样的，关于redis的一致性问题在。]]></description><category></category></item><item><title><![CDATA[经典大厂面试题——缓存穿透、缓存击穿、缓存雪崩]]></title><link>https://blog.youkuaiyun.com/a779868946/article/details/147495211</link><guid>https://blog.youkuaiyun.com/a779868946/article/details/147495211</guid><author>a779868946</author><pubDate>Fri, 25 Apr 2025 00:58:39 +0800</pubDate><description><![CDATA[这里有两种处理方案，第一种就是拿不到锁就阻塞等待在这里，等待一段时间我们再去取缓存，但是在生产环境，我们一般是不会这样去用的，因为这里存在一个非常大的风险，就是我们系统既然用到了缓存，那这个请求量应该是比较大的，那你要阻塞在这里，那阻塞多久呢，那阻塞的这个时间会不会大量请求夯在这里，把整个RPC的连接池给打爆，针对这种情况我们更多的是采取返回一个默认值的方式，而不是让它直接阻塞等待在这里。，所以说他查询缓存不存在，就直接去查数据库，导致我们的数据库的压力非常大，这就是缓存穿透的场景。在业界也有比较成熟的。]]></description><category></category></item><item><title><![CDATA[回溯算法：一个模板解决排列组合问题]]></title><link>https://blog.youkuaiyun.com/a779868946/article/details/142741091</link><guid>https://blog.youkuaiyun.com/a779868946/article/details/142741091</guid><author>a779868946</author><pubDate>Mon, 07 Oct 2024 16:02:54 +0800</pubDate><description><![CDATA[以n = 4, k = 2为例，如下图所示，从上往下看，在第一层的时候，可以选择1，2，3，4，假设第一个选定为1（将选定的元素存入path中，即path=[1]），那么第二层的元素只能选择2，3，4（要保证不相等，不能重复），当第二层的元素选择2，即path=[1,2]时，第二个元素选定后，此时path的长度等于k的长度，一个排列结果就计算出来了，加入到结果result中去，接着回溯，按照同样的逻辑运行下去，最后所有组合结果。有的同学会问，既然回溯法并不是高效的算法，为什么还要用它？]]></description><category></category></item><item><title><![CDATA[12306全球最大票务系统与Gemfire介绍]]></title><link>https://blog.youkuaiyun.com/a779868946/article/details/139785848</link><guid>https://blog.youkuaiyun.com/a779868946/article/details/139785848</guid><author>a779868946</author><pubDate>Tue, 18 Jun 2024 23:06:38 +0800</pubDate><description><![CDATA[只有程序员才知道，一个每天完成超过1500万个订单，承受近1500亿次点击的系统到底有多难，在高峰阶段的时候，平均每秒就要承受170多万次的点击，面对铁路运输这种特殊的运算模式，也能够保证全国人民在短时间内抢到回家的票，12306就是在无数国人的苛责和质疑中，创造了一个世界的奇迹。你可以调侃，可以批评，但不能否认12306背后所做出的所有努力！]]></description><category></category></item><item><title><![CDATA[docker安装redis]]></title><link>https://blog.youkuaiyun.com/a779868946/article/details/132527180</link><guid>https://blog.youkuaiyun.com/a779868946/article/details/132527180</guid><author>a779868946</author><pubDate>Sun, 27 Aug 2023 20:23:18 +0800</pubDate><description><![CDATA[这个是关键配置，让redis不是无配置启动，而是加载容器内的conf文件，最终加载的是宿主机上的文件。到redis官网下载一下压缩包， http://www.redis.cn/download.html。：把宿主机配置好的redis.conf放到容器内的这个位置中。：把redis持久化的数据在宿主机内显示，做数据备份。：把容器内的6379端口映射到宿主机6666端口。一个是用来放配置文件的，一个是用来放数据文件的。至此就全部安装完毕了，小伙伴们快去试试吧~查看一下镜像已经拉下来了。]]></description><category></category></item><item><title><![CDATA[一篇文章搞懂MVCC]]></title><link>https://blog.youkuaiyun.com/a779868946/article/details/132394602</link><guid>https://blog.youkuaiyun.com/a779868946/article/details/132394602</guid><author>a779868946</author><pubDate>Sun, 20 Aug 2023 18:42:16 +0800</pubDate><description><![CDATA[在 MySQL 中，事务支持是在引擎层实现的。MySQL 是一个支持多引擎的系统，但并不是所有的引擎都支持事务。比如 MySQL 原生的 MyISAM 引擎就不支持事务，这也是 MyISAM 被 InnoDB 取代的重要原因之一。事务有四个特性，ACID，即原子性、一致性、隔离性和持久性。开启事务用。]]></description><category></category></item><item><title><![CDATA[介绍Sping Boot的5个扩展点]]></title><link>https://blog.youkuaiyun.com/a779868946/article/details/132118512</link><guid>https://blog.youkuaiyun.com/a779868946/article/details/132118512</guid><author>a779868946</author><pubDate>Sat, 05 Aug 2023 12:49:01 +0800</pubDate><description><![CDATA[定义了这8个初始化器，那一定是有地方在调它们的，不然怎么会打印出来呢，那具体在什么地方调的，我们在自己的初始化器的地方打断点，看到已经进来了，然后看下方的堆栈信息，这个就是调用的地方。最后我来把扩展点图补充完整，如下所示，很清晰明了，在什么时候调用了什么，我们自己开发的时候结合应用场景，在什么时候要干什么事，就知道要创建什么类型的扩展点了。和初始化器一样，现在我们自定义两个监听器，一个是Starting，一个是Started，括号里面的是泛型，这个是一定要写的，]]></description><category></category></item><item><title><![CDATA[Nacos Java Api和Namespace介绍]]></title><link>https://blog.youkuaiyun.com/a779868946/article/details/129906993</link><guid>https://blog.youkuaiyun.com/a779868946/article/details/129906993</guid><author>a779868946</author><pubDate>Sun, 02 Apr 2023 09:26:03 +0800</pubDate><description><![CDATA[这个是nacos的架构图，https://nacos.io/en-us/docs/architecture.html在1.x的 Nacos 版本中服务端只支持 http 协议，后来为了提升性能在2.x版本引入了谷歌的 grpc，grpc 是一款长连接协议，极大的减少了 http 请求频繁的连接创建和销毁过程，能大幅度提升性能，节约资源。据官方测试，Nacos服务端 grpc 版本，相比 http 版本的性能提升了9倍以上。]]></description><category></category></item><item><title><![CDATA[从二进制和源码安装Nacos]]></title><link>https://blog.youkuaiyun.com/a779868946/article/details/129644652</link><guid>https://blog.youkuaiyun.com/a779868946/article/details/129644652</guid><author>a779868946</author><pubDate>Sat, 18 Mar 2023 22:56:19 +0800</pubDate><description><![CDATA[本文介绍了两种启动nacos的方法，二进制安装是我们项目中实际使用的方式，源码安装是我们学习源码时候的启动方式，大家快动手操作下吧。。。]]></description><category></category></item><item><title><![CDATA[初识Jenkins]]></title><link>https://blog.youkuaiyun.com/a779868946/article/details/126594573</link><guid>https://blog.youkuaiyun.com/a779868946/article/details/126594573</guid><author>a779868946</author><pubDate>Mon, 29 Aug 2022 23:19:24 +0800</pubDate><description><![CDATA[发现标题也成功的改掉了，多了一个1[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4Q9vKRwQ-1661786001648)(https://p1-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/5abc903bb011480595063fbe8fe4e243~tplv-k3u1fbpfcp-watermark.image?)]演示圆满成功。............]]></description><category></category></item><item><title><![CDATA[从Architecture带你认识JVM]]></title><link>https://blog.youkuaiyun.com/a779868946/article/details/125982816</link><guid>https://blog.youkuaiyun.com/a779868946/article/details/125982816</guid><author>a779868946</author><pubDate>Mon, 25 Jul 2022 21:03:22 +0800</pubDate><description><![CDATA[JVM就是javavirtualmachine，java虚拟机JVM就是将java源文件编译成字节码文件，然后加载到虚拟机，JVM在执行字节码时，最终把字节码解释成具体平台上的机器指令执行。这个就是一次编写，到处运行。JVM是一种java虚拟机规范，很多厂商进行了实现，可以通过java-version命令查看OracleIBMJ9VMAliTaobaoVMZualZing当然最常见的就是HotSpot了https。...]]></description><category></category></item><item><title><![CDATA[一条更新SQL语句是如何执行的？]]></title><link>https://blog.youkuaiyun.com/a779868946/article/details/125033643</link><guid>https://blog.youkuaiyun.com/a779868946/article/details/125033643</guid><author>a779868946</author><pubDate>Sun, 29 May 2022 17:29:38 +0800</pubDate><description><![CDATA[前言
在上篇文章《一条查询SQL语句是如何执行的？》 介绍了一些常用组件，一般是经过连接器、分析器、优化器、执行器等功能模块，最后到达存储引擎。本文是介绍一条更新语句如何执行，还会介绍一写其他组件，现在让我们开始吧。
Buffer Pool
我们知道在执行 sql 对某一行进行操作时，每次对磁盘操作其实是很慢的。为了解决这个问题，我们设置了一个缓冲池。这个缓冲池简单来说就是一块内存区域，这是InnoDB设置的，不是MySQL的服务端设置的。它存在的原因之一是为了避免每次都去访问磁盘，把最常访问的数据放在缓存]]></description><category></category></item><item><title><![CDATA[实现生产者消费者模式的三种方式]]></title><link>https://blog.youkuaiyun.com/a779868946/article/details/124925099</link><guid>https://blog.youkuaiyun.com/a779868946/article/details/124925099</guid><author>a779868946</author><pubDate>Mon, 23 May 2022 12:43:58 +0800</pubDate><description><![CDATA[什么是生产者消费者模式
简单来说，生产者消费者模式就是缓冲区。

那么这么做有两个好处，一个是解耦，第二个是平衡生产能力和消费能力的差，因为生产者和消费者的速度是不一样的，有了这个缓冲区就可以平衡这样一个落差，达到动态平衡。
那么这个缓冲区其实就是一个队列，它的规则就是当队列是满的时候，生产者会被阻塞。当队列为空的时候，消费者会被阻塞， 在java中实现生产者消费者模式有多种方式，主要是线程间的通信，这里介绍三种：wait/notify、await/signal和阻塞队列。
wait/notify
wait]]></description><category></category></item><item><title><![CDATA[一条查询SQL语句是如何执行的？]]></title><link>https://blog.youkuaiyun.com/a779868946/article/details/124620021</link><guid>https://blog.youkuaiyun.com/a779868946/article/details/124620021</guid><author>a779868946</author><pubDate>Fri, 06 May 2022 22:07:41 +0800</pubDate><description><![CDATA[总体架构
先看下总体架构，有一个全览的概念。

连接
MySQL服务监听的端口默认是3306，客户端连接的方式也有很多。可以是同步的也可以是异步的，可以是长连接也可以是短连接，可以是TCP连接也可以是Unix Socket，MySQL有专门处理连接的模块，连接的时候需要验证权限。
客户端每产生一个连接或者一个会话，在服务端就会创建一个线程来处理。反过来，如果要杀死会话的话，就是kill掉线程。 我们用show processlist看下有哪些连接，kill 的时候就是 kill 下面的 id。

如果客户端]]></description><category></category></item><item><title><![CDATA[腾讯云CentOS 7 Docker安装MySQL 5.7]]></title><link>https://blog.youkuaiyun.com/a779868946/article/details/124546077</link><guid>https://blog.youkuaiyun.com/a779868946/article/details/124546077</guid><author>a779868946</author><pubDate>Mon, 02 May 2022 20:25:09 +0800</pubDate><description><![CDATA[首先准备一台云服务器

安装docker
可以参考菜鸟教程
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun

启动 Docker
sudo systemctl start docker

测试一下
sudo docker run hello-world

没问题了
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VFWxZnQw-1651494244699)(https://p9-juejin]]></description><category></category></item><item><title><![CDATA[SpingBoot启动原理精讲第二讲]]></title><link>https://blog.youkuaiyun.com/a779868946/article/details/122654475</link><guid>https://blog.youkuaiyun.com/a779868946/article/details/122654475</guid><author>a779868946</author><pubDate>Sun, 23 Jan 2022 17:46:50 +0800</pubDate><description><![CDATA[前言
上一篇文章 《深度解析SpringBoot以及手写一个 starter》火了之后，由于篇幅的原因讲的不够深，我决定再加更一篇，两篇看下来相信对SpringBoot肯定能够理解了。

自动装配就是像事务、配置文件加载和解析、aop、缓存、数据源、springmvc等等，我们以前在项目中要加载这些需要配置xml或者写个@Configuration和很多个@Bean，这些都是需要手写的，现在不需要，只需要引入spring-boot-autoconfigure这个jar包即可，这个就是自动装配的魅力。以前要手]]></description><category></category></item><item><title><![CDATA[多线程顺序执行的几种写法]]></title><link>https://blog.youkuaiyun.com/a779868946/article/details/122531159</link><guid>https://blog.youkuaiyun.com/a779868946/article/details/122531159</guid><author>a779868946</author><pubDate>Sun, 16 Jan 2022 23:38:19 +0800</pubDate><description><![CDATA[前言
这是一道常见面试题，我也碰到过，下面介绍的这几种写法也是对并发编程常用工具掌握程度的一个考察，是一道很好的面试题。一共有以下几种写法，下面来分别介绍。

join写法（两种写法）
线程池写法
wait、notify写法
Condition写法
CountDownLatch写法
CyclicBarrier写法
Thread.sleep写法
CompletableFuture写法

join写法
join()方法的作用，把指定的线程加入到当前线程，可以将两个交替执行的线程合并为顺序执行的线程。
也就是说，]]></description><category></category></item><item><title><![CDATA[异步编程Future掌控未来]]></title><link>https://blog.youkuaiyun.com/a779868946/article/details/121598551</link><guid>https://blog.youkuaiyun.com/a779868946/article/details/121598551</guid><author>a779868946</author><pubDate>Sun, 28 Nov 2021 21:43:59 +0800</pubDate><description><![CDATA[Callable
有了Runnable，为什么还要Callable？
我们先来看下Callable的接口：
public interface Callable&lt;V&gt; {
    /**
     * Computes a result, or throws an exception if unable to do so.
     *
     * @return computed result
     * @throws Exception if unable to compute a re]]></description><category></category></item><item><title><![CDATA[强引用和弱引用的Threadlocal]]></title><link>https://blog.youkuaiyun.com/a779868946/article/details/121458153</link><guid>https://blog.youkuaiyun.com/a779868946/article/details/121458153</guid><author>a779868946</author><pubDate>Sun, 21 Nov 2021 19:10:53 +0800</pubDate><description><![CDATA[从SimpleDateFormat开始
首先看一个例子，创建20个线程，线程里就干一件事，就是转换时间
public class ThreadLoaclExample {

    //非线程安全的
    private static final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

    public static Date parse(String strDate) throws ParseExcep]]></description><category></category></item><item><title><![CDATA[多重校验神器责任链模式]]></title><link>https://blog.youkuaiyun.com/a779868946/article/details/120463378</link><guid>https://blog.youkuaiyun.com/a779868946/article/details/120463378</guid><author>a779868946</author><pubDate>Fri, 24 Sep 2021 21:20:51 +0800</pubDate><description><![CDATA[背景
最近在做需求，写一个方法，先在前面做验证，if不满足A条件则return，if不满足B条件则return…一共写了5个验证，等验证通过以后才执行下面的逻辑，这个也没问题。过了一阵产品提了需求，跟这个方法类似，我又把这个方法copy了一份，只不过验证条件稍微有点不一样，要变成6个验证了。
这时候我就发现有三个问题，第一重复代码，相同的A条件B条件C条件写了两份，没有复用。第二，“头重脚轻”，比如100行的方法，前面60行都是验证，后面40行才是真正有用的业务代码，你看一个方法功能的时候前面验证肯定是不关]]></description><category></category></item></channel></rss>