NAS相关
群晖APK下载
Moments
SwitchyOmega
规则地址
SwitchOmega备份文件
布隆过滤器
原理
一个很长的二进制向量和一系列随机映射函数。主要用于判断一个元素是否在一个集合中。
布隆过滤器的原理是,当一个元素被加入集合时,通过K个散列函数将这个元素映射成一个位数组中的K个点,把它们置为1。
检索时,我们只要看看这些点是不是都是1就(大约)知道集合中有没有它了:如果这些点有任何一个0,则被检元素一定不在;如果都是1,则被检元素很可能在。这就是布隆过滤器的基本思想。
数据结构BloomFilter 是由一个固定大小的二进制向量或者位图(bitmap)和一系列映射函数组成的。
在初始状态时,对于长度为 m 的位数组,它的所有位都被置为0,如下图所示:
当有变量被加入集合时,通过 K 个映射函数将这个变量映射成位图中的 K 个点,把它们置为 1(假定有两个变量都通过 3 个映射函数)。
查询某个变量的时候我们只要看看这些点是不是都是 1 就可以大概率知道集合中有没有它了。
如果这些点有任何一个 0,则被查询变量一定不在;
如果都是 1,则被查询变量很可能存在。为什么说是可能存在,而不是一定存在呢?那是因为映射函数本身就是散列函数,散列函数是会有碰撞的。
误判率布隆过滤器 ...
MySQL中JOIN语句的优化
SQL语句的JOIN原理:数据库中的join操作,实际上是对一个表和另一个表的关联,而很多错误理解为,先把这两个表来一个笛卡尔积,然后扔到内存,用where和having条件来慢慢筛选,其实数据库没那么笨的,那样会占用大量的内存,而且效率不高,比如,我们只需要的一个表的一些行和另一个表的一些行,如果全表都做笛卡尔积,这开销也太大了,真正的做法是,根据在每一个表上的条件,遍历一个表的同时,遍历其他表,找到满足最后的条件后,就发送到客户端,直到最后的数据全部查完,叫做嵌套循环查询。
LEFT JOIN 和 RIGHT JOIN优化在MySQL中,实现如 A LEFT JOIN B join_condition 如下:
1、表B依赖赖与表A及所有A依赖的表
2、表A依赖于所有的表,除了LEFT JOIN 的表(B)
3、join_condition决定了怎样来读取表B,where条件对B是没有用的
4、标准的where会和LEFT JOIN联合优化
5、如果在A中的一行满足where和having条件,B中没有,会被填充null
RIGHT JOIN 与LEFT JOIN类似,这个位置是可以 ...
MySQL的工作流程
MySQL的工作流程
连接器①负责与客户端的通信,是半双工模式,这就意味着某一固定时刻只能由客户端向服务器请求或者服务器向客户端发送数据,而不能同时进行。
②验证请求用户的账户和密码是否正确,如果账户和密码错误,会报错:Access denied for user 'root'@'localhost' (using password: YES)
③如果用户的账户和密码验证通过,会在MySQL自带的权限表中查询当前用户的权限:
分析器分析器的主要作用是将客户端发过来的sql语句进行分析,这将包括预处理与解析过程,在这个阶段会解析sql语句的语义,并进行关键词和非关键词进行提取、解析,并组成一个解析树。具体的关键词包括不限定于以下:select/update/delete/or/in/where/group by/having/count/limit等.如果分析到语法错误,会直接给客户端抛出异常:ERROR:You have an error in your SQL syntax.
优化器能够进入到优化器阶段表示sql是符合MySQL的标准语义规则的并且可以 ...
3个线程顺序打印1-100的值
12345678910111213141516171819202122232425262728293031323334353637383940414243package problem;import java.util.concurrent.locks.ReentrantLock;/** * @Autor HumgTop * @Date 2021/5/26 9:35 * @Version 1.0 * 3个线程顺序打印数字 1-100 */public class ShunXuDaYin1_100DeZhi { static int num = 0; static ReentrantLock lock = new ReentrantLock(); public static void main(String[] args) { new MyThread(0).start(); new MyThread(1).start(); new MyThread(2).start(); } stat ...
CAS操作的底层实现原理
CAS操作(又称为无锁操作)是一种乐观锁策略,它假设所有线程访问共享资源的时候不会出现冲突,既然不会出现冲突自然而然就不会阻塞其他线程的操作。因此,线程就不会出现阻塞停顿的状态。那么,如果出现冲突了怎么办?无锁操作是使用CAS(compare and swap)又叫做比较交换来鉴别线程是否出现冲突,出现冲突就重试当前操作直到没有冲突为止。
CAS操作是一种通过硬件实现并发安全的常用技术,底层通过利用CPU的CAS指令对缓存加锁或总线加锁的方式来实现多处理器之间的原子操作。
操作过程CAS比较交换的过程可以通俗的理解为CAS(V,O,N),包含三个值分别为:V是内存地址存放的实际值;O 预期的值(旧值);N 更新的新值。当V和O相同时,也就是说旧值和内存中实际的值相同表明该值没有被其他线程更改过,即该旧值O就是目前来说最新的值了,自然而然可以将新值N赋值给V。反之,V和O不相同,表明该值已经被其他线程改过了则该旧值O不是最新版本的值了,所以不能将新值N赋给V,返回V即可。
当多个线程使用CAS操作一个变量是,只有一个线程会成功,并成功更新,其余会失败。失败的线程会自旋,一定次数后若仍未成 ...
单核CPU的线程安全问题
单核CPU多线程存在线程安全问题吗?
非原子操作还是会存在线程安全问题,比如2个线程对变量a进行自增操作,每个线程自增10次。可能会重排序出现下列情况:
线程1读a;
线程2读a;
线程1写a;
线程2写a;
此时,2个线程对a写了2次,但a的值只+1,出现线程不安全问题。
单核CPU多线程存在可见性问题吗?
不存在可见性问题
多线程在单个CPU上使用的是同一个工作内存区域,在单核CPU上,无论创建了多少个线程,同一时刻只会有一个线程能够获取到CPU的资源来执行任务,即使这个单核的CPU已经添加了缓存。这些线程都是运行在同一个CPU上,操作的是同一个CPU的缓存,只要其中一个线程修改了共享变量的值,那另外的线程就一定能够访问到修改后的变量值。
JVM有垃圾回收机制,那为什么还会出现内存泄漏?
长生命周期的对象持有短生命周期对象的引用,导致短生命周期对象迟迟不能被垃圾回收器回收,此时很大可能会出现内存泄露。
像HashMap、Vector等的使用最容易出现内存泄露,这些静态变量的生命周期和应用程序一致,他们所引用的所有的对象Object也不能被释放,因为他们也将一直被Vector等引用着。
不正确使用单例模式是引起内存泄漏的一个常见问题,单例对象在初始化后将在JVM的整个生命周期中存在(以静态变量的方式),如果单例对象持有外部的引用,那么这个对象将不能被JVM正常回收,导致内存泄漏。
各种连接
比如数据库连接(dataSourse.getConnection()),网络连接(socket)和io连接,除非其显式的调用了其close()方法将其连接关闭,否则是不会自动被GC 回收的。对于Resultset 和Statement 对象可以不进行显式回收,但Connection 一定要显式回收,因为Connection 在任何时候都无法自动回收,而Connection一旦回收,Resultset 和Statement 对象就会立即为NULL。但是如果使用连接池,情况就不一样了,除 ...
什么是覆盖索引?
在SQL执行流程中从非主键索引树搜索回到主键索引树搜索的过程称为:回表
在本次查询中因为查询结果只存在主键索引树中,我们必须回表才能查询到结果,那么如何优化这个过程呢?下面引入覆盖索引。
覆盖索引(covering index ,或称为索引覆盖)即从非主键索引中就能查到的记录,而不需要查询主键索引中的记录,避免了回表的产生,减少了树的搜索次数,显著提升性能。
使用建立表student,id为主键索引,name为普通索引。
那么现在出现的业务需求中要求根据名称获取学生的年龄,并且该搜索场景非常频繁,那么先删除之前以字段name建立的普通索引,以name和age两个字段建立联合索引,SQL命令与建立后的索引树结构如下:
12ALTER TABLE student DROP INDEX I_name;ALTER TABLE student ADD INDEX I_name_age(name, age);
执行如下SQL:
1SELECT age FROM student WHERE name = '小李';
流程为:
在name,age联合索引树上找到名 ...