自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(139)
  • 资源 (6)
  • 收藏
  • 关注

原创 JVM(2)

Java的内存模型是一种规范,用于定义Java程序中线程之间如何进行变量的读写操作。它描述了Java程序如何在主内存、工作内存和线程之间进行数据交互。Java的内存模型包括以下几个关键概念:1. 主内存(Main Memory):主内存是所有线程共享的内存区域,存储着所有的变量数据。2. 工作内存(Working Memory):工作内存是线程独享的内存区域,用于存储主内存中的变量副本。每个线程都有自己的工作内存。

2024-04-23 22:23:48 510

原创 JVM(1)

JVM和调优面试题

2024-04-23 21:42:29 399

原创 并发(14)

当提交一个任务时,线程池创建一个线程执行任务,直到当前线程数等于corePoolSize,即使有其他空闲线程能够执行新来的任务,也会继续创建线程;程序中我们创建了固定大小为5个工作线程的线程池。然后分配给线程池十个工作,因为线程池大小为五,他将启动五个工作线程先处理五个工作,其他的工作则处于等待状态,一旦有工作完成,空闲下来工作线程就会捡取等待队列里面的其他工作进行执行。这五个线程不随着工作完成而消亡,会一直存在,并负责执行分配给线程池的任务,直到线程池消亡。如果是,则创建一个新的工作线程来执行任务。

2024-04-23 14:26:16 214

原创 ElasticSearch(3)

理解管道聚合的关键是理解聚合结果和分桶的概念,以及在聚合结果上执行的各种操作。ES在Lucene的基础上进行了分布式的扩展,实现了数据的分片、副本和节点之间的协作。总结起来,ES的结构由节点、索引、文档、分片和副本组成,底层实现基于Lucene,通过倒排索引等核心技术实现高性能的搜索和分析功能。ES(Elasticsearch)中的管道聚合是一种特殊类型的聚合,它可以在聚合结果上执行各种操作,例如计算、转化和过滤等。副本是分片的拷贝,存储在不同的节点上,可以提供读取和搜索的负载均衡和故障容错。

2024-04-16 22:05:19 966

原创 Elasticsearch(2)

在Elasticsearch中,复合查询是一种结合了多个子查询的查询方式,它可以根据不同的逻辑关系(如AND、OR、NOT)来组合子查询,并根据不同的评分机制来计算最终的查询评分。以下是几种常见的复合查询方式:1. Bool Query(布尔查询):通过组合多个子查询,使用逻辑操作符(must、must_not、should)来表示子查询之间的关系。must表示所有的子查询必须满足条件,must_not表示所有的子查询都不能满足条件,should表示至少有一个子查询满足条件。

2024-04-16 21:53:36 819

原创 Elasticsearch(1)

随着时间的增长索引的数量也会持续增长,然而这些场景基本上只有最近一段时间的数据有使用价值或者会被经常使用(热数据),而历史数据几乎没有作用或者很少会被使用(冷数据),这个时候就需要对索引进行一定策略的维护管理甚至是删除清理,否则随着数据量越来越多除了浪费磁盘与内存空间之外,还会严重影响Elasticsearch的性能。Query和Filter可以组合使用,通过filter来过滤掉不符合条件的文档,再通过query来计算文档的相关性得分。Match Query:匹配查询,根据指定字段的内容进行全文匹配查询。

2024-04-16 17:49:29 894 2

原创 数据库-Redis(19)

​​​​​​​。

2024-04-16 16:50:54 824

原创 数据库-Redis(18)

Redis 分布式锁的实现可以通过以下几个步骤:获取锁:使用 SETNX 命令尝试在 Redis 中设置一个键值对,键作为锁的名称,值作为唯一标识符(例如请求的 UUID)。如果 SETNX 返回 1,表示获取到了锁,可以执行后续操作。如果 SETNX 返回 0,则表示锁已被其他客户端持有,可以选择等待一段时间后重试或直接放弃。设置锁超时时间:设置锁的超时时间,防止锁被长时间占用。可以使用 SETEX 命令为锁设置一个过期时间,确保在一段时间后自动释放锁。执行业务逻辑。

