<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[AJun的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/still_fantasy</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; still_fantasy]]></copyright><item><title><![CDATA[pg逻辑复制和数据同步]]></title><link>https://blog.youkuaiyun.com/still_fantasy/article/details/121052446</link><guid>https://blog.youkuaiyun.com/still_fantasy/article/details/121052446</guid><author>still_fantasy</author><pubDate>Sat, 30 Oct 2021 16:16:56 +0800</pubDate><description><![CDATA[本文主要讲如何通过pg的逻辑复制功能，利用kafka，同步数据到第三方数据库（比如elassticsearch）。

pg逻辑复制

关于pg逻辑复制需要先看以下文章：《PostgreSQL变更事件捕获 》《pg的时间线解析》

逻辑复制几个比较重要的概念：

复制标识

逻辑复制设计之初，是为了将主库数据实时同步到从库的，主库是发布方，从库是订阅方，那么发布方发布一条更新消息，订阅方也就是从库需要知道更新的是哪一行记录，所以需要一个复制标识。复制标识总共有default（主键做默认标识）、index、fu]]></description><category></category></item><item><title><![CDATA[实时业绩排行榜设计]]></title><link>https://blog.youkuaiyun.com/still_fantasy/article/details/121052241</link><guid>https://blog.youkuaiyun.com/still_fantasy/article/details/121052241</guid><author>still_fantasy</author><pubDate>Sat, 30 Oct 2021 16:07:43 +0800</pubDate><description><![CDATA[业务场景

抢报活动期间，实时统计省区、分站、学规业绩（业绩属于科次维度），并以业绩大屏排行榜形式展示（每个业绩大屏统计规则都会不一样）。学生活动期间下单买课后，会发生换课，退课，换课和退课的科次不参与业绩统计，也可能业绩归属发生变更（比如需要刷脚本改业绩归属），还可能业绩大屏统计规则变更，导致该业绩大屏业绩重新统计计算。这些因素都需要考虑进设计中。

设计思路

首先，先看下面这张图，将用这张图展开来说说设计的思路：



1、采用消息队列通知业绩归属

在大屏活动开始到结束期间，下单归属业绩，换课、退课]]></description><category></category></item><item><title><![CDATA[Postgresql的vacuum机制一些理解]]></title><link>https://blog.youkuaiyun.com/still_fantasy/article/details/111786261</link><guid>https://blog.youkuaiyun.com/still_fantasy/article/details/111786261</guid><author>still_fantasy</author><pubDate>Sun, 27 Dec 2020 14:25:25 +0800</pubDate><description><![CDATA[我们知道，postgresql（以下简称pg）多版本控制mvcc和oracle有所不同，oracle通过回滚段实现，数据更新之前先将旧版本数据写入回滚段，然后再将待更新数据写入原data block，而pg mvcc则是当元组发生更改时，直接在原数据data page插入一条新的记录，同时将原元组逻辑上标识为删除，这些标识为删除的元组也叫死元组。这就导致当进行多次更新和删除操作，磁盘上会多出很多死元组，占用了很多磁盘空间并且导致系统性能下降。
vacuum的作用则是回收这些这些无效的空间。
vacuum命令]]></description><category></category></item><item><title><![CDATA[JAVA多线程之FutureTask源码解读]]></title><link>https://blog.youkuaiyun.com/still_fantasy/article/details/92724089</link><guid>https://blog.youkuaiyun.com/still_fantasy/article/details/92724089</guid><author>still_fantasy</author><pubDate>Tue, 18 Jun 2019 23:46:07 +0800</pubDate><description><![CDATA[使用过Java线程池的应该都知道，在java.util.concurrent有个ExecutorService的线程池接口，通过这个接口先线程池提交任务，获取任务结果，关闭线程池等等操作。而关于任务执行结果的获取，就不得不提FutureTask这个类。本文从源码的角度分析，线程池是如何通过FutureTask执行多线程任务，又是如何获取多线程执行结果的。

