自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(130)
  • 资源 (5)
  • 收藏
  • 关注

原创 Beyong Compare过期

Beyong compare 使用指南

2022-06-26 23:12:10 278 1

原创 缓存与数据库更新策略

缓存更新缓存(Redis、memory cache等)被广泛应用于高并发、高性能的项目中。应用在,请求先查询缓存,命中则返回。未命中则查询数据库,并缓存。而且缓存也有过期时间的,避免浪费内存、出现不一致等,因此缓存是最终一致性的。但实际使用中,需要主动更新缓存。那就存在一个问题:为保证数据读取的正确性、一致性,是先更新缓存,还是先更新数据库?数据变化时,缓存可以更新也可以删除,等查询的时候再次缓存即可。因此可以组合出以下四种策略:先更新缓存,再更新数据库;先删除缓存,再更新数据库;先更新数据

2020-12-03 11:42:29 674

原创 Redis高级特性

随着Redis越来越火,除了基本提供的五种基本数据类型,也提供了其他数据结构和特性。另外,其独特的Module加载机制也带来了极大的可扩展性。漏斗限流在业务中我们可能对一些调用、执行进行限流。而redis就为我们提供了一种方式。限流涉及的指标有 容量 流出速率 管道管道不是Redis独有的。本质上redis 客户端通过对管道中的指令列表改变读写顺序来节省IO。服务器依旧是收到一条消息,执行一条消息,回复一条消息。Geo我们知道,地球是一...

2020-09-30 23:57:16 929

原创 Redis主从复制与集群

之前已经介绍了一些redis的基本特性。这里介绍下主从复制与集群工作方式。主从复制为保证redis的高可用性,一般都会跟其他中间件一样进行主从复制。比如kafka是把消息传递、mysql使用binlog。既然涉及到分布式,就不得不提及CAP理论。CAP理论有三点 C-Consistent 一致性 A-Availability 可用性 P-Partition tolerance 分区容忍性 也就是说在一个分布式系统中,不能同时保证这三个特性。即,网络分区发生时,一

2020-09-30 23:36:13 197

原创 MySQL中InnoDB特性

InnoDB关键特性InnoDB是Mysql最常用的存储引擎。这里简单说下它的一些特性。主要有:插入缓冲、两次写、自适应哈希、异步IO、刷新临近页。插入缓冲即我们所说的Insert Buffer,xxx使用条件同时满足: 索引是辅助索引 索引不是唯一索引 可以在 show status 中查看,seg size * 16KB 代表Insert Buffer大小。两次写即Double Write,主要是为了保证数据页的可靠性。自适应哈希...

2020-09-30 22:39:56 256

原创 MySQL体系结构简介

很多人都用过MySQL,可能有些人对MySQL的结构和底层比较模糊。这里简单介绍下。MySQL架构首先看下一个随处可见的架构图,也是大家对MySQL可插拔式存储引擎吹捧的原因从图中可以看出大致分八个组件,这里简单说明下:组件 功能 说明 Connectors 连接客户端 Management Service & Utilities 系统管理控制工具、备份、灾难恢复、分区管理、集群等 Connection Pool 连接..

2020-09-30 22:27:46 302

原创 MySQL数据页结构

最近在学习Mysql的数据结构,这里整理下。因为主流存储引擎是InnoDB,学习的也是它。这里介绍的也是InnoDB。数据页在操作系统中,我们知道为了跟磁盘交互,内存也是分页的,一页大小4KB。同样的在MySQL中为了提高吞吐率,数据也是分页的,不过MySQL的数据页大小是16KB。(确切的说是InnoDB数据页大小16KB)为了详细说明,这里先用图介绍一下页的结构:而在MySQL内存中,多个这样的数据结构作为节点构成一个双向链表。File Header从上边的图也可以.

2020-09-06 20:40:23 5756

原创 MySQL日期类型

MySQL日期类型有5种,分别是DATETIME、 TIMESTAMP、DATE、TIME和YEAR。前三种比较常用。这里对比下 日期时间类型 占用空间 日期格式 最小值 最大值 零值表示 DATETIME 8 bytes YYYY-MM-DD HH:MM:SS 1000-01-01 00:00:

