oneone1995

Results 19 issues of oneone1995

官方发音为 `my S-Q-L [/maɪ ˌɛskjuːˈɛl/]` ,而不是`my sequel [/mai 'siːkwəl/]` 参考: - [MySQL - Wikipedia](https://en.wikipedia.org/wiki/MySQL) - [sqlserver和mysql中sql这个词的发音为何不同?](https://www.zhihu.com/question/36329247)

比如CapsLock+LALT+P来跳到行首的使用,很难成功,直接变成大小写切换。 系统为win10 2004。CapsLock+版本为3.2.0, 在 IntelliJ IDEA测试结果gif我放在下面了。 ![Animation](https://user-images.githubusercontent.com/12215935/99906715-91485f80-2d13-11eb-941c-77d8eba2b690.gif)

在通过steam打开的游戏上设置禁用失效,例如dota2

# Redisson分布式限流器RRateLimiter原理解析 redisson就不多做介绍了,它提供的分布式锁非常强大,一般公司都会选择它在生产环境中使用。但其提供的其他分布式工具就不是那么有名了,比如其提供的分布式限流器`RRateLimiter`网上几乎没有分析它的文章,本文也基于此目的记录一下学习`RRateLimiter`的心得。如有不对,请多指正。 ## 简单使用 很简单,相信大家都看得懂。 ```java public class Main { public static void main(String[] args) throws InterruptedException { RRateLimiter rateLimiter = createLimiter(); int allThreadNum = 20; CountDownLatch latch =...

blog

# 查看GitHub仓库被谁star > 本文引用自[查看GitHub仓库被谁star](https://github.com/alanhg/others-note/issues/111) ## 背景 记得之前github是能直接通过star的icon点击查看repo被谁star的,改版之后貌似没有了。搜了一下,地址还是保留的。 ``` https://github.com/{{your_user_name}}/{{your_repo}}/stargazers ``` [点击查看blog的star](https://github.com/oneone1995/blog/stargazers)

# MySQL是怎样连接的-笔记(2) > 本文为[MySQL是怎样运行的](https://juejin.im/book/5bffcbc9f265da614b11b731)的读书笔记第二篇。按书的思路以及自己的理解整理了MySQL索引原理的相关内容。 ## Innodb索引页与行格式 要说清楚索引,首先需要说明白的是`Innodb索引页`和`Innodb行格式`。`页`是MySQL存储数据的基本单位,一个页的大小一般是16KB。MySQL中有各种各样的`页`,而和数据存储相关的便是`索引页`。索引页的示意图如下: ![索引页](https://raw.githubusercontent.com/oneone1995/blog/master/2020-10/assets/index_page.png) 我们每次插入记录,都是从索引页的`Free Space`中分配内存(分配得到的内存便是`User Records`部分了),然后按照特定的`行格式`将记录存在`User Records`中。 那什么是`行格式`?所谓的InnoDB行格式就是记录在磁盘上的存放形式,以`COMPACT`行格式举例,其示意图如下: ![compact行格式示意图](https://raw.githubusercontent.com/oneone1995/blog/master/2020-10/assets/compact_row_format.png) 因为本文只介绍索引相关的知识,并不需要对`InnoDB行格式`了解的太多,如果对`InnoDB行格式`有兴趣的同学可以去看作者原文。从`COMPACT`行格式示意图可以看到,一条记录除了我们记录的真实信息以外还有一些额外信息,我们需要对`记录头信息`这部分重点关注。 ![记录头信息](https://raw.githubusercontent.com/oneone1995/blog/master/2020-10/assets/innodb_row_format_record_header.png) 其中最最重要的两个字段是`n_owned`和`next_record`两个字段。`n_owned`表示索引页对页内数据分组后每组有多少条记录,至于什么是分组,我们后面再详细说。`next_record`表示当前记录到下一条记录的距离,由此可见记录和记录之间通过`next_record`形成了一条单向链表。 ## 索引页中的分组与槽 再来仔细看看,索引页中的数据究竟是如何存储的。 ![索引页中的记录](https://raw.githubusercontent.com/oneone1995/blog/master/2020-10/assets/record_in_index_page.png) 这个图里没有将`next_record`的箭头画出,这里就自行想象一下吧。接下来我们来解释一下这张图。 1. 最小记录和最大记录:innodb索引页中规定了一个`页`中有两条固定的记录,分别是最小记录和最大记录。 2. 分组与槽:索引页按照主键大小将`页`里面的数据分成多个组,每组的记录条数在4-8条之间,如果一直往一个组内添加记录直到超过了8条那么则分裂出第二个组。然后将每一组中最大的那条记录单独摘出来放在`页目录`中称之为`槽`。 当我们搞清楚`槽`和`页目录`的概念后我们就能知道如何在一`页`中查找一条记录了。因为槽与槽是按顺序存在页目录中的,他们代表的记录也是按主键值排序的。那么可以使用二分查找确定待查询记录所在分组对应的槽,然后按`next_record`遍历槽对应的组中的各个记录。因为这个记录很少,所以查询速度极快。 回头想一想,假设没有`槽`和`页目录`的设计,我们又该如何查找呢?那就得从`页`的最小记录开始依次往后遍历,直到找到待查记录,当页内记录非常多时,查询效率就变得非常低下。 ## 索引...

blog
reading-notes

# 从Spring与Mybatis整合看Spring的两个扩展点 ## 一、mybatis核心原理 我们都知道,实际开发中我们只需要写Mapper接口,并不需要提供对应的实现类,那为什么能直接注入并运行?要解答这个问题,我们从不与spring整合的mybatis下手,这样能方便我们研究源码。首先我们来写一个demo ```java public class WithoutSpringRunner { public static void main(String[] args) { DataSource dataSource = JdbcConnectionPool.create("jdbc:h2:file:./testDB", "root", "root"); TransactionFactory transactionFactory = new JdbcTransactionFactory(); Environment environment =...

blog

# MySQL是怎样连接的-笔记(1) > 本文为[MySQL是怎样运行的](https://juejin.im/book/5bffcbc9f265da614b11b731)的读书笔记。按书的思路以及自己的理解整理了MySQL总体的内容。 ## 启动与配置 MySQL是典型的C/S架构程序。`mysqld`为服务端程序,`mysql`为客户端程序。我们有可能并不直接运行`mysqld`,例如运行`mysql.server`、`mysqld_safe`,这些命令或脚本最终都调用了`mysqld`来启动MySQL服务,但他们更强大,在启动服务的同时提供了如自动重启等高级功能。 MySQL启动的时候可以通过在启动命令中添加配置参数来配置某些东西,例如`--host(-h)`、`--user(-u)`、`--default-storage-engine`,但更推荐的做法是将常用的配置写到配置文件中去,这样就不需要每次启动服务的时候都写一串命令。 以类unix操作系统为例,MySQL会按照下列路径依次读取配置文件: 1. /etc/my.cnf 2. /etc/mysql/my.cnf 3. SYSCONFDIR/my.cnf 4. $MYSQL_HOME/my.cnf 5. defaults-extra-file 6. ~/.my.cnf 7. ~/.mylogin.cnf 另外,配置文件中用`[]`的形式将配置分组,其中,`[server]`组下边的启动选项将作用于所有的服务器程序。比如上文提到的`mysql.server`、`mysqld_safe`因为最终调用的都是`mysqld`,所以他们在启动时都会读取`[mysqld]`中的配置,客户端相关配置也可以按此规律推导。 配置文件的优先级按照后面的覆盖前面的逻辑生效。无论是不同的配置文件还是同一个文件中的不同分组,都将以最后一个出现的启动选项为准。 最后,很多配置在运行时可以改变。甚至可以针对不同的某个客户端连接设置不同的配置,例如存储引擎。可以将某个客户端连接设置成`MyISAM`,将别的客户端连接设置为`InnoDB`。 你可能会纳闷,`default-storage-engine`这个配置项明明是服务端的,但为什么可以通过客户端的启动命令进行改变,那是因为MySQL的配置选项分为`GLOBLAE`与`SESSION`两种作用域,这个例子中的`efault-storage-engine`便是一个`SESSION`级别的配置项,因此也仅仅只对当前连接生效。 ## 请求与处理 C/S架构的程序交互都可以抽象成“客户端与服务端建立连接,客户端发送请求...

blog
reading-notes

# 数据库连接池初探 ## 为什么需要连接池 ### MySQL连接原理 所谓的数据库连接操作实际上是MySQL客户端与MySQL服务端进行通信,再细化一点便是连接进程与MySQL服务进程之间的进程通信。常用的进程通信方式有`管道`、`共享内存`、`TCP socket`、`unix domain socket`,而MySQL提供的连接方式也大抵如此。 - TCP socket 这应该是使用最普遍的一种MySQL连接方式,也是我们日常开发过程中使用的,随着微服务化的流行,数据库RDS通常与应用服务器分离,数据库连接几乎都采用这种在TCP连接上建立一个基于网络的连接请求来完成任务。这种连接方式的连接过程如下: 1. 应用数据层向DataSource请求数据库连接 2. DataSource使用数据库Driver打开数据库连接 3. 创建数据库连接,内部可能创建线程,打开TCP socket 4. 应用读/写数据库 5. 如果该连接不再需要就关闭连接 6. 关闭socket - 其它连接方式 当客户端和服务端都在同一台服务器上的时候,还可以使用`命名管道`、`共享内存`和`Unix域套接字`来进行连接。这些方式都是本地通信,不经过网卡,不需要进行TCP握手与挥手,性能自然也比TCP...

# 从redis实例迁移导致应用无法获得连接简单说说jedis的sentinel机制 ## 现象 前段时间,因为运维同学在做redis的实例迁移导致使用那个master-name的服务都无法获取到redis连接并报错。报错信息如下: ![异常栈](https://raw.githubusercontent.com/oneone1995/blog/master/2018-12/assets/exception_stack.png) 奇怪的问题是服务在进行`重启`操作之后便又能拿到redis连接,服务正常了。另外观察到出现此现象的服务使用的redis客户端均为jedis。 ## 原因 看到这个现象第一反应是jedis在服务端出现停机断线的情况后不会进行重连,在服务端恢复后客户端这边没进行重连操作导致。这也很好解释为什么重启之后便能恢复故障的现象。 但按理来说正常的实例迁移操作是不会造成服务都不可用的问题的,不然生产上redis服务端进行一次闪断,所有使用jedis的服务全会不可用。所以和运维同学一起做了个实验复现了当时的问题,便找到了原因。 ### 运维操作步骤复现 #### 第一次实验 1. 删哨兵信息 2. 停master节点 3. 重启master节点 按照我最开始的想法,服务端出现闪断,jedis又没有重连机制,服务应该不可用才对。但奇怪的是问题并没有复现。此时我们开始怀疑redis服务端版本问题、spring-data版本问题。但我们把各个系统环境都和当时出问题的环境保持一致的时候按上述操作步骤仍然没有复现。而且发现了一个新的问题,在master节点没有停机的情况下即使把sentinel中的注册信息删掉,客户端仍然可以连上服务端。 #### 第二次实验 1. 删哨兵信息 2. 停master节点 3. 注册新的节点信息到哨兵...

blog