2024-04-16 08:21:16 641

原创 数据库-Redis(17)

Redis-Cluster是一种服务器sharding技术,Redis3.0以后版本正式提供支持。Redis-Cluster没有使用一致性hash,而是引入了哈希槽的概念。Redis-Cluster中有16384(即2的14次方)个哈希槽,每个key通过CRC16校验后对16383取模来决定放置哪个槽。Cluster中的每个节点负责一部分hash槽(hash slot)。比如集群中存在三个节点,则我可能存在一种分配如下:1.节点a包括0-5500号哈希槽;2.节点b包含5501-11000号哈希槽;

2024-04-15 23:43:54 513

原创 数据库-Redis(16)

Redis发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息。Redis的SUBSCRIBE命令可以让客户端订阅任意数量的频道,每当有新信息发送到被订阅的频道时,信息就会被发送给所有订阅指定频道的客户端。作为例子,下图展示了频道channel,以及订阅这个频道的三个客户端-client2,client5和Client1之间的关系:当有新消息通过PUBLISH命令发送给频道channel1时。

2024-04-15 22:59:10 738

原创 数据库-Redis(15)

由于quronum=2,所以当一个哨兵判断主库“主管下线”后,询问另外一个哨兵后也会得到同样的结果,2个哨兵都判定“主观下线”,达到了quorum的值,因此,哨兵集群可以判定主库为“客观下线”。哨兵标记主库“客观下线”后,在选举“哨兵领导者”时,一个哨兵必须拿到超过多数的选票(5/2+1=3票)。接着,其他哨兵会根据自己和主库的连接情况,作出Y或者N的响应,Y相当于赞成票,N相当于反对票。以3个哨兵为例,假设此时的quorum设置为2,那么任何一个想成为Leader的哨兵只要拿到2张赞成票,就可以了。

2024-04-15 21:13:55 631

原创 数据库-Redis(14)

在主从全量数据同步时,传输RDB文件可以尽量降低对主库机器网络带宽的消耗,从库在加载RDB文件时,一是文件小,读取整个文件的速度会很快,而是因为RDB文件存储的都是二进制数据,从库直接按照RDB协议解析还原数据即可,速度会非常快,而AOF需要依次重放每个写命令,这个过程会经历冗长的处理逻辑,恢复速度相比RDB会慢得多,所以使用RDB进行主从全量复制的成本最低。级联的“主-从-从”模式好了,到这里,我们了解了主从间通过全量复制实现数据同步的过程,以及通过“主-从-从”模式分担主库压力的方式。

2024-04-15 18:24:24 762

原创 数据库-Redis(13)

replication buffer:Redis和客户端通信也好,和从库通信也好,Redis都需要给分配一个内存Buffer进行数据交互,客户端是一个Client,从库也是一个Client,我们每个Client脸上Redis后,Redis都会分配一个Client Buffer,所有数据交互都是通过这个Buffer进行的:Redis先把数据写到这个Buffer中,然后再把Buffer中的数据发到Client Socket中再通过网络发送出去,这样子就完成了数据交互。第二阶段,主库将所有数据同步给从库。

2024-04-15 16:47:20 812

原创 数据库-Redis(12)

基于Lua脚本,Redis可以保证脚本内的命令一次性,按顺序地执行,其同时也不提供事务运行错误的回滚,执行过程中如果部分命令运行错误,剩下的命令还是会继续运行完。这就是说,从实用性的角度来说,失败的命令是由编程错误造成的,而这些错误应该在开发的过程中被发现,而不应该出现在生产环境中。事务是不保证持久性的,这是因为Redis持久化策略中不管是RDB还是AOF都是异步执行的,不保证持久性是出于对性能的考虑。Redis官方文档给的理解是,Redis的事务是原子性:所有的命令,要么全部执行,要么全部不执行。

2024-04-15 14:29:14 837 1

原创 数据库-Redis(11)

