- 博客(71)
- 收藏
- 关注
原创 论MySQL行锁的功与过
对于不支持行锁的引擎,同一张表上任何时刻只能有一个更新在执行,这就会影响到业务并发度。顾名思义,行锁就是针对数据表中行记录的锁。这很好理解,比如事务 A 更新了一行,而这时候事务 B 也要更新同一行,则必须等事务 A 的操作完成后才能进行更新。课后问题:...
2021-05-27 16:20:53 227 1
原创 全局锁和表锁
根据加锁的范围,MySQL 里面的锁大致可以分成全局锁、表级锁和行锁三类。课后问题:Q1:SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;Q2:START TRANSACTION WITH CONSISTENT SNAPSHOT;/* other tables */Q3:SAVEPOINT sp;/* 时刻 1 */Q4:show create table `t1`;/* 时刻 2 */Q5:SELECT
2021-05-27 15:31:33 202
原创 深入浅出索引
三种常见的索引数据结构,它们分别是哈希表、有序数组和搜索树。哈希表这种结构适用于只有等值查询的场景有序数组在等值查询和范围查询场景中的性能就都非常优秀,但是,有序数组索引只适用于静态存储引擎二叉搜索树也是课本里的经典数据结构思考问题1:思考问题2:...
2021-05-25 19:02:06 158
原创 一条SQL更新语句的执行过程
经典SQL更新语句:mysql> create table T(ID int primary key, c int);mysql> update T set c=c+1 where ID=2;有了 redo log,InnoDB 就可以保证即使数据库发生异常重启,之前提交的记录都不会丢失,这个能力称为crash-safe。注意redo log的两阶段提交。...
2021-05-25 15:23:25 99
原创 一条SQL查询语句的执行过程
经典SQL查询语句mysql> select * from T where ID=10;大体来说,MySQL 可以分为 Server 层和存储引擎层两部分。Server 层包括连接器、查询缓存、分析器、优化器、执行器等,涵盖 MySQL 的大多数核心服务功能,以及所有的内置函数(如日期、时间、数学和加密函数等),所有跨存储引擎的功能都在这一层实现,比如存储过程、触发器、视图等。而存储引擎层负责数据的存储和提取。其架构模式是插件式的,支持 InnoDB、MyISAM、Memory 等
2021-05-24 20:35:05 95
原创 Volatile和原子类的异同
Demo:/** * @author NanShan @create * 2020-08-27 19:50 * * Note: * 1.程序并不能正常退出 * 2.修改方法:volatile boolean flag = true; * 3.疑问:为什么在run方法中打印一个东西,程序就能正常退出? */public class Main extends Thread { boolean flag = true; @Override public void...
2021-05-24 15:30:51 185
原创 Kafka会不会丢消息?怎么处理的?
Kafka存在丢消息的问题,消息丢失会发生在Broker,Producer和Consumer三种。Properties props = new Properties(); props.put("bootstrap.servers", "localhost:9092"); props.put("group.id", "test"); // 自动提交开关 props.put("enable.auto.commit", "true"); // 自动提交的时间间隔,此处是1s
2021-05-24 10:26:21 129
原创 一文了解SQL子查询
补充:什么是Semi-JOIN?A表在B表找到匹配的记录之后,半连接(Semi-JOIN)返回A表中的记录。与连接查询不同,即使B表中找到多条匹配的记录,A表也只会返回一条记录。另外,B表一条记录也不会返回。半连接通常使用IN 或 EXISTS 作为连接条件。...
2021-05-23 16:23:43 127
原创 SQL语句LEFT JOIN中的ON和WHERE
SQL语句:FROM A LEFT JOIN B and A.ID=B.ID and A.name=‘XXX’不会过滤结果记录条数,只会根据and后的条件是否显示 B表的记录,A表的记录一定会显示。基本表信息如下:SQL1:返回结果依旧是14 rows,区别是非CLERK显示为NULLSQL3:返回相同行数...
2021-05-19 21:20:23 110
原创 Kafka的broker-list,bootstrap-server以及zookeeper的关系
broker指的是kafka的服务端,可以是一个服务器也可以是一个集群。producer和consumer都相当于这个服务端的客户端。broker-list用来指定集群中的一个或者多个服务器,一般我们再使用console producer的时候,这个参数是必备参数;另外一个必备的参数是topic,如下示例:[atguigu@hadoop102 kafka]$ bin/kafka-console-producer.sh --broker-list hadoop002:9092 --topic first
2021-05-05 09:41:56 1758
原创 关于Linux中的环境变量设置
方法1:针对所有用户有效,所以只能在开发过程中使用;存在危险vi /etc/profileexport HADOOP_HOME=/opt/module/hadoop-2.7.2export PATH=$PATH:$HADOOP_HOME/bin方法2:针对当前特定用户有效
2021-05-03 21:17:40 84
原创 LINUX命令自由
通过执行 echo $SHELL 命令可以查看到当前正在使用的 Shell 。还可以通过 cat /etc/shells查看当前系统安装的所有 Shell 种类。
2021-04-19 14:57:43 213
原创 MySQL中的SERIALIZABLE浅谈
SERIALIZABLE隔离级别:一个个事务排成序列的形式。事务一个挨一个执行,等待前一个事务执行完,后面的事务才可以顺序执行。在SERIALIZABLE级别下,不会使用MySQL的MVCC机制,而是在每一个SELECT请求下获得读锁,在每一个UPDATE操作下尝试获得写锁。开启事务A和B,修改隔离级别,不自动提交事务:事务A中,查看pay表如下:事务B中,查看pay表如下:(两个事务都可以正常执行)此时,在A中执行INSERT或者UPDATE操作:(均被阻塞)COMMIT事务B之后,A如
2021-01-20 15:04:26 1409
原创 MySQL中的Repeatable-Read探讨
在客户端A中,做以下操作:在客户端B中,修改id=1的记录,然后提交:再回到客户端A中,发现id=1的记录并没有改变:紧接着,在A中执行UPDATE语句,发现是从400的基础上进行修改的,数据一致性没有被破坏。可重复读的隔离级别下使用了MVCC机制,SELECT操作不会更新版本号,会读历史版本属于快照读(历史版本);INSERT、UPDATE和DELETE会更新版本号,会读最新版本属于当前读(当前版本)。在B中INSERT数据:(先COMMIT事务A,再重新开启一个事务A)先看A:操作
2021-01-19 16:23:50 641
原创 SELECT FOR UPDATE语句
悲观锁实现:以下实例使用MySQL官方数据库sakila--关闭自动提交事务SET autocommit=0;--city表中city_id的行数据会被锁定,其它的事务必须等本次事务提交之后才能执行。START TRANSACTION;SELECT * FROM city WHERE city_id=1 FOR UPDATE;SELECT sleep(10);COMMIT;NOTE:只有SELECT ... FOR UPDATE 或LOCK IN SHARE MODE 相同数据时会等待其它
2021-01-19 09:54:19 913
原创 浅谈MySQL中的高性能索引
InnoDB中创建自定义哈希索引在B-Tree上自定义hash索引,还是使用B-Tree进行查找,但是它使用哈希值而不是键本身进行索引查找。如果我们需要存储大量的url,并根据url进行搜索查找,因为url很大的字符串会导致查询语句很慢。1.删除原来URL列上的索引,而新增一个被索引的url_crc的列,同时使用crc32做哈希; 此时是通过整数而不是url字符串进行索引比较,因此性能会非常高。SELECT ID FROM url WHERE url_crc=CRC32("http://www
2021-01-18 20:16:51 113
原创 Schema与数据类型优化
关于整数类型:1.整数类型都有可选的UNSIGNED,表示不允许负值。2.为整数类型指定显示宽度是没有意义的,只会控制客户端显示字符的个数。关于实数类型:1.不精确类型:FLOAT,DOUBLE; 精确类型:DECIMAL2.CPU不支持对DECIMAL进行直接运算,可以直接对浮点进行运算;同时,DECIMAL会占用更多的空间,MySQL将数字打包 保存到一个二进制字符串中,每4个字节存储9个数字。3.可以使用BIGINT代替DECIMAL,放大对应倍数即可。CHAR类型的优点:1.
2021-01-18 14:23:31 112
原创 CREATE TABLE标准
以MySQL的sakila数据库中的city表为例,探讨建表语句:CREATE TABLE `city` ( `city_id` smallint(5) unsigned NOT NULL AUTO_INCREMENT, `city` varchar(50) NOT NULL, `country_id` smallint(5) unsigned NOT NULL, `last_update` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP
2021-01-12 15:18:28 223
原创 MySQL慢查询日志浅谈
MySQL的慢查询日志是MySQL提供的一种日志记录,它用来记录在MySQL中响应时间超过阀值的SQL语句,具体指运行时间超过long_query_time值的SQL,则会被记录到慢查询日志中。慢查询日志支持将日志记录写入文件,也支持将日志记录写入数据库表。慢查询日志相关参数:slow_query_log:是否开启慢查询日志,1表示开启,0表示关闭。slow-query-log-file:MySQL数据库慢查询日志存储路径。long_query_time:慢查询阈值,当查询时间多于设定的阈值时,记录
2021-01-12 10:19:09 203
原创 浅谈InnoDB和MyISAM主要对比
① 事务如果应用需要事务支持,那么InnoDB是最稳定的选择。如果不需要事务支持,且主要是SELECT和INSERT操作,那么MyISAM也是不错的选择。② 锁粒度MyISAM支持表级锁定。InnoDB支持行级锁,但是InnoDB表的行锁也不是绝对的,如果在执行一个SQL语句时MySQL不能确定要扫描的范围,InnoDB表同样会锁全表。③ 并发InnoDB采用MVCC来支持高并发,并且实现了4个隔离型级别。在REPEATABLE READ下,通过间隙锁防止幻读的出现。MVCC理解为行级锁的变种,但
2021-01-09 18:04:34 213 1
原创 Spark Yarn模式下出现com.hadoop.compression.lzo.lzoCodec not found
问题:因为之前hadoop集群上配了lzo,spark还没有配置方法:在spark的spark-env.sh中配置lzoexport SPARK_LIBRARY_PATH=$SPARK_LIBRARY_PATH:/opt/module/hadoop-2.7.2/lib/nativeexport SPARK_CLASSPATH=$SPARK_CLASSPATH:/opt/module/hadoop-2.7.2/share/hadoop/common/hadoop-lzo-0.4.20.jar..
2020-12-03 20:09:31 245
原创 ClassLoader.getResourceAsStream()详情
Note:后者加/会出现空指针异常...使用过程中一般不加/关于classpath:
2020-11-02 15:10:29 1919
原创 ThreadLocal实例
如果你定义了一个单实例的java bean,它有若干属性,但是有一个属性不是线程安全的,比如说HashMap。并且碰巧你并不需要在不同的线程中共享这个属性,也就是说这个属性不存在跨线程的意义。那么你不要sychronize这么复杂的东西,ThreadLocal将是你不错的选择。import java.util.HashMap;public class TreadLocalTest { static ThreadLocal<HashMap> map0 = new ThreadLoc
2020-08-29 17:38:56 241
原创 生产者消费者模型(阻塞队列)
public class Main { public static void main(String[] args) { MyResource resource = new MyResource(new ArrayBlockingQueue<>(10)); new Thread(() -> { try { resource.producer(); } catch (Exc
2020-08-24 10:09:50 138
原创 手撕布隆过滤器
class BloomFilterDemo { //设置的位集大小 private int defaultSize = 16 << 24; //最大索引位置 private int maxIndex = defaultSize - 1; //建立一个二进制位集 private BitSet bits = new BitSet(defaultSize); /** * 添加元素的方法 * * @param key
2020-08-18 15:26:45 145
原创 Java死锁实现
public class Main { public static void main(String[] args) { String lock1 = "lock1"; String lock2 = "lock2"; new Person(lock1, lock2).start(); new Person(lock2, lock1).start(); }}class Person extends Thread {
2020-08-17 09:12:25 186
原创 Java-深度理解空指针异常
/** * @author NanShan @create * 2020-07-09 16:09 * * 补充一个知识点: * 空指针异常:调用一个为null的对象的 成员属性或者成员方法时,会出现空指针异常 */public class Main { public static void main(String[] args) { Person p = new Person(); p = null; System.out.println
2020-08-02 14:49:35 138
原创 HashMap源码解析
重要属性分析 /** * 默认初始容量, 当我们new空参构造器,第一次add时会扩容为16 */ static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16 /** * The maximum capacity */ static final int MAXIMUM_CAPACITY = 1 << 30; /** * 默认加载因子0
2020-07-30 21:40:11 131
原创 ArrayList源码分析
底层属性分析 /** * Default initial capacity. * 当我们new一个空参构造器,然后第一次调用add方法时会扩容为10. */ private static final int DEFAULT_CAPACITY = 10; /** * Shared empty array instance used for empty instances. */ private static final Object[
2020-07-10 10:15:39 352
原创 动态代理常用的两种方式
基于接口的动态代理public interface IActor { /** * 基本演出 * * @param money */ void basicActor(float money); /** * 危险演出 * * @param money */ void dangerActor(float money);}public class Actor implements IActor
2020-07-09 20:08:13 228
原创 JUC
标准多线程写法,Lock的经典实用方法//资源类 = 实例变量+实例方法class Ticket { private int number = 30; // List list = new ArrayList(); Lock lock = new ReentrantLock(); public void sale() { lock.lock(); // 放在了try-finally外面 try { if (numb
2020-06-27 09:48:46 140
原创 生产者消费者模型
经典例题:生产者/消费者问题生产者(Productor)将产品交给店员(Clerk),而消费者(Customer)从店员处取走产品,店员一次只能持有固定数量的产品(比如:20),如果生产者试图生产更多的产品,店员会叫生产者停一下,如果店中有空位放产品了再通知生产者继续生产;如果店中没有产品了,店员会告诉消费者等一下,如果店中有产品了再通知消费者来取走产品。class Clerk{ ...
2020-04-09 21:32:09 192
原创 MySQL窗口函数
序号函数row_number() 无间断,重复值时不并列rank() 有间断,重复时并列dense_rank() 无间断,重复时并列分布函数注意code中窗口函数的方法,当一个select语句中有多个窗口函数时很方便。前后函数头尾函数其他函数此函数在数据分析中应用较多,比如由于数据量大,需要将数据平均分配到N个并行的进程分别计算,此时就可以用NFILE(N)...
2020-01-13 09:16:53 268
原创 数据挖掘十大算法(十):K-means聚类算法
一,K-means算法原理基本算法K-means算法是最常用的一种聚类算法。算法的输入为一个样本集(或者称为点集),通过该算法可以将样本进行聚类,具有相似特征的样本聚为一类。算法步骤:step1:选定要聚类的类别数目k,同时选定初始中心点step2:寻找组织,将每一个样本点分给k个中心点(根据距离)step3:重新计算新的中心点step4:判断中心点是否发生变化,若变化则重复,否则b...
2020-01-07 10:19:40 739
原创 重新理解开窗函数
select deptno, count(*) from empgroup by deptno;输出结果:select deptno, count(*) over()from empgroup by deptno;输出结果:select deptno, count(*) over()from emp;输出结果:通过这个例子,体会开窗函数的强大:select ...
2020-01-03 15:26:36 307
原创 数据挖掘十大算法(九):PageRank算法原理与实现
一、简介PageRank,又称网页排名、谷歌左侧排名,是一种由搜索引擎根据网页之间相互的超链接计算的技术,而作为网页排名的要素之一,以Google公司创办人拉里·佩奇(Larry Page)之姓来命名。Google用它来体现网页的相关性和重要性,在搜索引擎优化操作中是经常被用来评估网页优化的成效因素之一。假设一个由4个网页组成的群体:A,B,C和D。如果所有页面都只链接至A,那么A的PR(Pa...
2019-12-30 10:18:36 731 1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人