自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

taylor的专栏

Thunder Thinking and Action to enjoy loose life

  • 博客(93)
  • 收藏
  • 关注

原创 为什么ElasticSearch比MySQL更适合全文索引

熟悉 MySQL 的同学一定都知道,MySQL 对于复杂条件查询的支持并不好。MySQL 最多使用一个条件涉及的索引来过滤,然后剩余的条件只能在遍历行过程中进行内存过滤,对这个过程不了解的同学可以先行阅读一下《MySQL复杂where条件分析》。上述这种处理复杂条件查询的方式因为只能通过一个索引进行过滤,所以需要进行大量的 I/O 操作来读取行数据,并消耗 CPU 进行内存过滤,导致查询性能的下降。而 ElasticSearch 因其特性,十分适合进行复杂条件查询,是业界主流的复杂条件查询场景解决方案,

2021-02-20 21:27:37 32

原创 编程小技巧之 Linux 文本处理命令(二)

合格的程序员都善于使用工具,正所谓君子性非异也,善假于物也。合理的利用 Linux 的命令行工具,可以提高我们的工作效率。本篇文章是《Linux 文本处理命令》 续篇,在前文的基础上再介绍几款有用的 Linux 命令行工具和使用场景。再啰嗦几句,工具能提供效率,但是有一定的学习曲线和学习成本。很多同学临时想用时,可能会陷入了不会用的尴尬境地,再去网上搜索学习,最终要花费更长时间,还不如使用笨方法处理,这是很多同学不使用这些工具的原因之一。而且更难的是,思维上改变原有的做事习惯,一个文件中有20多行数据

2021-01-28 21:19:06 72

原创 一万字详解 Redis Cluster Gossip 协议

大家好,我是历小冰,今天来讲一下 Reids Cluster 的 Gossip 协议和集群操作,文章的思维导图如下所示。集群模式和 Gossip 简介对于数据存储领域,当数据量或者请求流量大到一定程度后,就必然会引入分布式。比如 Redis,虽然其单机性能十分优秀,但是因为下列原因时,也不得不引入集群。单机无法保证高可用,需要引入多实例来提供高可用性单机能够提供高达 8W 左右的QPS,再高的QPS则需要引入多实例单机能够支持的数据量有限,处理更多的数据需要引入多实例;单机所处理的网络流量已

2020-12-03 21:12:23 7497 1

原创 MySQL 的 join 功能弱爆了?

大家好,我是历小冰,今天我们来学习和吐槽一下 MySQL 的 Join 功能。关于MySQL 的 join,大家一定了解过很多它的“轶事趣闻”,比如两表 join 要小表驱动大表,阿里开发者规范禁止三张表以上的 join 操作,MySQL 的 join 功能弱爆了等等。这些规范或者言论亦真亦假,时对时错,需要大家自己对 join 有深入的了解后才能清楚地理解。下面,我们就来全面的了解一下 MySQL 的 join 操作。正文在日常数据库查询时,我们经常要对多表进行连表操作来一次性获得多个表合并后的数

2020-11-11 22:23:11 261

原创 MySQL 语句分析的神器-Optimizer Trace

在上一篇文章《用Explain 命令分析 MySQL 的 SQL 执行》中,我们讲解了 Explain 命令的详细使用。但是它只能展示 SQL 语句的执行计划,无法展示为什么一些其他的执行计划未被选择,比如说明明有索引,但是为什么查询时未使用索引等。为此,MySQL 提供了 Optimizer Trace 功能,让我们能更加详细的了解 SQL 语句执行的所有分析,优化和选择过程。如果您想更深入地了解为什么选择某个查询计划,那么优化器跟踪非常有用。虽然 EXPLAIN 显示选定的计划,但Optimizer

2020-08-03 21:57:33 89

原创 用 Explain 命令分析 MySQL 的 SQL 执行

title: 用 Explain 命令分析 MySQL 的 SQL 执行tags: mysqlabbrlink: 755443b5date: 2020-06-02 22:06:48在上一篇文章《MySQL常见加锁场景分析》中,我们聊到行锁是加在索引上的,但是复杂的 SQL 往往包含多个条件,涉及多个索引,找出 SQL 执行时使用了哪些索引对分析加锁场景至关重要。比如下面这样的 SQL:mysql> delete from t1 where id = 1 or val = 1其中 id .

2020-06-15 21:31:10 761

原创 MySQL死锁系列-常见加锁场景分析

