09 2020 档案
摘要:Redis提供了非常丰富的指令集,但是用户依然不满足,希望可以自定义扩充若干指令来完成一些特定领域的问题。Redis 为这样的用户场景提供了 lua脚本支持,用户可以向服务器发送 lua 脚本来执行自定义动作,获取脚本的响应数据。Redis 服务器会单线程原子性执行 lua 脚本,保证 lua 脚本
阅读全文
摘要:参考资料:https://www.jianshu.com/p/c4a743bbe3a4 这种情况下要解决的问题: 同一时间同时进行抢购,网站瞬时访问流量激增。 访问请求数量远远大于库存数量,但是只有少部分用户能够秒杀成功(高并发访问的数据安全性)。 优化思路 数据预处理,系统启动时将红包(商品)信息
阅读全文
摘要:我们在说顺序时,其实说的是: 有绝对时间参考的情况下,事件的发生时间的关系; 和没有时间参考下的,一种由因果关系推断出来的happening before的关系; 在分布式环境中讨论顺序 当把顺序放到分布式环境(多线程、多进程都可以认为是一个分布式的环境)中去讨论时: 同一线程上的事件顺序是确定的,
阅读全文
摘要:随笔 - 79 文章 - 0 评论 - 109 RocketMQ延迟消息的代码实战及原理分析 RocketMQ简介 RocketMQ是一款开源的分布式消息系统,基于高可用分布式集群技术,提供低延时的、高可靠、万亿级容量、灵活可伸缩的消息发布与订阅服务。 它前身是MetaQ,是阿里基于Kafka的设计
阅读全文
摘要:HBase基本存储原理: HMaster HMaster没有单点问题,HBase中可以启动多个HMaster,通过Zookeeper的Master Election机制保证总有一个Master运行,HMaster在功能上主要负责Table和Region的管理工作: 1.管理用户对Table的增、删、
阅读全文
摘要:1. kubernetes简介 kubernetes,简称K8s,是用8代替8个字符“ubernete”而成的缩写。是一个开源的,用于管理云平台中多个主机上的容器化的应用,Kubernetes的目标是让部署容器化的应用简单并且高效(powerful),Kubernetes提供了应用部署,规划,更新,
阅读全文
摘要:前言 MySql使用explain关键字可以模拟优化器执行sql语句,我们就能够知道MySql会如何处理咱们的sql, 可以根据explain的分析结果和MySql底层数据结构优化sql。文章内容基于MySql 5.7.24分析, 不同MySql版本可能有差别。如果用的是MySql 5.6.X,差别
阅读全文
摘要:前言 文章基于MySql 5.7.24分析,部分图片源于网络,是MySql索引学习笔记。 MySQL数据库支持多种索引类型,如BTree索引,哈希索引,全文索引等等。 这里只关注BTree索引,这是平时实战中使用最多的索引。 一 MySql索引概要 MySql索引是帮助MySql高效获取数据的排好序
阅读全文
摘要:Mysql 是如何使用索引的 大部分Mysql索引(Primary Key、Unique index和FullText)都通过B+树来存储和实现。也有一些例外:空间数据类型使用的索引是基于R-树的;内存表还支持哈希索引;InnoDB为Fulltext索引使用了逆转链表[1]。本文不打算去赘述B树的原
阅读全文
摘要:背景 我们知道JDK的线程池在线程数达到corePoolSize之后,先判断队列,再判断maximumPoolSize。如果想反过来,即先判断maximumPoolSize再判断队列,怎么办? 建议往下浏览之前先思考一下解决方案,该如何作答? 方案一 由于线程池的行为是定义在JDK相关代码中,我们想
阅读全文
摘要:如果有人问你“数据库事务有哪些特性”?你可能会很快回答出原子性、一致性、隔离性、持久性即ACID特性。那么你知道InnoDB如何保证这些事务特性的吗?如果知道的话这篇文章就可以直接跳过不看啦(#.#) 先说结论: redo log重做日志用来保证事务的持久性 undo log回滚日志保证事务的原子性
阅读全文
摘要:jstack可以定位到线程堆栈,根据堆栈信息我们可以定位到具体的代码,所以它在JVM性能调优中很常见。下面我们在找出某个java进程中最耗CPU的线程,并定位堆栈信息,使用到的命令有:ps、top、printf、jstack、grep。 1、使用top -c命令查看占用CPU最高的java进程 #t
阅读全文
摘要:服务器编程框架 IO处理单元 :处理用户连接,读写网络数据;(单机) ;作为接入服务器,实现负载均衡;(集群) 请求队列 :各个单元之间通信的抽象,通常被实现为池的一部分;一个单元通知另外一个单元,或者多个单元访问同一个存储单元时,竞争的协调;对于集群来说,请求队列是预先建立的 逻辑单元:一个进程或
阅读全文
摘要:GC 复制算法(Copying GC)是 Marvin L. Minsky 在 1963 年研究出来的算法。说得简单点,就是只把某个空间里的活动对象复制到其他空间,把原空间里的所有对象都回收掉。这是一个相当大胆的算法。在此,我们将复制活动对象的原空间称为 From 空间,将粘贴活动对象的新空间称为
阅读全文
摘要:1. 理解同步/异步、阻塞/非阻塞 同步和异步是针对应用程序和内核的交互而言的: 同步:用户进程触发IO操作并等待或者轮询的去查看IO操作是否就绪。 异步:用户进程触发IO操作以后便开始做自己的事情(实际上是委托给操作系统来进行处理),而当IO操作已经就绪的时候会得到系统的通知。 阻塞和非阻塞是针对
阅读全文
摘要:Netty 能做啥 简单说就是用来处理网络编程,写一款能进行网络通信的服务端和客户端程序。如果没有 Netty,在 Java 的世界中如何处理网络编程呢? Java 自带的工具有:java.net 包,用于处理网络通信,后面 Java 提供了 NIO 工具包用于提供非阻塞的通信。 与 Netty 同
阅读全文
摘要:一、基础知识 1.1 并发编程 目的:并发编程的目的就是为了能提高程序的执行效率,提高程序运行速度。 优点 充分利用多核CPU的计算能力; 方便进行业务拆分,提升应用性能; 缺点 并发编程并不总是能提高程序运行速度的,而且并发编程可能会遇到很多问题,比如:内存泄漏、上下文切换、线程安全、死锁等问题。
阅读全文
摘要:一、前言 事务(Transaction):一般是指要做的或所做的事情,由 事务开始(begin transaction) 和 事务结束(end transaction) 之间执行的全体操作组成。 简单的讲就是:要么全部被执行,要么就全部失败。 那分布式事务,自然就是运行在分布式系统中的事务,是由多个
阅读全文
摘要:并发容器 这些容器的关键方法大部分都实现了线程安全的功能,却不使用同步关键字(synchronized)。值得注意的是Queue接口本身定义的几个常用方法的区别, 1.add方法和offer方法的区别在于超出容量限制时前者抛出异常,后者返回false; 2.remove方法和poll方法都从队列中拿
阅读全文
摘要:序列化与反序列化是开发过程中不可或缺的一步,简单来说,序列化是将对象转换成字节流的过程,而反序列化的是将字节流恢复成对象的过程。两者的关系如下: 序列化与反序列化是一个标准(具体参考XDR:外部数据表示标准 RFC 1014),它是编程语言的一种共性,只是有些编程语言是内置的(如Java,PHP等)
阅读全文
摘要:Lock有三个实现类,一个是ReentrantLock,另两个是ReentrantReadWriteLock类中的两个静态内部类ReadLock和WriteLock。 其实现都依赖java.util.concurrent.AbstractQueuedSynchronizer类,实现思路都大同小异,因
阅读全文
摘要:在多线程并发编程中synchronized一直是元老级角色,我们在开发过程中可以使用它来解决线程安全问题中提到的原子性,可见性,以及顺序性。很多人都会称呼它为重量级锁。但是,随着Java SE 1.6对synchronized进行了各种优化之后,有些情况下它就并不那么重了,Java SE 1.6中为
阅读全文
摘要:一、Java 中的锁 重量级锁: synchronized 关键字 java.util.concurrent.Lock (Lock是一个接口,ReentrantLock是该接口一个很常用的实现) 这两种机制的底层原理存在一定的差别 synchronized 关键字通过一对字节码指令 monitore
阅读全文
摘要:分布式缓存是现在很多分布式应用中必不可少的组件,但是用到了分布式缓存,就可能会涉及到缓存与数据库双存储双写,你只要是双写,就一定会有数据一致性的问题,那么你如何解决一致性问题? Cache Aside Pattern 最经典的缓存+数据库读写的模式,就是 Cache Aside Pattern。读的
阅读全文
摘要:之前我们提到,为了保证Redis的高可用,主要需要以下几个方面: 数据持久化 主从复制 自动故障恢复 集群化 我们简单理一下这几个方案的特点,以及它们之间的联系。 数据持久化本质上是为了做数据备份,有了数据持久化,当Redis宕机时,我们可以把数据从磁盘上恢复回来,但在数据恢复之前,服务是不可用的,
阅读全文
摘要:单线程模型设计 单线程模型为何效率高 文件事件处理器 Redis 基于 Reactor 模式开发了自己的网络事件处理器 - 文件事件处理器(file event handler,后文简称为 FEH),而该处理器又是单线程的,所以redis设计为单线程模型。 采用I/O多路复用同时监听多个socket
阅读全文
摘要:概述 垃圾收集 Garbage Collection 通常被称为“GC”,它诞生于1960年 MIT 的 Lisp 语言,经过半个多世纪,目前已经十分成熟了。 jvm 中,程序计数器、虚拟机栈、本地方法栈都是随线程而生随线程而灭,栈帧随着方法的进入和退出做入栈和出栈操作,实现了自动的内存清理,因此,
阅读全文
摘要:java8默认使用ParallelGC收集器,也就是在新生代使用Parallel Scavenge收集器,老年代使用ParallelOld收集器 1GC算法简介 算法特点 标记-清除 分为“标记”和“清除”两个阶段 复制 可以解决效率问题,将可用的内存按容量划分为大小相等的两块。 标记-整理 先标记
阅读全文
摘要:目前虚拟机基本都是采用可达性分析算法进行GC,没有使用引用计数法。 题外话:C++ 11的智能指针就是基于引用计数的,它提供了weak_ptr来解决循环引用的问题。(类似于Java中的WeakReference,作用类似) 1 引用计数算法 1.1 算法思想 在对象头处维护一个引用计数器counte
阅读全文
摘要:并发编程是Java程序员最重要的技能之一,也是最难掌握的一种技能。它要求编程者对计算机最底层的运作原理有深刻的理解,同时要求编程者逻辑清晰、思维缜密,这样才能写出高效、安全、可靠的多线程并发程序。本系列会从线程间协调的方式(wait、notify、notifyAll)、Synchronized及Vo
阅读全文
摘要:不管是YGC还是Full GC,GC过程中都会对导致程序运行中中断,正确的选择不同的GC策略,调整JVM、GC的参数,可以极大的减少由于GC工作,而导致的程序运行中断方面的问题,进而适当的提高Java程序的工作效率。但是调整GC是以个极为复杂的过程,由于各个程序具备不同的特点,如:web和GUI程序
阅读全文

浙公网安备 33010602011771号