2020-08-31 22:28:51 2526

原创 五种IO类型简单了解

编程过程中经常会遇到 IO,而且各种技术框架底层也是各种IO的应用。这里简单整理下。IO类型参考《UNIX网络编程》,IO一共分五种类型 阻塞IO(bloking IO) 同步非阻塞IO(synchronous non-blocking IO) 信号驱动式IO(signal-driven IO) 多路复用IO(multiplexing IO) 异步IO(asynchronous IO) 前四种为同步IO,最后一种为异步IO。概念这里简单介绍.

2020-08-31 19:23:02 11229

原创 Typora使用快捷键

markdown 可以很好的编辑一个文档的格式,只是它的学习成本高而且只有编程习惯的人才能高效使用它。Typora是一个所见即所得的Markdown格式文本编辑器,支持Windows、macOS和GNU/Linux操作系统。简单来说,只需要简单的快捷键等操作,即可获取一个简洁美观的文档格式。下边介绍下它的使用,这里以 macOS为准。更新中...

2020-08-31 00:01:32 508

原创 Java字节码理解

Java字节码其实就是 .class 文件.我们写出的Java源代码经过编译后就会变成 class文件。编译过程源代码是程序员写的。JVM识别不了,因此需要编译器主要对源码代码做编译处理,大致如下:词法分析器 => 语法分析器 => 语法树/抽象语法树 => 语义分析器 => 注解抽象语法树 => 字节码生成器 => class文件这个过程涉及编译原理,就不说了。执行以下命令即可对类进行编译javac XXX.javaClass文件.

2020-08-01 19:36:10 591

原创 Redis服务启动、事件循环与客户端命令的执行