在上一篇文章《锁的类型以及加锁原理》主要总结了 MySQL 锁的类型和模式以及基本的加锁原理,今天我们就从原理走向实战,分析常见 SQL 语句的加锁场景。了解了这几种场景,相信小伙伴们也能举一反三,灵活地分析真实开发过程中遇到的加锁问题。如下图所示,数据库的隔离等级,SQL 语句和当前数据库数据会共同影响该条 SQL 执行时数据库生成的锁模式,锁类型和锁数量。下面,我们会首先讲解一下隔离等级、不同 SQL 语句 和 当前数据库数据对生成锁影响的基本规则,然后再依次具体 SQL 的加锁场景。隔离等级对

2020-05-28 21:52:02 891

原创 带你100% 地了解 Redis 6.0 的客户端缓存
原力计划

近日 Redis 6.0.0 GA 版本发布,这是 Redis 历史上最大的一次版本更新,包括了客户端缓存 (Client side caching)、ACL、Threaded I/O 和 Redis Cluster Proxy 等诸多更新。我们今天就依次聊一下客户端缓存的必要性、具体使用、原理分析和实现。为什么需要客户端缓存?我们都知道,使用 Redis 进行数据的缓存的主要目的是减少对 MySQL 等数据库的访问,提供更快的访问速度,毕竟 《Redis in Action》中提到的, Redis

2020-05-11 21:04:36 1176

原创 Java 数据持久化系列之 HikariCP (一)
原力计划

在上一篇《Java 数据持久化系列之池化技术》中,我们了解了池化技术,并使用 Apache-common-Pool2 实现了一个简单连接池,实验对比了它和 HikariCP、Druid 等数据库连接池的性能数据。在性能方面,HikariCP遥遥领先,而且它还是 Spring Boot 2.0 默认的数据库连接池。下面我们就来了解一下这款明星级开源数据库连接池的实现。本文的主要内容包括:Hik...

2020-04-14 20:44:30 201

原创 MySQL的死锁系列- 锁的类型以及加锁原理
原力计划

疫情期间在家工作时,同事使用了 insert into on duplicate key update 语句进行插入去重,但是在测试过程中发现了死锁现象:ERROR 1213 (40001): Deadlock found when trying to get lock; try restarting transaction由于开发任务紧急,只是暂时规避了一下,但是对触发死锁的原因和相关原理...

2020-04-01 22:30:10 1305

原创 Java 数据持久化系列之池化技术

在上一篇文章《Java 数据持久化系列之JDBC》中,我们了解到使用 JDBC 创建 Connection 可以执行对应的SQL,但是创建 Connection 会消耗很多资源,所以 Java 持久化框架中往往不直接使用 JDBC,而是在其上建立数据库连接池层。今天我们就先来了解一下池化技术的必要性、原理;然后使用 Apache-common-Pool2实现一个简单的数据库连接池;接着通过实验,...

2020-02-03 21:30:49 2760 4

原创 Redis 命令执行过程(下)

在上一篇文章中《Redis 命令执行过程(上)》中,我们首先了解 Redis 命令执行的整体流程,然后细致分析了从 Redis 启动到建立 socket 连接,再到读取 socket 数据到输入缓冲区,解析命令,执行命令等过程的原理和实现细节。接下来,我们来具体看一下 set 和 get 命令的实现细节和如何将命令结果通过输出缓冲区和 socket 发送给 Redis 客户端。set 和 ge...

2019-12-14 10:35:40 907

原创 Redis 命令执行过程(上)

今天我们来了解一下 Redis 命令执行的过程。在之前的文章中《当 Redis 发生高延迟时,到底发生了什么》我们曾简单的描述了一条命令的执行过程,本篇文章展示深入说明一下,加深读者对 Redis 的了解。如下图所示,一条命令执行完成并且返回数据一共涉及三部分,第一步是建立连接阶段,响应了socket的建立,并且创建了client对象;第二步是处理阶段,从socket读取数据到输入缓冲区,然后解...

2019-12-11 18:42:19 720

原创 Java 数据持久化系列之JDBC

前段时间小冰在工作中遇到了一系列关于数据持久化的问题,在排查问题时发现自己对 Java 后端的数据持久化框架的原理都不太了解,只有不断试错,因此走了很多弯路。于是下定决心,集中精力学习了持久化相关框架的原理和实现,总结出这个系列。上图是我根据相关源码和网上资料总结的有关 Java 数据持久化的架构图(只代表本人想法,如有问题,欢迎留言指出)。最下层就是今天要讲的 JDBC,上一层是数据库连接池...

2019-11-26 20:39:56 5471 2