Redis事务的本质是一组命令的集合。事务支持一次执行多个命令,一个事务中所有命令都会被序列化。在事务执行过程,会按照顺序串行化执行队列中的命令,其他客户端提交的命令请求不会插入到事务执行命令序列中。总结说:Redis事务就是一次性,顺序性,排他行的执行一个队列中的一系列命令。

2024-04-14 20:41:47 430

原创 数据库-Redis(10)

当使用LFU策略筛选淘汰数据时,首先会根据数据的访问次数进行筛选,把访问次数最低的数据淘汰出缓存。如果两个数据的访问次数相同,LFU策略再比较这两个数据的访问时效性,把举例上一次访问时间更久的数据淘汰出缓存。Redis只使用了8位记录数据的访问次数,而8位记录的最大值是255,这样子在访问快速的情况下,如果每次被访问就将访问次数加1,很快退化为LRU算法了。当LFU策略筛选数据时候,Redis会在候选集合中,根据数据lru字段的后8位选择访问次数最少得数据进行淘汰。对设置了过期时间的数据中进行淘汰。

2024-04-14 19:02:11 668

原创 数据库-Redis(9)

由于主节点的惰性删除和定期删除策略,都不能保证主节点及时对过期数据执行删除操作,因此,当客户端通过Redis从节点读取数据时,很容易读取到已经过期的数据。在主进程有数据写入时,而这个数据刚好在页c中,操作系统会创建这个页面的副本(页c的副本),即拷贝当前页的物理数据,将其映射到主进程中,而子进程还是使用原来的页c。定期删除:服务器执行定时任务删除过期数据,但是考虑到内存和CPU的折中)删除会释放内存,但是频繁的删除操作对CPU不友好),该删除的频率和执行时间都受到了限制。

2024-04-14 18:15:07 878

原创 数据库-Redis(8)

Redis通过创建一个新的AOF文件来替换现有的AOF,新旧两个AOF文件保存的数据相同,但新AOF文件没有了冗余命令。

2024-04-14 17:28:41 950

原创 数据库(7)

此时该消息的delivery counter就会累加,当累加到某个我们预设的临界值时,我们就认为是坏消息(也叫死信,deadletter,无法投递的 消息),由于有了判定条件,我们将坏消息处理掉即可,删除即可。而且,AOF日志也只用记录两次快照间的操作,也就是说,不需要记录所有操作了,因此,就不会出现文件过大的情况了,也可以避免重写开销。如下图所示,T1和T2时刻的修改,用AOF日志记录,等到第二次做全量快照时,就可以清空AOF日志,因为此时的修改都已经记录到快照中了,恢复时就不再用日志了。

2024-04-14 16:23:12 451

原创 数据库(6)

为了保证消息是有序的, 因此Redis生成ID是单调递增有序的。若发现当前时间戳退后(小于latest_generated_id所记录的),则采用时间戳不变而序号递增的方案来作为新消息ID(这也是序号为什么使用int64的原因,保证有足够的序号),从而保证ID的单调递增性质。上面的结果我们可以看到,我们之前读取的消息,都被记录在Pending列表中,说明全部读到的消息都没有处理,仅仅是读取了。强烈建议使用Redis的方案生成消息ID,因为这种时间戳+序号的单调递增的ID方案,几乎可以满足你全部的需求。

2024-04-14 09:15:00 307

原创 数据库(5)

而对于SDS数据类型,在进行字符修改的时候,会首先根据记录的len属性检查内存空间是否满足需求,入过不满足,会进行相应的空间扩展,然后在进行修改操作,所以不会出现缓冲区溢出。比如说,集合类型就可以由字典和整数集合两种不同的数据 结构实现,但是 ,当用户执行ZADD命令时,他/她应该不必关心集合使用的是什么编码,只要Redis能按照ZADD命令的指示,将新元素添加到集合就可以了。对字符串进行空间扩展的时候,扩展的内存比实际需要的多,这样可以减少连续执行字符串增长操作所需要的内存重分配次数。

2024-04-14 08:30:00 553

