Redlock:Redis分布式锁最牛逼的实现
普通实现说道Redis分布式锁大部分人都会想到:setnx+lua,或者知道set key value px milliseconds nx。后一种方式的核心实现命令如下:
123456789- 获取锁(unique_value可以是UUID等)SET resource_name unique_value NX PX 30000- 释放锁(lua脚本中,一定要比较value,防止误解锁)if redis.call("get",KEYS[1]) == ARGV[1] then return redis.call("del",KEYS[1])else return 0end
这种实现方式有3大要点(也是面试概率非常高的地方):
set命令要用set key value px milliseconds nx;
value要具有唯一性;
释放锁时要验证value值,不能误解锁;
事实上这类琐最大的缺点就是它加锁时只作用在一个Redis节点上,即使Redis通过sentinel保证高可用,如果这个master节点由于某些原因发生了主从切换 ...
Mysql锁的类型及加锁原理
表锁和行锁我们首先来了解一下表锁和行锁:表锁是指对一整张表加锁,一般是 DDL 处理时使用;而行锁则是锁定某一行或者某几行,或者行与行之间的间隙。
表锁由 MySQL Server 实现,行锁则是存储引擎实现,不同的引擎实现的不同。在 MySQL 的常用引擎中 InnoDB 支持行锁,而 MyISAM 则只能使用 MySQL Server 提供的表锁。
表锁表锁由 MySQL Server 实现,一般在执行 DDL 语句时会对整个表进行加锁,比如说 ALTER TABLE 等操作。在执行 SQL 语句时,也可以明确指定对某个表进行加锁。
123mysql> lock table user read(write); # 分为读锁和写锁Query OK, 0 rows affected (0.00 sec)mysql> select * from user where id = 100; # 成功mysql> select * from role where id = 100; # 失败,未提前获取该 role的读表锁mysql> update user set ...
MySQL 性能优化实践
一 题记
最近公司项目添加新功能,上线后发现有些功能的列表查询时间很久。原因是新功能用到旧功能的接口,而这些旧接口的 SQL 查询语句关联5,6张表且编写不够规范,导致 MySQL 在执行 SQL 语句时索引失效,进行全表扫描。原本负责优化的同事有事请假回家,因此优化查询数据的问题落在笔者手中。笔者在查阅网上 SQL 优化的资料后成功解决了问题,在此从全局角度,记录和总结 MySQL 查询优化相关技巧。
二、优化思路
数据查询慢,不代表 SQL 语句写法有问题。 首先,我们需要找到问题的源头才能“对症下药”。笔者用一张流程图展示 MySQL 优化的思路:
无需更多言语,从图中可以清楚地看出,导致数据查询慢的原因有多种,如:缓存失效,在此一段时间内由于高并发访问导致 MySQL 服务器崩溃;SQL 语句编写问题;MySQL 服务器参数问题;硬件配置限制 MySQL 服务性能问题等。
三、查看 MySQL 服务器运行的状态值
如果系统的并发请求数不高,且查询速度慢,可以忽略该步骤直接进行 SQL 语句调优步骤。
执行命令:
1show status
由于返回结果太多,此处不贴出结果。其 ...
深入理解Java内部类
一、什么是内部类? 内部类是指在一个外部类的内部再定义一个类。内部类作为外部类的一个成员,并且依附于外部类而存在的。内部类可为静态,可用protected和private修饰(而外部类只能使用public和缺省的包访问权限)。内部类主要有以下几类:成员内部类、局部内部类、静态内部类、匿名内部类
二、内部类的共性(1)、内部类仍然是一个独立的类,在编译之后内部类会被编译成独立的.class文件,但是前面冠以外部类的类名和$符号 。
(2)、内部类不能用普通的方式访问。
(3)、内部类声明成静态的,就不能随便的访问外部类的成员变量了,此时内部类只能访问外部类的静态成员变量 。
(4)、外部类不能直接访问内部类的的成员,但可以通过内部类对象来访问
内部类是外部类的一个成员,因此内部类可以自由地访问外部类的成员变量,无论是否是private的。
因为当某个外围类的对象创建内部类的对象时,此内部类会捕获一个隐式引用,它引用了实例化该内部对象的外围类对象。通过这个指针,可以访问外围类对象的全部状态。
通过反编译内部类的字节码,分析之后主要是通过以下几步做到的: 1 编译器自动为内部类添 ...
SpringBoot过滤器Filter使用指南
I. 背景在正式开始之前,有必要先简单看一下什么是 Filter(过滤器),以及这个有什么用
1. Filter 说明Filter,过滤器,属于 Servlet 规范,并不是 Spring 独有的。其作用从命名上也可以看出一二,拦截一个请求,做一些业务逻辑操作,然后可以决定请求是否可以继续往下分发,落到其他的 Filter 或者对应的 Servlet
简单描述下一个 http 请求过来之后,一个 Filter 的工作流程:
首先进入 filter,执行相关业务逻辑
若判定通行,则进入 Servlet 逻辑,Servlet 执行完毕之后,又返回 Filter,最后在返回给请求方
判定失败,直接返回,不需要将请求发给 Servlet
插播一句:上面这个过程,和 AOP 中的@Around环绕切面的作用差不多
2. 项目搭建接下来我们搭建一个 web 应用方便后续的演示,借助 SpringBoot 搭建一个 web 应用属于比较简单的活;
创建一个 maven 项目,pom 文件如下
12345678910111213141516171819202122232425262728293 ...
12条非常有用的SQL技巧,建议收藏
一、一些常见的SQL实践
(1)负向条件查询不能使用索引。
1select * from order where status !=0 and stauts!=1
not in/not exists都不是好习惯。可以优化为in查询:
12select * from order where status in(2,3)
(2)前导模糊查询不能使用索引。
1select * from order where desc like '%XX'
而非前导模糊查询则可以:
1select * from order where desc like 'XX%'
(3)数据区分度不大的字段不宜使用索引。
12select * from user where sex=1
原因:性别只有男,女,每次过滤掉的数据很少,不宜使用索引。
经验上,能过滤80%数据时就可以使用索引。对于订单状态,如果状态值很少,不宜使用索引,如果状态值很多,能够过滤大量数据,则应该建立索引。
(4)在属性上进行计算不能命中索引。
1select * from order where YE ...
IDEA提高生产力的几个配置
1、显示工具条1.1、设置方法
标注1:View–>Toolbar
标注2:View–>Tool Buttons
2、设置鼠标悬浮提示2.1、设置方法File–>settings–>Editor–>General–>勾选Show quick documentation…
3、显示方法分隔符3.1、设置方法File–>settings–>Editor–>Appearance–>勾选
4、设置滑动滚轮调整大小4.1、设置方法File–>settings–>Editor–>changes front…–>勾选
5、忽略大小写提示5.1、设置方法File–>settings–>Editor–>General –>Code Completion –>
6、主题设置6.1、设置方法File–>settings–>Appearance & Behavior–>Appearance–>
7、护眼主题设置7.1、设置方法如果想将编辑页面变换主题, ...
两阶段提交、三阶段提交的理解
1、两阶段提交协议两阶段提交协议是协调所有分布式原子事务参与者,并决定提交或取消(回滚)的分布式算法
1.1、协议参与者在两阶段提交协议中,系统一般包含两类机器(或节点):一类为协调者(coordinator),通常一个系统中只有一个;另一类为事务参与者(participants,cohorts或workers),一般包含多个,在数据存储系统中可以理解为数据副本的个数。协议中假设每个节点都会记录写前日志(write-ahead log)并持久性存储,即使节点发生故障日志也不会丢失。协议中同时假设节点不会发生永久性故障而且任意两个节点都可以互相通信
1.2、两个阶段的执行1.请求阶段(commit-request phase,或称表决阶段,voting phase)
在请求阶段,协调者将通知事务参与者准备提交或取消事务,然后进入表决过程。
在表决过程中,参与者将告知协调者自己的决策:同意(事务参与者本地作业执行成功)或取消(本地作业执行故障)。
2.提交阶段(commit phase)
在该阶段,协调者将基于第一个阶段的投票结果进行决策:提交或取消。
当且仅当所有的参与者同意提交事务协 ...
JVM参数及调优
一、调优基本概念jvm性能调优的三个基本组件1.堆大小调整
2.垃圾收集器调整
3.JIT编译器
通常在调优java应用程序时,重点是一下两个目标之一
响应性:应用程序或系统对请求的数据进行相应的速度,对于专注于响应性的应用程序,长的暂停时间是不可接受的,重点是在短时间内做出回应。
吞吐量:侧重于在特定时间段内最大化应用程序的工作量,对于专注于吞吐量的应用程序,高暂停时间是可以接受的。由于高吞吐量的应用程序在较长时间内专注于基准测试,因此不需要考虑快速响应时间。
用户代码执行时间/(用户代码执行时间+垃圾回收时间)
二、JVM常用参数
三、GC调优思路
通用GC参数
四、JIT编译器优化参数
五、调优(1)根据需求进行JVM规划和预调优
(2)优化运行JVM环境(慢、卡顿怎么优化)
(3)解决JVM运行过程中出现的各种问题
调优,从规划开始1.调优,从业务场景开始
2.无监控(压力测试,能看到结果),不调优
步骤:(1)熟悉业务场景(没有最好的垃圾回收器,只有最合适的垃圾回收器)
响应时间、停顿时间 【CMS、G1、ZGC】,需要给用户作响应
吞吐量 = 用户时间/(用户时间+ ...
记录es一次死锁问题排查
1、问题概述业务流程1、从kafka消费数据。2、业务解析,组装数据。3、将组装好的数据,使用bulkProcessor.add(indexRequest),异步批量提交数据到ES。
问题描述kafka消费延迟监控报警,发现某个topic消费延迟持续增长,我们查看日志的时候,发现服务消费该topic消息的日志信息没有。分析ES的ECS的服务器情况,发现插入消息的总量陡降低。如下:
线程jstack信息
第一步查看进程 ps aux |grep java
第二步查看当前进程CPU占用情况top -Hp pid,发现线程资源占用都很平均
第三步打印查看当前进程jstack分析,jstack 29192 > 1.text
直接搜索BulkProcessor关键字,发现大量相关线程处于WAITING(parking)阻塞状态,- parking to wait for <0x0000000727e62228> (a java.util.concurrent.locks.ReentrantLock$NonfairSync)也就是说代码阻塞在ReentrantLoc ...