使用多线程，我们多数是使用Executo...]]></description><category></category></item><item><title><![CDATA[JAVA线程本地存储ThreadLocal的源码分析]]></title><link>https://blog.youkuaiyun.com/still_fantasy/article/details/92071332</link><guid>https://blog.youkuaiyun.com/still_fantasy/article/details/92071332</guid><author>still_fantasy</author><pubDate>Sat, 15 Jun 2019 12:21:49 +0800</pubDate><description><![CDATA[在jdk的api文档中，是这么描述ThreadLocal类的：This class provides thread-local variables. These variables differ from their normal counterparts in that each thread that accesses one (via its get or set method) has i...]]></description><category></category></item><item><title><![CDATA[使用merge into实现千万级别数据迁移]]></title><link>https://blog.youkuaiyun.com/still_fantasy/article/details/88382164</link><guid>https://blog.youkuaiyun.com/still_fantasy/article/details/88382164</guid><author>still_fantasy</author><pubDate>Fri, 14 Jun 2019 21:00:56 +0800</pubDate><description><![CDATA[之前项目需求，需要将另一个系统的数据迁移到当前系统的数据库中。数据量大概4000w，项目所使用的数据库是DB2。当时我们采用sql脚本进行迁移，其中迁移的核心sql语句就是使用merge into语句。

  merge into语法如下：


MERGE INTO &lt;target&gt; USING &lt;source&gt;
 ON &lt;match-conditio...]]></description><category></category></item><item><title><![CDATA[git的常规使用和冲突解决]]></title><link>https://blog.youkuaiyun.com/still_fantasy/article/details/92005081</link><guid>https://blog.youkuaiyun.com/still_fantasy/article/details/92005081</guid><author>still_fantasy</author><pubDate>Fri, 14 Jun 2019 20:59:39 +0800</pubDate><description><![CDATA[克隆仓库


git clone -b 分支名 仓库地址

若不使用-b参数，默认克隆master分支代码。

git的使用

1、提交代码前先将远程分支代码pull到本地


git pull

2、提交代码


添加待提交代码
git add /filepath/filename   
查看提交的文件
git status
注释本次提交代码
git commit -m "注释"
push到远程...]]></description><category></category></item><item><title><![CDATA[redis主从复制和无限同步问题]]></title><link>https://blog.youkuaiyun.com/still_fantasy/article/details/89790903</link><guid>https://blog.youkuaiyun.com/still_fantasy/article/details/89790903</guid><author>still_fantasy</author><pubDate>Fri, 03 May 2019 21:26:02 +0800</pubDate><description><![CDATA[一 主从复制

  主从复制，又称主从同步，分为增量同步和全量同步。增量同步slave会从master的复制积压缓存去中读取偏移数据，而全量同步，master会生成一个rdb文件，并传输给slave，slave会清空数据库，并从这个rdb文件重新导入数据。

二 全量同步的条件

以下情况从节点会做全量同步：

1. 备节点第一次连到主节点。

2. 节点重启，主节点runid会变，备节点ru...]]></description><category></category></item><item><title><![CDATA[mybatis学习笔记整理--mybatis的基本组成]]></title><link>https://blog.youkuaiyun.com/still_fantasy/article/details/88360527</link><guid>https://blog.youkuaiyun.com/still_fantasy/article/details/88360527</guid><author>still_fantasy</author><pubDate>Fri, 08 Mar 2019 23:30:59 +0800</pubDate><description><![CDATA[mybatis的基本组成

1、SqlSessionFactoryBuilder

SqlSessionFactoryBuilder根据配置信息生成SqlSessionFactory。可以说它的作用就是一个构建器，一旦构建了SqlSessionFactory，它的作用就已经完结，失去了存在的意义。此时我们就应该废弃它，回收它，所以它的生命周期只存在于方法周期。

2、SqlSessionFacto...]]></description><category></category></item><item><title><![CDATA[docker容器的导出和导入]]></title><link>https://blog.youkuaiyun.com/still_fantasy/article/details/86670437</link><guid>https://blog.youkuaiyun.com/still_fantasy/article/details/86670437</guid><author>still_fantasy</author><pubDate>Sun, 27 Jan 2019 22:41:09 +0800</pubDate><description><![CDATA[本文讲述的是如何从服务器A将运行的容器迁移至另一台服务器B上。

1  服务器A导出容器

1）使用commit把运行的容器打包成镜像


docker commit -a &quot;作者&quot; -m &quot;注释&quot; 容器id REPOSITORY:TAG

2）用export或者save把镜像导出成tar包


docker save -o xxx.tar REPOSITORY:TAG   

注：REPOSIT...]]></description><category></category></item><item><title><![CDATA[redis哈希表的rehash和CPU占用高的问题]]></title><link>https://blog.youkuaiyun.com/still_fantasy/article/details/85456100</link><guid>https://blog.youkuaiyun.com/still_fantasy/article/details/85456100</guid><author>still_fantasy</author><pubDate>Mon, 31 Dec 2018 22:45:08 +0800</pubDate><description><![CDATA[在某银行双十一前，生产上进行压测碰到了一个问题：在某一时刻，CPU使用率占用比非常高，达到了80%。而在这一时刻，redis响应时间非常慢，导致了这一时刻大笔交易发生了超时。经一系列分析，找出CPU使用率过高的原因：redis上存在一个以天为单位的set集合类型的大key，正是由于这个大key做rehash，导致CPU使用率占用过高。