原创 数据库(4)

Redis是一种支持key-value等多种数据结构的存储系统。可用于缓存,事件发布或者订阅,高速队列等场景。支持网络,提供字符串,哈希,列表,队列,集合结构直接存取,基于内存,可持久化。读写性能优异Redis能读的速度是110000次/s,写的速度是81000次/s数据类型丰富Redis支持二进制案例的String,Lists,Hashes,Sets以及Ordered Sets数据类型操作。原子性Redis的所有操作都是原子性的,同时Redis还支持对几个操作全并后的原子性执行。丰富的特性。

2024-04-14 08:00:00 340

原创 数据库(3)

覆盖索引指的是在一次查询中,如果一个索引包含或者说覆盖所有需要查询的字段的值,我们就称之为覆盖索引,而不再需要回表查询。而要确定一个查询是否是覆盖索引,我们只需要explain SQL语句看Extra的结果是否是"Using index"即可。什么是MVCC?MVCC,全称Multi-Version Concurrency Control,即多版本并发控制。MVCC是一种并发控制的方法,一般在数据库管理系统中,实现对数据库的并发访问,在编程语言中实现事务内存。

2024-04-13 21:21:36 953

原创 数据库(2)

什么是B+树?B+树是基于B tree和叶子节点顺序访问指针进行实现,它具有b tree的平衡性,并且通过顺序访问指针来提高区间查询的性能。在B+树中,一个节点中的key从左到右非递减排列,如果某个指针的左右相邻key分别是keyi和keyi+1,且不为null,则该指针指向节点的所有key大于等于keyi且小于等于keyi+1。为什么是B+tree?为了减少磁盘读取次数,决定了树的高度不能高,所以鼻血是先b-tree;以页为单位读取使得一次I/O就能完全载入一个节点,且相邻的节点也能够被预先载入。

2024-04-13 15:56:06 539 1

原创 数据库(1)

事务指的是满足ACID特性的一组操作,可以通过Commit提交一个事务,也可以使用Rollback进行回滚。事务的基本特性ACID?A原子性(atomicity)指的是一个事务中的操作要么全部成功,要么全部失败。C一致性(consistency)指的是数据库总是从一个一致性的状态转换到另外一个一致性的状态。比如A转账给B100块钱,假设中间SQL执行过程中系统崩溃A也不会损失100块,因为事务没有提交,修改也就不会保存到数据库。

2024-04-13 14:25:55 615

原创 并发(13)

java.util.concurrent包里的BlockingDeque接口表示一个线程放入和提取实例的双端队列。BlockingDeque类是一个双端队列,在不能插入元素时,他将阻塞住试图插入元素的线程;在不能抽取元素时,他将阻塞住试图抽取的线程。deque(双端队列)是”Double Ended Queue“的缩写。因此,双端队列是一个你可以从任意一端插入或者抽取元素的队列。在线程既是一个队列的生产者又是这个队列的消费者的时候可以使用到BlockingDeque。

2024-01-08 19:25:43 936 1

原创 并发(12)

BlockingQueue通常用于一个线程生产对象,而另一个线程消费这些对象的场景。下图是对这个原理的阐述:一个线程往里边放,另外一个线程从里面取的一个BlockingQueue。一个线程将会持续生产新对象并将其插入到队列之中,直到队列达到他所能容纳的临界点。也就是说,他是有限的。如果该阻塞队列到达了其临界点,负责生产的线程将会在往里面插入新对象时发生阻塞。他会一直处于阻塞之中,直到负责消费的线程从队列中拿走一个对象。负责消费的线程将会一直从该阻塞队列中拿出对象。

2024-01-08 16:47:50 922

原创 并发(11)

而树化的临界值选择8是通过泊松分布算出的,结点个数为8出现的几率是亿分之6。

2024-01-08 13:46:15 406

原创 并发(10)

ReentrantReadWriteLock为什么不支持锁升级?ReentrantReadWriteLock不支持锁升级(把持读锁,获取写锁,最后释放读锁的过程)。目的也是保证数据可见性,如果读锁已经被多个线程获取,其中任意线程成功获取了写锁并更新了数据,则其更新对其他获取到读锁的线程是不可见的。