原创 当 Redis 发生高延迟时,到底发生了什么

Redis 是一种内存数据库,将数据保存在内存中,读写效率要比传统的将数据保存在磁盘上的数据库要快很多。但是 Redis 也会发生延迟时,这是就需要我们对其产生原因有深刻的了解,以便于快速排查问题,解决 Redis的延迟问题一条命令执行过程在本文场景下,延迟 (latency) 是指从客户端发送命令到客户端接收到命令返回值的时间间隔。所以我们先来看一下 Redis 一条命令执行的步骤,其中每个...

2019-11-12 20:48:03 5380 6

原创 详解 Redis 内存管理机制和实现

Redis是一个基于内存的键值数据库,其内存管理是非常重要的。本文内存管理的内容包括:过期键的懒性删除和过期删除以及内存溢出控制策略。最大内存限制Redis使用 maxmemory 参数限制最大可用内存,默认值为0,表示无限制。限制内存的目的主要 有:用于缓存场景,当超出内存上限 maxmemory 时使用 LRU 等删除策略释放空间。防止所用内存超过服务器物理内存。因为 Redis 默...

2019-10-28 22:00:24 1605 5

原创 一文了解 Redis 内存监控和内存消耗

Redis 是一种内存数据库,将数据保存在内存中,读写效率要比传统的将数据保存在磁盘上的数据库要快很多。所以,监控 Redis 的内存消耗并了解 Redis 内存模型对高效并长期稳定使用 Redis 至关重要。内存使用统计通过 info memory 命令可以获得 Redis 内存相关的指标。较为重要的指标和解释如下所示:属性名属性说明used_memoryRedis...

2019-10-15 22:58:45 1747 2

原创 Redis 复制过程详解

Redis 的复制功能分为同步( sync )和命令传播( command propagate )两个步骤: 同步用于将从服务器的数据库状态更新至主服务器当前所处的数据库状态。 命令传播则用于在主服务器的数据库状态被修改,导致主从服务器的数据库状态出现不一致时,让主从服务器的数据库重新回到一致状态。 同步Redis 使用 psync 命令完成主从数据同步,同步过程分为...

2019-09-19 12:22:00 337

原创 Redis AOF 持久化详解

