珍爱生命,远离度盘
事情的起因是这样的,有群友想要一部文字游戏的资源(魔法使之夜,全年龄,TYPEMOON代表作),而我恰好有,就通过私聊分享给了他。具体过程如下:
魔法使之夜我先从小号网盘里的游戏(游戏1)分享给主网盘,保存后主网盘(游戏2)又复制了一份该游戏(游戏3,同样保存在主网盘),之后将复制出来的游戏(游戏3)又私信分享给网友,同时我自己又在电脑上开始下载该游戏(游戏2),但下载到一半暂停下载了,等到第二天时,再下载发现 游戏1 2 3 全都无法下载且无法分享。
群友举报资源的可能性很低,所以被封禁的最可能的原因是云盘官方在下载过程中查看了资源内容,然后封禁。
意识到这一点我痛定思痛,为了避免将来这种情况再次发生,我决定逐步弃用百度网盘。
而为了寻找尽可能安全的替代品,我将目光投向了OneDrive。
OneDrive扩容OneDrive个人免费容量只有5G,为了获得更多的容量,我加入了Microsoft 365 开发者计划,在这个计划中,参与人OneDrive最低可获得1T容量(空间的可以自行设置的,最高5T),最初的订阅时间只有90天,如何参与人比较活跃,使用Microsoft 36 ...
如何利用主键索引提高效率
通过本文你可以了解B+树索引的数据结构,计算机系统的内存预读机制,以及不同种类主键对B+树索引的影响从而了解如何利用主键索引提高索引效率。
情景与解决方案我曾经用SpringBoot与Vue写过一个管理电子书的项目,可以对电子书进行增删改查,主键使用uuid。在初步完成这个项目后,我造了一部分数据去测试系统效率,发现效率并不快,尤其在增加与删除数据时。
而这个效率慢与主键索引有关,这要从MySQL的数据结构说起:
MySQL有多个存储引擎,每种引擎各有特点,从索引角度来说如下:
存储引擎
索引
memory
hash
InnoDB
B+树
MyISAM
B+树
更详细的在我这篇文章:MySQL索引数据结构浅聊 | TheSeasonSun
现在最常用的是InnoDB,它的索引为B+树,数据结构如下图:
注意:在B+Tree上有两个头指针,一个指向根节点,另一个指向关键字最小的叶子节点,而且所有叶子节点(即数据节点)之间是一种链式环结构。因此B+Tree 支持两种查找运算:一种是对于主键的范围查找和分页查找,另一种是从根节点开始,进行随机查找。
当MySQL ...
高并发时为什么是四层负载均衡?
在说明负载均衡模型之前应该先说以下前置知识:网络
我们都知道网络通信时网络模型,以5层模型为例,如图:
客户端发起通信的过程大致可以简略描述为以下步骤:
客户端应用层某个进程向服务端发起通信时,所发出的信息会携带该进程的端口号(通信时端口号为某个进程的具体标识),向下传递给传输控制层的TCP协议封装成报文,TCP协议再向下传输给网络层的IP协议组成报文,之后再向下在数据链路层组成MAC报文,最后交给物理层传输向其他设备。
最后的报文简单来说如下:
那么目标服务器的各个地址是如何得知的呢?
IP地址是由DNS域名向浏览器缓存,操作系统缓存等等地方解析而来的。
MAC地址是由已知的IP地址通过ARP协议广播得到的。注意MAC地址并非是目标服务器的MAC地址,而是去往目标服务器的道路上的下一个设备。
报文正是这样通过MAC地址传递到一个一个设备,最后到达服务器的。所以我们可以看到路由器和交换机都有数据链路层,因为报文需要在数据链路层来提取并再封装为新的MAC报文以传递到下一个设备。
在高并发情况下,多个请求涌向服务器会使服务器不堪重负,效率很慢,这种情况的解决方案也很朴实:多设几个服 ...
MySQL调优之索引匹配方式与优化细节
索引匹配方式下面举例皆在索引 idx(name,age,pos)建立前提下
全值匹配全值匹配指的是和索引中的所有列进行匹配
匹配最左前缀只匹配前面的几列
匹配列前缀可以匹配某一列的值的开头部分
比如:select * from staffs where name like ‘J%’;这个语句可以利用到用name建立的索引进行查找。但是如果是 select * from staffs where name like ‘%J%’;就无法用到。
匹配范围值可以查找某一个范围的数据
比如:explain select * from staffs where name > ‘Mary’;
精确匹配某一列并范围匹配另外一列可以查询第一列的全部和第二列的部分
比如:explain select * from staffs where name = ‘July’ and age > 25;
只访问索引的查询查询的时候只需要访问索引,不需要访问数据行,本质上就是覆盖索引
哈希索引哈希索引是memory存储引擎使用的索引,memory的数据文件存储在内存中,这是它效率很高的原因,但正因如此 ...
MySQL之数据类型,范式,主键,字符集
要在数据类型方面优化MySQL,应该先理解MySQL的各个数据类型的特点和范围
MySQL数据类型数值类型
类型
大小
范围(有符号)
范围(无符号)
用途
TINYINT
1 Bytes
(-128,127)
(0,255)
小整数值
SMALLINT
2 Bytes
(-32 768,32 767)
(0,65 535)
大整数值
MEDIUMINT
3 Bytes
(-8 388 608,8 388 607)
(0,16 777 215)
大整数值
INT或INTEGER
4 Bytes
(-2 147 483 648,2 147 483 647)
(0,4 294 967 295)
大整数值
BIGINT
8 Bytes
(-9,223,372,036,854,775,808,9 223 372 036 854 775 807)
(0,18 446 744 073 709 551 615)
极大整数值
FLOAT
4 Bytes
(-3.402 823 466 E+38,-1.175 494 351 E-38),0,(1.175 494 351 ...
MySQL索引类型,优点及使用原则
索引类型逻辑分类按功能分类主键索引:一张表只能有一个主键索引,不允许重复、不允许为 NULL
唯一索引:数据列不允许重复,允许为 NULL 值,一张表可有多个唯一索引,索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须唯一
普通索引:一张表可以创建多个普通索引,一个普通索引可以包含多个字段,允许数据重复,允许 NULL 值插入
全文索引:它查找的是文本中的关键词,主要用于全文检索
按列数分类单例索引:一个索引只包含一个列,一个表可以有多个单例索引
组合索引:一个组合索引包含两个或两个以上的列。查询的时候遵循 mysql 组合索引的 “最左前缀”原则,即使用 where 时条件要按照建立索引的时候字段的排列方式放置索引才会生效
物理分类聚簇索引:指的是数据跟对应的索引列紧凑的存储在一起的数据存储方式。
非聚簇索引:数据跟索引分开存储
InnoDB和MyISAM存储引擎都默认使用B+树结构存储索引,但是只有InnoDB的主键索引才是聚簇索引,InnoDB中的辅助索引以及MyISAM使用的都是非聚簇索引。这与存储引擎的文件系统的不同有关。
存储引擎为MyISAM:
* ...
MySQL索引数据结构浅聊
聊一下索引的底层数据结构,着重介绍现在用的比较广泛的B树与B+树。
hash 表hash表的数据结构在此就不多赘述了,直接说hash表的缺点:
需要大量内存空间,因为每次使用hash表的时候都需要将全量的数据加载到内存中。(memory存储引擎使用hash索引)
使用hash表时需要设计优秀的hash算法,否则会导致数据分布不均匀,浪费存储空间,查询效率低下。
hash表只能支持等值搜索,不能范围或区间搜索。比如要查询id < 500的人,hash表只能从1到499依次查出来。这是hash表比较致命的缺点。
二叉树使用二叉搜索树可以使用二分查找方式查找数据,但是如果插入的数据是递增的,二叉树就会退化成链表,树的深度也很大,而树的深度与查找次数成正比(下面会解释,减少树的深度正是提高索引效率的核心思路之一)。因此单纯的二叉搜索树效率可能会低下。
那么使用二叉平衡树(AVL树)呢?二叉平衡树要求左右子树高度差不大于1,这避免了上面数据退化成链表的情况,提高了搜索效率,但是在插入数据时,二叉平衡树为了保证平衡性,插入时要进行旋转,而这降低了插入效率。此外,在数据量大的情况下,二 ...
MySQL performance schema简述
performance_schema的介绍MySQL的performance schema 用于监控MySQL server在一个较低级别的运行过程中的资源消耗、资源等待等情况。
performance_schema特点
它提供了一种在数据库运行时实时检查server的内部执行情况的方法。performance_schema 数据库中的表使用performance_schema存储引擎。该数据库主要关注数据库运行过程中的性能相关的数据(information_schema主要关注server运行过程中的元数据信息)。
performance_schema通过监视server的事件来实现监视server内部运行情况, “事件”就是server内部活动中所做的任何事情以及对应的时间消耗。利用这些信息来判断server中的相关资源消耗在了哪里?一般来说,事件可以是函数调用、操作系统的等待、SQL语句执行的阶段(如sql语句执行过程中的parsing 或 sorting阶段)或者整个SQL语句与SQL语句集合。事件的采集可以方便的提供server中的相关存储引擎对磁盘文件、表I/O、表锁等 ...
synchronized
面试题模拟银行账户,对业务写方法加锁,对业务读方法不加锁,这样行不行?
不行
1234567891011121314151617181920212223242526272829303132333435363738394041424344容易产生脏读问题(dirtyRead)public class Account { String name; double balance; public synchronized void set(String name, double balance) { this.name = name; try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } this.balance = balance; } public /*synchronized*/ double getBalance(String name) { return this ...
并发编程三大特性
并发编程之可见性加入一个线程t1运行时使用一个变量(把这个变量从主存复制下来存到线程内部),这时线程t2修改了这个变量,但是t1线程无法读到修改后的变量值。这就是线程的不可见性。
123456789101112131415161718192021222324252627282930313233343536373839/** * volatile 关键字,使一个变量在多个线程间可见 * A B线程都用到一个变量,java默认是A线程中保留一份copy,这样如果B线程修改了该变量,则A线程未必知道 * 使用volatile关键字,会让所有线程都会读到变量的修改值 * * 在下面的代码中,running是存在于堆内存的t对象中 * 当线程t1开始运行的时候,会把running值从内存中读到t1线程的工作区,在运行过程中直接使用这个copy,并不会每次都去 * 读取堆内存,这样,当主线程修改running的值之后,t1线程感知不到,所以不会停止运行 * * 使用volatile,将会强制所有线程都去堆内存中读取running的值 * * volatile并不能保证多个线程共同修改ru ...