2024-01-08 13:02:29 937

原创 并发(9)

AQS定义了两种资源获取方式:独占(只有一个线程能独立访问执行,又根据是否按队列的顺序分为公平锁和非公平锁,如ReentrantLock)共享(多个线程可同时访问执行,如Semaphore,CountDownLatch,CyclicBarrier)。ReentrantReadWriteLock可以看成是组合式,允许多个线程同时对某一资源进行读。可重入:(来源于维基百科)若一个程序或子程序可以”在任意时刻中断然后操作系统调度执行另外一段代码,这点代码又调用了该子程序不会出错“,则成其为可重入的。

2024-01-08 12:04:37 860

原创 并发(8)

AQS是一个用来构建锁和同步器的框架,使用AQS能简单且高效的构造出应用广泛的大量的同步器,比如我们提到的ReentrantLock,Semaphore,其他的诸如ReentrantReadWriteLock,SynchronousQueue,FutureTask等等皆是基于AQS的。AQS核心思想是,如果请求的共享资源空闲,则将当前请求资源的线程设置为有效的工作线程,并且将共享资源设置为锁定状态。

2024-01-07 16:54:49 872

原创 并发(7)

说明:本程序先执行park,然后再执行unpark,进行同步,并且在unpark的前后都调用了getBlocker,可以看到两次的结果不一样,并且第二次调用的结果为null,这是因为在调用unpark之后,执行了Lock.park(Object blocker)函数中的setBlocker(t,null)函数,所以第二次调用getBlocker时为Null。使用wait/notify实现同步时,必须先调用wait,后调用notify,如果先调用notify,再调用wait,将起不了作用。

2024-01-07 16:02:49 353

原创 并发(6)

CAS的全称为Compare-And-Swap,直译就是对比交换。是一条CPU的原子指令,其作用是让CPU先进性比较两个值相等,然后原子地更新某个位置的值,经过调查发现,其实现方式是基于硬件平台的汇编指令,就是说CAS是靠硬件实现的,JVM只是封装了汇编调用,那些AtomicInteger类便是使用了这些封装后的接口。简单解释:CAS操作需要输入两个数值,一个旧值(期望操作前的值)和一个新值,在操作期间先比较下载旧值有没有发生变化,如果没有发生变化,才交换成新值,发生了变化则不交换。

2024-01-07 15:38:16 808

原创 并发(6)

StampedLock控制锁有三种模式(写,读,乐观读),一个StampedLock状态是由版本和模式两个部分组成,锁获取方法返回一个数字作为票据stamp,他用相应的锁状态表示并控制访问,数字0表示没有写锁被授权访问。其基本的特性就是在多线程环境下,当有多个线程同时执行这些类的实例包含的方法时,具有排他性,即当某个线程进入方法,执行其中的指令时,不会被其他线程打断,而别的线程就像自旋锁一样,一直等到该方法执行完成,才由JVM从等待队列中选择另一个线程进入,这只是一种逻辑上的理解。

2024-01-07 14:45:16 762

原创 并发(5)

在一个线程中,初次读对象引用和初次读该对象包含的final域,JMM会禁止这两个操作的重排序。(注意,这个规则仅仅是针对处理器),处理器会在读final域操作的前面插入一个LocalLoad屏障。实际上,读对象的引用和读该对象的final域存在间接依赖性,一般处理器不会重排序这两个操作。PS:很有意思的是,如果以X86处理为例,X86不会写-写重排序,所以StoreStore屏障可以省略。由于不会对有间接依赖性的操作重排序,所以在X86处理器中,读final域需要LoadLoad屏障也会被省略掉。

2024-01-07 12:45:17 349

原创 并发(4)

