Shellbye.github.io
Shellbye.github.io copied to clipboard
my blog --> see https://github.com/Shellbye/Shellbye.github.io/issues for recent update
``` SRE Site Reliability Engineering 前言 在牛顿被世界正式认可为物理学家之前,他经常被称作是最后的炼金术士 第一部分 概览 第1章 介绍 不能将碰运气当成战略 ——SRE俗语 系统管理员模式 Dev / Ops 分离带来的问题 1. 直接成本 2. 间接成本 Google 的解决之道: SRE SER 团队成员的特点 a. 对重复性、手工性的操作有天然的排斥感 b....
``` 数据可视化 基础篇 第1章 数据可视化简介 1.1 可视化释义 人眼具有很强的模式识别能力,对可视符号的感知速度比数字或文本快多个数量级 在计算机学科的分类中,利用人眼的感知能力对数据进行交互的可视表达以增强认知的技术,成为可视化 它们的单维度均值、最小二乘法回归线性方程、误差的平方和、方差的回归和、均方误差的误差和、相关系数等统计属性均相同, 因此,通过这些传统的统计方法难以对他们直接进行区分 可视化的作用体现在多个方面,如 揭示想法和关系、形成论点或意见、观察事务演化的趋势、总结或积聚数据、存档和汇整、寻求真相和真理、探索性数据分析 信息记录 支持对信息的推理和分析 信息传播与协同 1.2 可视化简史 17世纪之前:图表萌芽 1600--1699年:物理测量 1700--1799年:图形符号 1800--1900年:数据图形 1900--1949年:现代启蒙 1950--1974年:多维信息的可视编码 1975--1987年:多维统计图形 1987--2004年:交互可视化 2004--至今 可视分析学 1.3 数据可视化详解...
最近新开发一个项目([demo](https://github.com/Shellbye/hibernate_saveAll_slow_demo)),有大量的数据批量保存,用到了`JPA`自带的`saveAll`方法,但是在压测的时候,却发现一个致命的问题,就是特别慢。用`MySQL`的`show PROCESSLIST;`查看之后,发现有大量的如下语句 ```sql select next_val as id_val from hibernate_sequence for update ``` 原来是因为在`model`中的`id`是由`Hibernate`生成的, ```java @Id @GeneratedValue(strategy = GenerationType.AUTO) private Integer id; ``` 而它的生成机制就是在`hibernate_sequence`这个表中存储了下一个`id`,并在每一次取的时候都自增,所有的新建请求都需要在这里排队取`id`,那可不是就慢了,这就导致`saveAll`和重复调用`save`一样了,批量操作失去了批量的意义,避免这种假批量的方式比较多,比较简单快捷的一个方式就是在配置文件中显示的关闭这种策略 ``` spring.jpa.hibernate.use-new-id-generator-mappings=false ``` 这样配置之后,同样的`model`代码 ```java @Id @GeneratedValue(strategy...
`MySQL`事务的四大特性(原子性`Atomicity`/一致性`Consistency`/隔离性`Isolation`/持久性`Durability`)基本是人尽皆知,但是关于其事务隔离级别这一概念,我也是在最近读书时才回想起来,当年的数据库课程似乎隐隐的听到过,所以这里结合一些资料对四种隔离基本做一个简单的总结。 这个隔离的级别当然还是要从四大特性中的隔离性(`Isolation`)开始说起,隔离的定义是事务内部的操作与其他事务是隔离的,并发执行的各个事务之间不能互相干扰。理想很美满,现实很骨感,虽然隔离性的定义非常清楚也没有啥问题,但是考虑到效率问题,实际应用中,隔离是分为以下四级的: 1. READ-UNCOMMITTED 2. READ-COMMITTED 3. REPEATABLE-READ 4. SERIALIZABLE 下面我们分别详细的看一下各个级别的定义、表现和问题,首先,我们先定义一个我们自己的测试表 ```sql create table tb ( my_id int auto_increment primary key, my_name varchar(255) not null ) engine = innodb; ```...
被上一个题目( #43 )暴虐之后,我变得谦虚了不少,虽然我是从难到易的在做,但是这只是一个从通过率的角度来衡量的,而且不同的题目解题思路差异还挺大,真不能掉以轻心。 ## [题目](https://leetcode-cn.com/problems/decode-ways/) >一条包含字母 A-Z 的消息通过以下方式进行了编码: >'A' -> 1 >'B' -> 2 >... >'Z' -> 26 >给定一个只包含数字的非空字符串,请计算解码方法的总数。 >示例 1: >>输入: "12" >>输出: 2 >>解释: 它可以解码为 "AB"(1 2)或者 "L"(12)。...
今天做项目的时候发现一个问题,就是我用`@Transactional`装饰的方法中,当抛出`Exception`或其子类型的时候,并没有回滚。经过一番调研之后发现是设计如此,`@Transactional`就是不会针对`Exception`进行回滚,除非你显示的声明如下 ```java @Service public class MainService { private MyUserMapper myUserMapper; @Autowired public MainService(MyUserMapper myUserMapper) { this.myUserMapper = myUserMapper; } @Transactional(rollbackFor = Exception.class) public void createUser(Long id) throws Exception { MyUser...
`Spring Boot`支持[用户自定义配置](#58),这样可以把一些未来可能改变的值提取到配置文件中,将来修改就不需要修改代码了。但是因为[某些历史原因](https://github.com/spring-projects/spring-boot/issues/5361),`application.properties`只支持`ISO-8859-1`编码,如果我们的配置中包含中文,如下 ``` custom.appName="演示" ``` 那么最终的结果就成为了 ``` { name: "æ¼ç¤º" } ``` 网络上提出了很多的解决方案,比如使用[这个转换工具](https://javawind.net/tools/native2ascii.jsp?action=transform),可以把中文转成`unicode`,这个时候我们的配置就成了 ``` custom.appName="\u6f14\u793a" ``` 这样最终的结果是可以接收的,如下 ``` { name: "演示" } ``` 但是这种配置方式对人类太不友好了,因为你基本上不知道你当前的配置是什么,除非实际执行一下看结果。比较优雅的方式,是使用 `application.yml` ``` custom: app-name: "演示成功" ```...
很多时候我们的代码中是有一些可变\但是又不是经常变的常量的,比如用户等待某个消息的最长等待时间,我们先期暂定30秒,但是后来发现时间有点久,想要改成10秒,那么这个时候其实是有很多解决方案的,比如我们可以把这个写到数据库里,每次都去读取数据库,这个还能做到修改实时生效,但是这样也有一个问题就是太浪费资源,而且我们的可能改一下之后就不再改了,那么每次都读取数据库其实性能也有问题,直接改代码也是一种方案,写成一个常量,以后每次修改都改动代码,这样做的弊端就是每次修改都涉及到上线啥的,其实也比较麻烦。 这个时候一个比较合理的解决方案是使用`Spring Boot`支持的用户自定义配置,在保证了性能的同时,对其进行修改也是成本比较小的。下面是一个具体的示例。 ### 配置文件 application.properties ``` custom.waitTime=30 ``` ### 接收Bean ```java package com.example.demo; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.stereotype.Component; @Component @ConfigurationProperties("custom") // 需要注意这里,得和 application.properties 对应 public class AppProp { private Integer...
### Oh My Zsh 关于大名鼎鼎[`Oh My Zsh`](https://github.com/robbyrussell/oh-my-zsh),应该不需要过多的解释,一句话概括,就是它是一个很牛逼的`shell`-[`zsh`](https://www.zsh.org/)的一个配置管理工具,它给我们的原本枯燥的`shell`添加了很多特性,具体可以参看[官网](https://ohmyz.sh/)。 ### virtualenv 今天要说的是它之前缺失的一点点东西,熟悉`Python`开发的人肯定是离不开[`virtualenv`](https://docs.python-guide.org/dev/virtualenvs/)的,它的一个作用是在同一台机器上,创建不同的依赖环境,让你可以在依赖完全不同的项目直接进行无缝切换。 ### 问题 以上两个项目都是很不错的,但是他们之间有一点兼容问题,那就是使用`Oh My Zsh`的时候,terminal中缺少了对当前虚拟环境的提示,如下图  其中的`[integrate_test4self]`就是对当前需要环境`integrate_test4self`的一个提示,这样可以避免诸如因为不知道当前在哪个虚拟环境中而装错依赖包等的问题。 ### 解决方案 有意思的是`bash`是有这样的提示功能的,那么万能的`Oh My Zsh`怎么可以没有呢,于是我提了一个[`Pull request`](https://github.com/robbyrussell/oh-my-zsh/pull/5139),添加了一个主题`pygmalion-virtualenv.zsh-theme`来解决这个问题。 要想体验这个主题,你需要先更新`Oh My Zsh`来获取最新的代码...
``` MySQL技术内幕 InnoDB 存储引擎 第2版 第1章 MySQL 体系结构和存储引擎 1.1 定义数据和实例 数据库 database 物理操作系统文件或其他形式文件类型的集合。 在 MySQL 数据库中,数据库文件可以是 frm, MYD, MYI, idb 结尾的文件。 当使用 NDB 引擎时,数据库的文件可能不是操作系统上的文件,而是存放与内存之中 实例 instance MySQL 数据库由后台线程以及一个共享内存区组成。数据库实例才是真正用于操作数据库文件的 MySQL 数据库实例在系统上的表示就是一个进程...