在讲rehash问题，先讲讲字典和集合类型。

字典

re...]]></description><category></category></item><item><title><![CDATA[使用shell脚本优雅删除redis的大key]]></title><link>https://blog.youkuaiyun.com/still_fantasy/article/details/81104809</link><guid>https://blog.youkuaiyun.com/still_fantasy/article/details/81104809</guid><author>still_fantasy</author><pubDate>Wed, 18 Jul 2018 21:36:13 +0800</pubDate><description><![CDATA[本文关于大键（key）的描述参考博客：https://blog.youkuaiyun.com/zxl2016/article/details/78876016

理解大key

理解redis中的大key，可从两方面的来理解：1、时间复杂度，2、空间复杂度。前者主要表示Redis键的占用内存大小；后者表示Redis集合数据类型(set/hash/list/sorted set)键，所含有的元素个数。内存空间复...]]></description><category></category></item><item><title><![CDATA[linux使用shell脚本定期备份redis的rdb文件]]></title><link>https://blog.youkuaiyun.com/still_fantasy/article/details/81087606</link><guid>https://blog.youkuaiyun.com/still_fantasy/article/details/81087606</guid><author>still_fantasy</author><pubDate>Tue, 17 Jul 2018 20:45:52 +0800</pubDate><description><![CDATA[一 redis相关命令

1、bgsave命令

redis bgsave 命令用于在后台异步保存当前数据库的数据到磁盘。bgsave命令执行之后立即返回 OK ，然后 redis fork 出一个新子进程，原来的 redis进程(父进程)继续处理客户端请求，而子进程则负责将数据保存到磁盘，然后退出。即：bgsave命令执行后，会创建一个进程，该进程会根据配置文件redis.conf的dir创建一...]]></description><category></category></item><item><title><![CDATA[Redis Scan命令]]></title><link>https://blog.youkuaiyun.com/still_fantasy/article/details/80963550</link><guid>https://blog.youkuaiyun.com/still_fantasy/article/details/80963550</guid><author>still_fantasy</author><pubDate>Sun, 08 Jul 2018 22:38:23 +0800</pubDate><description><![CDATA[scan命令参数解释

Scan cursor [match pattern] [count count]

cursor:游标，每次scan都会返回一个游标，用以继续下次的扫描。游标从0开始遍历，到0结束遍历。

match：匹配模式。

count:返回数量，默认是10。但scan不一定返回指定的数量。

示例：scan 0 match  A*  count 20。执行该命令，会扫描匹配A开头...]]></description><category></category></item><item><title><![CDATA[Java线程池的使用]]></title><link>https://blog.youkuaiyun.com/still_fantasy/article/details/80962448</link><guid>https://blog.youkuaiyun.com/still_fantasy/article/details/80962448</guid><author>still_fantasy</author><pubDate>Sun, 08 Jul 2018 21:53:33 +0800</pubDate><description><![CDATA[一、线程池的组成   一个线程池包括以下四个基本组成部分：1、线程池管理器（ThreadPool）：用于创建并管理线程池，包括 创建线程池，销毁线程池，添加新任务； 2、工作线程（PoolWorker）：线程池中线程，在没有任务时处于等待状态，可以循环的执行任务； 3、任务接口（Task）：每个任务必须实现的接口，以供工作线程调度任务的执行，它主要规定了任务的入口，任务执行完后的收尾工作，任务的执...]]></description><category></category></item><item><title><![CDATA[中缀表达式转为后缀表达式]]></title><link>https://blog.youkuaiyun.com/still_fantasy/article/details/78080646</link><guid>https://blog.youkuaiyun.com/still_fantasy/article/details/78080646</guid><author>still_fantasy</author><pubDate>Sun, 24 Sep 2017 22:39:53 +0800</pubDate><description><![CDATA[中缀表达式即通用的算术或逻辑公式表示方法。如（1+2）*3-4。 
后缀表达式即指的是不包含括号，运算符放在两个运算对象的后面，所有的计算按运算符出现的顺序，严格从左向右进行（不再考虑运算符的优先规则）。如中缀表达式（1+2）*3-4的后缀表达式为12+3*4-。在将中序表达式转换为后序表达式过程中，使用到栈，运算符优先级高的先输出。下面算法中，将用icp来表示当前扫描到的运算符的优先级，该运算符进]]></description><category></category></item></channel></rss>