Base和Son都有方法test(),但是这并不是一种覆盖,因为private所修饰的方法是隐式地final,也及时无法被继承,所以更不用说是覆盖了,在Son中test()方法不过是属于Son的新成员罢了,Son进行向上转型得到father,但是father.test()是不可执行的,因为Base中的test()方法是private的,无法被访问到。synchronized实际上是非公平的,新来的线程有可能立即获得监视器,而在等待区中等候已久的线程可能再次等待,这样有利于提高性能,但是也可能导致饥饿现象。

2024-01-06 21:09:59 938

原创 并发(3)

monitorexit指令:释放对于monitor的所有权,释放过程很简单,就是讲monitor的计数器减1,如果减完以后,计数器不是0,则代表刚才是重入进来的,当前线程还继续持有这把锁的所有权,如果计数器变成0,则代表当前线程不再拥有该monitor的所有权,即释放锁。该图可以看出,任意线程对Object的访问,首先要获得Object的监视器,如果获取失败,该线程就进入同步状态明显呈状态变为BLOCKED,当Object的监视器占有者释放后,在同步队列中得到线程就会有机会重新获取该监视器。

2024-01-06 20:18:39 812

原创 并发(2)

对于以下代码,在main()中启动一个线程之后再中断他,由于线程中调用了Thread.sleep()方法,因此会抛出InterruptedException,从而提前结束线程,不执行之后的语句。如果一个线程的run()方法执行一盒无限循环,并且没有执行sleep()等会抛出InterruptedException的操作,那么调用线程的interrupt()方法就无法使线程提前结束。synchronized中的锁是非公平的,ReentrantLock默认情况下也是非公平的,但是也可以是公平的。

2024-01-06 17:42:10 935

原创 并发(1)

随着硬件指令集的发展,我们可以使用基于冲突检测的乐观并发策略:先进行操作,如果没有其他线程争用共享数据,那操作就成功了,否则采取补偿措施(不断地重试,直到成功为止)。而普通的共享变量不能保证可见性,因为普通共享变量被修改之后,什么时候被写入主存是不确定的,当其他线程去读取时,此时内存中可能还是原来的旧值,因此无法保证可见性。阻塞和等待的区别在于,阻塞是被动的,他是等待获取一个排他锁。在Java中,对基本数据类型的变量的读取和赋值操作是原子性操作,即这些操作是不可被中断的,要么执行,要么不执行。

2024-01-06 16:31:36 845

原创 架构(1)

分层架构是逻辑上的,在物理部署上,三层架构可以部署在同一个物理机器上,但是随着网站业务的发展,必然需要对已经分层的模块分离部署,即三层结构分别不是在不同的服务器上,是网站拥有更多计算资源以对应越来越多的用户访问。网站越大,功能越复杂,服务和数据处理的种类也越多,将这些不同的功能和服务分隔开来,包装成高内聚低耦合的模块单元,不仅有助于软件的开发维护也便于不用模块的分布式部署,提高网站的并发处理能力和功能扩展能力。数据在某个时间段内有效,不过很快过期,否则会因为数据过期而脏读,影响数据的正确性。

2024-01-05 18:26:58 1290 1

瀚高数据库管理工具瀚高数据库管理工具

瀚高数据库管理工具瀚高数据库管理工具

2023-02-27

医疗机构CA电子认证签名应用方案.doc

医疗机构CA电子认证签名应用方案.doc

2021-10-15

xddshop.zip(毕业设计:二次供水系统SSM+源码)

毕业设计:二次供水系统SSM+源码+数据库sql

2021-03-16

09个人及家乡展示管理平台.rar

个人及家乡展示管理平台(源码+视频+sql)

2021-03-03

16停车场管理系统.rar

停车场管理系统的设计和实现(源码+视频+sql)

2021-03-03

JavaGItmakerdown文档

Git(读音为/gɪt/。)是一个开源的分布式版本控制系统,可以有效、高速的处理从很小到非常大的项目版本管理。 [1] Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。

2018-07-27

JavaGIt官方文档

Git(读音为/gɪt/。)是一个开源的分布式版本控制系统,可以有效、高速的处理从很小到非常大的项目版本管理。Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发...

2018-07-27

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除