Redis 是一种内存数据库,将数据保存在内存中,读写效率要比传统的将数据保存在磁盘上的数据库要快很多。但是一旦进程退出,Redis 的数据就会丢失。为了解决这个问题,Redis 提供了 RDB 和 AOF 两种持久化方案,将内存中的数据保存到磁盘中,避免数据丢失。RDB的介绍在这篇文章中《Redis RDB 持久化详解》,今天我们来看一下 AOF 相关的原理。AOF( append only...

2019-07-30 22:30:22 224

原创 Redis RDB 持久化详解

Redis 是一种内存数据库,将数据保存在内存中,读写效率要比传统的将数据保存在磁盘上的数据库要快很多。但是一旦进程退出,Redis 的数据就会丢失。为了解决这个问题,Redis 提供了 RDB 和 AOF 两种持久化方案,将内存中的数据保存到磁盘中,避免数据丢失。antirez 在《Redis 持久化解密》一文中说,一般来说有三种常见的策略来进行持久化操作,防止数据损坏:方法1 是数据...

2019-07-04 00:23:08 1456

原创 分布式数据缓存中的一致性哈希算法

一致性哈希算法在分布式缓存领域的 MemCached,负载均衡领域的 Nginx 以及各类 RPC 框架中都有广泛的应用,它主要是为了解决传统哈希函数添加哈希表槽位数后要将关键字重新映射的问题。本文会介绍一致性哈希算法的原理及其实现,并给出其不同哈希函数实现的性能数据对比,探讨Redis 集群的数据分片实现等,文末会给出实现的具体 github 地址。Memcached 与客户端分布式缓存M...

2019-06-27 21:56:48 398 1

转载 聊聊Linux IO

本文转载自https://0xffffff.org/2017/05/01/41-linux-io/作者:浅墨点击上方"程序员历小冰",选择“置顶或者星标” 你的关注...

2019-06-27 08:20:00 217

原创 用户日活月活怎么统计 - Redis HyperLogLog 详解

点击上方"程序员历小冰",选择“置顶或者星标” 你的关注意义重大!HyperLogLog 是一种概率数据结构,用来估算数据的基数。数据集可以是网站访客的 IP 地址,...

2019-06-17 08:24:00 2151

原创 十二张图带你了解 Redis 的数据结构和对象系统

Redis是一个开源的 key-value 存储系统,它使用六种底层数据结构构建了包含字符串对象、列表对象、哈希对象、集合对象和有序集合对象的对象系统。今天我们就通过12张图来全面了解一下它的数据结构和对象系统的实现原理。本文的内容如下: 首先介绍六种基础数据结构:动态字符串,链表,字典,跳跃表,整数集合和压缩列表。 其次介绍 Redis 的对象系统中的字符串对象(String...

2019-05-27 12:20:00 410 3

原创 Spring AOP(三) Advisor类架构

 Spring AOP是Spring的两大基石之一,不了解其基础概念的同学可以查看这两篇文章AOP基本概念和修饰者模式和JDK Proxy。 如果从代码执行角度来看,Spring AOP的执行过程分为四大步骤:步骤一:Spring框架生成Advisor实例,可以是@Aspect,@Async等注解生成的实例,也可以是程序员自定义的AbstractAdvisor子类的实例。步骤二:Sprin...

2019-02-25 21:05:14 739

原创 MySQL探秘(八):InnoDB的事务

 事务是数据库最为重要的机制之一,凡是使用过数据库的人,都了解数据库的事务机制,也对ACID四个基本特性如数家珍。但是聊起事务或者ACID的底层实现原理,往往言之不详,不明所以。所以,今天我们就一起来分析和探讨InnoDB的事务机制,希望能建立起对事务底层实现原理的具体了解。事务的四大特性 数据库事务具有ACID四大特性。ACID是以下4个词的缩写:原子性(atomicity) :...

2018-12-24 22:30:07 284

原创 Android Span 进阶

在上篇文章《Android Span 架构介绍》,我们讲述了Android Span的基本概念和用法,这篇文章我们就来扩展一下我们对Android Span的了解,这一定会使你感到惊奇的,惊叹Android Span竟然还能完成这些的效果,让你在Android自定义View和动画方面有更加深刻的理解,可能会帮助你你想出更加简洁的实现方式。  本篇文章主要讲述一下两个方面的内容:自定义Androi

2016-08-08 21:40:06 7271 1

原创 自定义Switch过程详解

作者: remcarpediem 联系方式:segmentfault,csdn,简书 本文转载请注明作者、文章来源,链接,版权归作者所有。 前段时间,我看到了一篇关于Android动画的文章Android View 仿iOS SwitchButton Material Design,十分喜欢文章作者的笔风,可惜每个人的笔风都不同,不过我倒是实现了一个类似的Switch组件,项目地址为http

2016-07-15 22:35:35 6202 5

原创 Android Scroll详解(三):Android 绘制过程详解

作者: ztelur 联系方式:segmentfault,csdn,github 本文转载请注明原作者、文章来源,链接,版权归原文作者所有。 本篇为Android Scroll系列文章的最后一篇,主要讲解Android视图绘制机制,由于本系列文章内容都是视图滚动相关的,所以,本篇从视图内容滚动的视角来梳理视图绘制过程。  如果没有看过本系列之前文章或者不太了解相关的知识,请大家阅读一下一下

2016-04-21 21:51:46 6315 2

原创 Gson 源码分析

最近研究了google开源的Json库Gson,在这里进行总结一下,应该会分为3篇博客。第一篇主要讲一下Gson的整个框架吧;第二篇主要总结一下Gson关于反射的部分;最后一篇会总结一下JsonWriter和JsonReader,主要是Json对象的处理啦。Gson Gson是可以转换Java对象为JSON表示的java库,也可以将JSON转换为Java对象,并且可以转换你没有源代码的预设的复杂对象

2015-10-02 16:16:04 3641 3

原创 java设计模式之decoration模式

本人近来正在学习研读《head first 设计模式》,有读了知名的博文《最牛B的程序员训练方法》,故想写篇博文,总结一下自己学习设计模式的体会和感悟,不好之处,请多多包涵,如诺指出其中的错误,本人不胜感激。  设计模式的本源是java开发中面向对象的各种原则,例如依赖倒置原则(DIP),开闭原则(OCP),依赖接口编程(programming to interface)等。但其根本的目的是信

2013-12-05 16:32:36 1206

原创 MySQL死锁系列-线上死锁问题排查思路

前言MySQL 死锁异常是我们经常会遇到的线上异常类别,一旦线上业务日间复杂,各种业务操作之间往往会产生锁冲突,有些会导致死锁异常。这种死锁异常一般要在特定时间特定数据和特定业务操作才会复现,并且分析解决时还需要了解 MySQL 锁冲突相关知识,所以一般遇到这些偶尔出现的死锁异常,往往一时没有头绪,不好处理。本篇文章会讲解一下如果线上发生了死锁异常,如何去排查和处理。除了系列前文讲解的有关加锁和锁冲突的原理还,还需要对 MySQl 死锁日志和 binlog 日志进行分析。正文**日常工作中,应对各

2020-10-19 21:03:35 404

原创 MySQL复杂where条件分析

在《MySQL 常见语句加锁分析》一文中,我们详细讲解了 SQL 语句的加锁原理并具体分析了大部分的简单 SQL 语句,但是实际业务场景中 SQL 语句往往及其复杂,包含多个条件,此时就需要具体分析SQL 使用到的索引,并了解 where 条件的判断逻辑。我们可以直接使用 explain 或者 optimizer_trace 来分析 SQL 语句执行使用了哪些索引,具体使用可以看本系列文章的前两篇文章。但是,今天我们讲一下具体 Where 语句的条件的拆分和使用,即复杂 Where 条件是如何生效的。

2020-08-31 22:48:21 202

原创 MySQL复杂where条件分析

在[《MySQL 常见语句加锁分析》](https://mp.weixin.qq.com/s/oJWDrNTLeDR8KYRKfn-f8g)一文中,我们详细讲解了 SQL 语句的加锁原理并具体分析了大部分的简单 SQL 语句,但是实际业务场景中 SQL 语句往往及其复杂,包含多个条件,此时就需要具体分析SQL 使用到的索引,并了解 where 条件的判断逻辑。我们可以直接使用 explain 或者 optimizer_trace 来分析 SQL 语句执行使用了哪些索引,具体使用可以看本系列文章的前.

2020-08-31 22:47:09 107

原创 100% 展示 MySQL 语句执行的神器-Optimizer Trace

在上一篇文章[《用Explain 命令分析 MySQL 的 SQL 执行》](https://mp.weixin.qq.com/s/88sGSpVYfGBREH-vZkl_jg)中,我们讲解了 Explain 命令的详细使用。但是它只能展示 SQL 语句的执行计划,无法展示为什么一些其他的执行计划未被选择,比如说明明有索引,但是为什么查询时未使用索引等。为此,MySQL 提供了 Optimizer Trace 功能,让我们能更加详细的了解 SQL 语句执行的所有分析,优化和选择过程。如果您想更深入地了解

2020-08-03 21:56:15 61

原创 公理设计:由奇怪海战引发的软件设计思考

前几天看到了一个博客,推荐了《公理设计》一书,还有其相关的文档以及视频。简单了解了一下,增深了一些对软件设计的理解,特此也推荐给大家。公理设计理论将设计建立在科学公理、定理和推论的基础上,由麻省理工学院教授 Nam. P. Suh 领导的研究小组于 1978 年提出,适用于各种类别的设计活动。软件设计当然也属于一类工程设计过程,下面我们就来看一下两者的关联。奇怪的海战首先从1862年11月1...

2019-11-02 21:53:36 485

原创 Spring Cloud Netflix Feign 基础应用实战

点击上方"程序员历小冰",选择“置顶或者星标” 你的关注意义重大!本文摘自笔者出版的书籍《Spring Cloud 微服务架构进阶》微服务是软件系统架构上的一种设计风...

2019-10-10 12:20:00 466

原创 编程小技巧之 Linux 文本处理命令

点击上方"程序员历小冰",选择“置顶或者星标” 你的关注意义重大!合格的程序员都善于使用工具,正所谓君子性非异也,善假于物也。合理的利用 Linux 的命令行工具,可...

2019-09-16 08:31:00 271

原创 Redis 事件机制详解

Redis 采用事件驱动机制来处理大量的网络IO。它并没有使用 libevent 或者 libev 这样的成熟开源方案,而是自己实现一个非常简洁的事件驱动库 ae_event。Redis中的事件驱动库只关注网络IO,以及定时器。该事件库处理下面两类事件:文件事件(file event):用于处理 Redis 服务器和客户端之间的网络IO。时间事件(time eveat):Redis 服...

2019-08-08 23:11:08 640

原创 Redis 事件机制详解

点击上方"程序员历小冰",选择“置顶或者星标” 你的关注意义重大!Redis 采用事件驱动机制来处理大量的网络IO。它并没有使用 libevent 或者 libev ...

2019-08-05 08:25:00 287

空空如也

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人 TA的粉丝

提示
确定要删除当前文章?
取消 删除