Redis 服务启动直接看代码。新的版本中服务器启动代码在 server.c 中int main(int argc, char **argv) { struct timeval tv; int j; // 省略 ... initServerConfig(); moduleInitModulesSystem(); if (argc >= 2) { // ... resetServerSaveParam

2020-07-22 01:45:49 568

原创 redis之RediSearch全文搜索

RediSearchRediSearch是一个高性能的全文搜索引擎,可作为一个Redis Module 运行在Redis上,是由RedisLabs团队开发的。主要特性如下:简单,快速索引和搜索数据存储在内存中,使用内存-有效的自定义数据结构支持多种使用UTF-8编码的语言文档和字段评分结果的数值过滤通过词干扩展查询精确的短语搜索按特定属性过滤结果(例如仅在标题中搜索“foo”)强大的自动提示引擎增量索引(不需要对索引进行优化和压缩)支持用作存储在另一数据库中的文档的搜索索引

2020-07-09 23:53:07 8797 1

原创 RPC简单总结

RPC说起RPC,大家应该都用过一些常用RPC 框架。这里就不说了。RPC(Remote Procedure Call ),即远程过程调用。简单来说就是本地调用远程机器上的一个函数调用。RPC 最开始来源于 Bruce Jay Nelson 的论文《Implementing Remote Procedure Calls》。论文对RPC 基本结构解析如图:简单来说,RPC 有 5 个组件:1. User : 即客户端,也就是本地的调用方2. User-stub : 负责将调用的接

2020-07-08 01:53:14 197

原创 Redis源码编译与调试

Redis 是目前最常用的缓存数据库,C语言编写的。这里我用Clion 编译调试。Clion 安装CLion 是 JetBrains 推出的全新的 C/C++ 跨平台集成开发环境。用来阅读 Redis 源码再合适不过了。函数调用查询、跳转都很方便。从官网下载安装即可。下载源码首先从官网下载源码下载后解压即可。编译Clion 里用CMake 编译,因此需要安装 CMake。Mac 上直接命令安装即可brew install cmakeRedis源码有多个模..

2020-07-08 01:34:54 2104

原创 Java的ConcurrentHashMap 底层了解

最近有人问Java8 中ConcurrentHashMap 底层实现,这里简单列下。大家都知道 Java8 对HashMap 、ConcurrentHashMap 进行了改进,前者非线程安全,后者线程安全。HashMap在Java 7 中,采用哈希表结构在Java 8 中,采用哈希表 + 红黑树ConcurrentHashMap在Java 7 中,采用分段的哈希表在Java 8 中,采用数组 + 链表+ 红黑树两者类似,下边主要讲下ConcurrentHashMap...

2020-06-30 23:59:11 296

原创 Java的synchronized 了解

Java中的锁在 Java 中主要2种加锁机制:synchronized 关键字java.util.concurrent.Lock (ReentrantLock是该接口的一个常用实现)两者在底层存在一些差别:synchronized 是关键字,通过一对字节码指令 monitorenter/monitorexit 实现。java.util.concurrent.Lock 利用Java 代码和sun.misc.Unsafe 中的本地调用实现的。Unsafe 包不是Java规范的一部分...

2020-06-30 23:52:57 157

原创 布隆过滤器Bloom filter基本原理

最近有碰到布隆过滤器,发现redis本身没有实现它。如果使用需要再安装这个模。有兴趣的可以自己学习下先看下介绍The RedisBloom module provides four data structures: a scalable Bloom filter, a cuckoo filter, a count-min sketch, and a top-k. These data structures trade perfect accuracy for extreme memory effi

2020-06-17 01:28:08 613

原创 IntelliJ IDEA jprofiler安装及性能分析

Eclicpse 中可以集成MAT,即 Memory Analyzer Tool。进行性能分析。而IntelliJ 里面可以用jprofiler 进行vm 性能分析。jprofiler功能JProfile是一款性能瓶颈分析工具,监控粒度可以细化到某一个类包。主要功能有:1.内存剖析 Memory profiler2.堆遍历 Heap walker3.CPU 剖析 CPU profiler4.线程剖析 Thread profiler5.VM 遥感勘测技术 VM telemetry

2020-06-16 00:02:14 3583 2

原创 Redis简单了解三

事务redis 的事务跟之前了解的事务不一样。它是将多个命令请求打包,然后按顺序、一次性地执行多个命令。事务执行期间,服务器不会中断事务而去执行其他客户端的命令。注意,redis事务是不支持回滚的。事务分三步:事务开始 MULTI,打开事务标识命令入队事务提交执行 EXEC事务还可以配合watch使用,watch 即乐观锁。事务开始前,注册监视某key,在exec ...

2020-04-21 23:54:29 117

原创 BTrace简单使用

BTrace:Byte trace,通过动态字节码将跟踪操作代码插入到正在运行的Java程序的类中。简单来说,就是通过 instrument + asm,对正在运行中的类,进行动态增强。使用过Jrebel 的对此可能非常熟悉,原理类似。使用场景基于此,btrace 被用于线上排查问题,追踪bug。最常用的就是跟VisualVM 一起用来排查问题。概念探测点限制为...

2020-04-21 01:28:41 238

原创 Redis简单了解二

持久化redis持久化有两种方式:RDB与AOFRDB,即redis的快照,保存redis那一刻的数据状态。SAVE:阻塞服务器进程BGSAVE:服务器主进程fork一个子进程执行命令执行过程服务启动过程周期性任务复制淘汰策略Hyperloglog...

2020-04-17 17:01:39 105

原创 Redis简单了解一

Redis简单来说就是,一个键值对类型的单线程内存数据库。支持String、List、Set、Sorted Set、hashes数据类型。数据结构简单动态字符串(Simple Dynamic String),redis是用C语言写的,但它的简单动态字符串却比C语言的字符串优秀。redis对象链表哈希表rehash字典跳跃表整数集合...

2020-04-17 16:25:12 139

原创 Centos7安装Redis

redis安装首先从官网下载包:下载后解压到指定文件夹:tar -zxvf redis-5.0.8.tar.gz进入解压后的目录cd redis-5.0.8编译make MALLOC=libc安装make install修改redis.confdaemonize no改成daemonize yes进入src 目录后,命令启动c...

2020-04-08 23:02:51 199

原创 kafka详解

前面文章已经介绍过如何安装kafka。这里介绍下kafka的基本概念和内部原理。kafka最开始是Linkedin 开发用于输出日志的中间件。由于它的可扩展性和吞吐量比ActiveMQ,RabbitMQ好,逐渐用来当作分布式消息系统来使用。下边介绍几个概念:消息kafka的数据单元被称为消息。为了提高效率,消息被分批写入kafka。因此,批次就是一组消息。当然批次的大小也影响性能,...

2020-04-07 22:15:10 285

原创 Java线程池初步了解

线程池线程池初始化时即创建一些空闲的线程。当程序将一个任务提交给线程池时,线程池就会选择一个空闲的线程来执行该任务。在任务结束以后,该线程并不会死亡,而是由线程池回收成为空闲状态,等待执行下一个任务。线程池状态线程池状态有如下几种(来源于网上):RUNNING:运行时状态,可以接受新的任务,并处理等待队列中的任务SHUTDOWN:不接受新的任务提交,但是会继续处理等待队列中的任务...

2020-04-04 01:08:12 126

原创 Java多线程之CountDownLatch、CyclicBarrier、Semaphore与Exchanger

Java多线程有Runnable、Thread、Callable、线程池、synchronized、volatile、Lock等可以直接使用。也有线程的直接实现可用。下边主要讲下CountDownLatch、CyclicBarrier与Semaphore。CountDownLatch从名字可以知道,是个倒计数锁。通过一个计数器,每个线程完成则减一,并在原地等待。直至减到0,开始后续工作...

2020-04-03 21:43:21 251

原创 Java的IO、NIO、AIO了解

java提供了IO、NIO、AIO包,用于处理输入输出。BIO:Block IO 同步阻塞式 IO,就是我们平常使用的传统 IO,它的特点是模式简单使用方便,并发处理能力低。NIO:Non IO 同步非阻塞 IO,是传统 IO 的升级,客户端和服务器端通过 Channel(通道)通讯,实现了多路复用。AIO:Asynchronous IO 是 NIO 的升级,也叫 NIO2,实现了异步非堵...

2020-03-31 22:56:07 198

原创 log4j和log4j2

log4jlog4j是之前最流行的日志输出系统,目前尽管有了log4j2和其他日志输出系统。但log4j 里面的概念还是保留了。先看个例子:这里我使用的是 slf4 => log4j,依赖:dependencies { compile "org.slf4j:slf4j-api:1.7.30" compile "org.slf4j:slf4j-log4j12:...

2020-03-28 23:18:16 1469

原创 zookeeper选举master了解

zookeeper广泛用于分布式服务中,比如选举。这里简单介绍下,算是入门。基本概念我们知道zookeeper的结构是树形结构1.集群host启动后的监听/master节点的删除事件2.各服务器host尝试创建master,成功则把自己的信息存在master上,失败则读取master节点信息3.服务注册:各服务器host在/serverList节点下创建子节点,并把自己的信息存...

2020-03-26 00:38:56 495

原创 zookeeper与客户端curator

zookeeperzookeeper被广泛用于分布式服务中,如集群,kafka等。但基本的api却很简单。通过客户端调用简单的zookeeper的api实现数据更新、节点检测、权限控制、异步操作、事件监听等,最终实现分布式需要。这里简单介绍一下客户端api。首先,启动zookeeperzkServer.sh start开放2181端口,供外部调用firewall-cmd...

2020-03-23 23:45:02 694

原创 Java日志系统概述SLF4J、log4j、JCL、Logback

java日志系统经常遇到SLF4j,JCL,logback,log4j2等等。一些人可能要晕了怎么选择,这里简单说下。发展这些都要从Java日志框架的元老log4j说起。java1.3之前打日志都是采用System.out.println(), System.err.println()等做法。此时log4j诞生,定义了Logger、Appender、Level等概念,至今还在使用。可以说...

2020-02-28 02:31:23 1046

原创 Java的SPI

什么是SPISPI全称Service Provider Interface。没有翻译,我的理解是服务提供者的接口。先看下图,一般服务提供方提供服务(实现),并暴露接口。这样调用方只需要调用暴露出的接口即可获取服务。也就是说,接口与服务提供方在一起。这是一般的调用模式。下边换个思路,接口与调用方在一起。此时,服务提供方只是实现。不同的服务方可以有不同的实现,通过配置即可切换。有...

2020-02-25 23:33:00 100

原创 Linux下安装Mysql

利用wget下载包wget http://dev.mysql.com/get/mysql57-community-release-el7-8.noarch.rpm下载后目录里有文件安装包rpm -ivh mysql-community-release-el7-5.noarch.rpm安装Mysqlyum install mysql-server之后 /etc/yum....

2020-02-19 00:06:39 113

原创 zookeeper安装

准备确保机器上已经有java环境java -version下载ZooKeeper从官网下载解压即可,有些镜像可能慢,可以用国内的。安装zookeeper有三种模式:单机、伪集群、集群。单机模式新建目录 zookeeper-1,把下载的压缩包解压进去tar -zxvf zookeeper-3.4.12.tar.gz -C zookeeper-1...

2020-02-18 23:44:21 156

原创 Java中慎用yyyy与YYYY

开始之前,先看一个单元测试跑出的结果: @Test public void should_get_string_when_given_date() { Long timeFor20191230 = 1577635200000L; Date date = new Date(timeFor20191230); String time...

2020-01-18 02:06:39 355

原创 Chrome网页截屏

日常中可能需要截截屏,或者网页。微信等工具其实自带了截图工具可供使用。不过也有局限性,比如不能翻页。其实Chrome自带了很强大的截取网页的工具,这里说下Mac上的用法,windows上的也类似。1. ⌘Command + ⌥Option + I(Windows 为 F12)快捷键,召唤出调试界面。2. 按下 ⌘Command + ⇧Shift + P(Windows 为 Ctrl +...

2019-08-22 00:13:50 992

原创 vi编辑使用

vi 三种模式:命令行模式、插入模式、尾行模式。命令行模式命令模式,也是默认的,按下esc即可,可以执行移动光标,删除等操作。常用操作如下: 类别 分类 按键 光标移动 字符级 h 左移动 ...

2019-08-18 21:17:13 142

原创 Docker笔记一

联合文件系统最近在学Docker,碰到联合文件系统的概念,看了下书和资料都说的不清楚。这里详细说明下。官方说法:Docker联合文件系统Union File System,它是实现Docker镜像的技术基础,是一种轻量级的高性能分层文件系统,支持将文件系统中的修改进行提交和层层叠加,这个特性使得镜像可以通过分层实现和继承。同时支持将不同目录挂载到同一个虚拟文件系统下。没看懂?没关系,看图...

2019-08-15 20:02:45 76

原创 Mac下CentOS安装

最近在学linux和docker,需要安装linux。这里整理下安装过程。系统MacOS。1. 虚拟机下载安装Mac用的是VMware Fusion,这个可以官网下载。这里安装很简单,不多描述2.CentOs下载安装这个是免费的,随便下载一个就好。当日也可以选择ubuntu等。选择CentOS是因为它比较干净。这里拖拽安装即可在 Fusion 中,转到文件 > 新建。 ...

2019-08-13 23:05:36 2209

Interface Segregation Principle

Robert Martin 的文章《ISP: The Interface Segregation Principle》。

2018-06-06

里氏代换原则原文

里氏代换原则是由麻省理工学院(MIT)计算机科学实验室的Liskov女士,在1987年的OOPSLA大会上发表的一篇文章《Data Abstraction and Hierarchy》里面提出来的,主要阐述了有关继承的一些原则,也就是什么时候应该使用继承,什么时候不应该使用继承,以及其中的蕴涵的原理。2002年,软件工程大师Robert C. Martin,出版了一本《Agile Software Development Principles Patterns and Practices》,在文中他把里氏代换原则最终简化为一句话:“Subtypes must be substitutable for their base types”。也就是,子类必须能够替换成它们的基类。

2018-06-06

Moco入门代码

简单介绍Moco两种使用方式:支持 API 和独立运行。演示接口测试

2018-03-18

Test-Driven JavaScript Development

Christian Johansen 大牛著作,英文原版。从JavaScript规范和实现讲起,到TDD框架怎么实现。另外在实现过程中也给出很多,浏览器兼容函数的替代写法。

2017-09-14

Spring动态代理

Spring MVC中利用动态代理记录日志,通过注解的方式记录日志。Spring MVC+ Restful。

2016-05-04

空空如也

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

TA关注的人

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