自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(101)
  • 收藏
  • 关注

原创 PO、DTO、VO、BO到底是什么用在哪一层

我们可以把教育经历对应一个 PO ,工作经历对应一个 PO ,社会关系对应一个 PO。但是,有一个服务调用只需要其中的10个属性,此时我们可以创建一个只有10个属性的DTO返回给调用者。PO仅用来展现数据,类中只包含属性和get/set方法,而不会有修改数据库的方法。把相关的数据都组合到一个对象中,减少网络调用的次数,从而提高分布式调用的性能和降低网络负载。在Dubbo类型的分布式框架中,微服务间的调用使用DTO传输数据也是非常适合的。封装的复杂对象,主要是对业务数据的封装,可能包含一个或多个其它对象。

2023-10-11 14:19:09 882

原创 nio 非阻塞模式 阻塞模式学习笔记

注@slfj 中的log.debug() 就好比前端的console.log。会阻塞到accept 方法上 线程会暂停,让出cpu。以上是 有一个客户端。

2023-10-09 14:58:45 138

原创 idea debug模式下怎末用

点击这可以在断点处执行你所输入的 语句。

2023-10-09 14:53:32 116

原创 nio 文件传输

transferto方法一次只能传输2个g的数据。

2023-10-09 14:27:02 318

原创 java7 twr (try - with - resource)新特性

偶尔看到的一个关于 try()...catch() 的用法,通常我们使用 try...catch() 捕获异常的,如果遇到类似IO流的处理,要在finally部分关闭IO流,当然这个是JDK1.7之前的写法了;在JDK7优化后的 try-with-resource 语句,该语句确保了每个资源,在语句结束时关闭。所谓的资源是指在程序完成后,必须关闭的流对象。写在()里面的流对象对应的类都必须是Closeable的子类;try块退出时,会自动调用res.close()方法,关闭资源。

2023-10-09 11:40:03 185

原创 NIO基础

nio : non-blocking io 非阻塞IO。

2023-09-27 20:08:10 1267

原创 FST结构 (解决Trie前缀树 后边不能复用的问题)

hashmap skip list Trie前缀树 FST。

2023-09-06 11:04:13 159

原创 倒排表的压缩算法

这是的一种压缩算法。还是那个问题,如果"小米" 这个词项,在多文档里都有,则就会导致倒排表很大,这时候就会设计到了压缩算法,这里说的是,倒排表。那末我们来看看 for压缩算法是怎么压缩数据呢?其实你可以理解为它是将posting list(无论数字多大都是用int去存的) 转换为一个差值list (deltas list)去存的,也就是我们之前存的不是文件id吗,这回我们去存和前一个的差值,这样是不是存的这个数就会变小,那这样我们需要的位数是不是就会变小,靠这个来压缩我们的函数。

2023-09-05 17:46:45 121

原创 Elsaticsearch倒排索引

高效的压缩算法 快速的编码和解码速度。

2023-09-05 11:03:40 191

原创 并发容器11

JDK 提供的这些容器大部分在包中。线程安全的 HashMap线程安全的 List,在读多写少的场合性能非常好,远远好于 Vector.高效的并发队列,使用链表实现。可以看做一个线程安全的 LinkedList,这是一个非阻塞队列。这是一个接口,JDK 内部通过链表、数组等方式实现了这个接口。表示阻塞队列,非常适合用于作为数据共享的通道。跳表的实现。这是一个 Map,使用跳表的数据结构进行快速查找。在很多应用场景中,读操作可能会远远大于写操作。

2023-08-30 17:49:50 434

原创 es的索引管理

(1)集群(Cluster): ES可以作为一个独立的单个搜索服务器。不过,为了处理大型数据集,实现容错和高可用性,ES可以运行在许多互相合作的服务器上。这些服务器的集合称为集群。(2)节点(Node): 形成集群的每个服务器称为节点。

2023-08-25 17:02:45 1518

原创 让你对es有一个初步的了解

首先es在海量数据的搜索能力非常好,es你可以把他看成一个搜索引擎数据库,他是个非关系型数据库。他的语法有很大的不同,好像都是json风格的。还有一点需要说的就是es 的数据是存在硬盘上的,我们先来看一下mysql和es的区别吧。一张图给展示出来。仔细上图的同时,自己配上es的语法也行会更好you.哎,那我就带着大家看一看es的基本语法吧,你能对mysql和es的不同点有个初步的了解先上一张chatgpt的回答解释下划线开头的单词。

2023-08-24 22:00:35 637

原创 redis如何保证存的都是热点数据?太热了喵喵的咋办

假说说1000w条数据,redis只能存20w我们这时候就用拒绝策略去保证存的都是热点数据我们先来看一下几种拒绝策略检测易失数据(可能会过期的数据集server.db[i].expires )① volatile-lru:挑选最近最少使用的数据淘汰② volatile-lfu:挑选最近使用次数最少的数据淘汰③ volatile-ttl:挑选将要过期的数据淘汰④ volatile-random:任意选择数据淘汰检测全库数据(所有数据集server.db[i].dict )

2023-08-23 22:20:04 564

原创 refresh大揽

设置spring启动的时间设置spring关闭和开启的标志位获取环境对象,并设置一些属性值,是系统环境的不是xml设置的设置监听器,以及需要发布事件的集合。

2023-08-21 14:31:33 87

原创 CountDownLatch和CyclicBarrie

什么是闭锁对象闭锁对象(Latch Object)是一种同步工具,用于控制线程的等待和执行顺序。闭锁对象可以让一个或多个线程等待,直到特定的条件满足后才能继续执行。在Java中,CountDownLatch就是一种常见的闭锁对象。它通过一个计数器来实现线程的等待。计数器的初始值设定为一个正整数,表示需要等待的事件数量。当一个线程完成了一个事件时,计数器的值就会减1。当计数器的值变为0时,所有等待的线程都会被释放,继续执行后续的操作。闭锁对象的主要特点是,一旦计数器的值变为0,就不能再重新设置或重用。

2023-08-20 18:42:53 389 1

原创 深入AQS原理(我在一开始学的时候就把非公平锁和公平锁给弄混了)

谈到并发,我们不得不说,所谓的AQS即是抽象的队列式的同步器,内部定义了很多锁相关的方法,我们熟知的Semaphore等都是基于AQS来实现的。我们先看下AQS相关的UML图:在下面自己整理出一张AQS的框架图,供大家参考。

2023-08-20 17:14:39 485 2

原创 Spring Security OAuth2.0认证授权

用户认证通过后,为了避免用户的每次操作都进行认证可将用户的信息保证在会话中。会话就是系统为了保持当前用户的登录状态所提供的机制,常见的有基于session方式、基于token方式等。当我们进行支付的时候可能还会进行一次认证基于session的认证:交互流程是,用户认证成功后,在服务端生成用户相关的数据保存在session(当前会话)中,发给客户端的sesssion_id存放到cookie。

2023-08-20 10:00:39 178

原创 LRU 算法

LRU 缓存淘汰算法就是一种常用策略。LRU 的全称是 Least Recently Used,也就是说我们认为最近使用过的数据应该是是「有用的」,很久都没用过的数据应该是无用的,内存满了就优先删那些很久没用过的数据。LRU算法题。

2023-08-19 17:51:48 697

原创 跟左神刷算法02 基础

先根据难度拍个序,难度一样的按收入大的排序,因为他每份都有招无数份人。难度相同的就留一个最大的。难度增加了,而薪水变小了,直接丢掉。难度和薪水保持一个单调性就可以了。用有序表取做。key是排序的。迅速查到小于某个数最近的 logn级别。

2023-08-18 13:36:04 259

原创 算法01 跟左神刷题01

给定一个有序数组arr,代表坐落在X轴上的点,给定一个正数K,代表绳子的长度返回绳子最多压中几个点?即使绳子边缘处盖住点也算盖住。

2023-08-17 21:24:23 184

原创 spring bean创建总览 1

这是一个总图下边慢慢看我们最基础的写的方式就是xml的方式去写像这样,而我们会通过applicationContext的方式去获得我们的bean ,我其中一篇博客就写到了applicationContext他的父类就是beanFactory但是中间的是怎么样处理的呢?因为你获取getbean 的时候要么是bean.class 要么就是这个 bean的名字。所以思考应该是在容器中用map去存放的这个bean。和我们创建bean的一些东西,等等。

2023-08-17 13:28:01 333

原创 Map类 了解-----

—Map:双列数据,存储key-value对的数据 —类似于高中的函数:y=f(x)|—HashMap:作为Map的主要实现类;线程不安全,效率高;存储null的key和value|—LinkedHashMap:保证在遍历元素时可以按照添加顺序遍历。原因:在原有的HashMap底层结构基础上,添加了一对指针,指向前一个和后一个元素。对于频繁的遍历操作,此类执行效率高于HashMap|—TreeMap:保证按照添加的key-value对进行排序,实现排序遍历。此时考虑key的自然排序或定制排序。

2023-08-17 10:56:11 77

原创 跟着美团学设计模式(感处)

读了着篇文章之后发现真的是,你的思想,你的思维是真的比比你拥有什么技术要强的。

2023-08-15 20:47:34 568

原创 普通索引和唯一索引,应该怎么选择(已经那个changebuffer - 和你这个线程连接池)

普通索引和唯一索引都是数据库中常用的索引类型,它们的主要区别在于索引列的值是否允许重复普通索引允许索引列的值重复,也就是说,如果多个记录在索引列中具有相同的值,那么这些记录仍然可以通过普通索引进行查找。普通索引通常用于加速表中记录的查询操作,它可以大大提高查询效率。而唯一索引则要求索引列的值必须唯一,如果多个记录在索引列中具有相同的值,那么这些记录将无法通过唯一索引进行查找。唯一索引通常用于保证数据的唯一性,可以有效地避免数据冗余和数据不一致性。

2023-08-14 20:12:26 243

原创 Redis缓存穿透、击穿和雪崩

缓存穿透是指当用户在查询一条数据的时候,而此时数据库和缓存却没有关于这条数据的任何记录,而这条数据在缓存中没找到就会向数据库请求获取数据。用户拿不到数据时,就会一直发请求,查询数据库,这样会对数据库的访问造成很大的压力。如:用户查询一个 id = -1 的商品信息,一般数据库 id 值都是从 1 开始自增,很明显这条信息是不在数据库中,当没有信息返回时,会一直向数据库查询,给当前数据库的造成很大的访问压力。

2023-08-14 11:38:05 128

原创 thread 的join方法

我们可以看出:是test02线程在调用 join() -> wait(), 所以test02会进入WAITING状态。直到test01执行完,自动调用Thread.exist()方法,在exist()方法中,test02会被唤醒。重要的是test02的状态,调用join方法后,test02变成了WAITING状态,为什么?join方法加了锁,锁的是谁?test01,谁持有锁?两个红色的框分别说明了sleep方法前后test01的状态,这个不是重点,只是一个验证而已。

2023-08-14 09:58:57 92

原创 sleep和wait

wait(),首先,这是由某个确定的对象来调用的,将这个对象理解成一个传话的人,当这个人在某个线程里面说"暂停!",也是 thisOBJ.wait(),这里的暂停是阻塞,thisOBJ就好比一个监督我的人站在我旁边,本来该线 程应该执行1后执行2,再执行3,而在2处被那个对象喊暂停,那么我就会一直等在这里而不执行3,但正个流程并没有结束,我一直想去煮饭,但还没被允许, 直到那个对象在某个地方说"通知暂停的线程启动!都用来进行线程控制,他们最大本质的区别是:sleep()不释放。,wait()释放同步锁.;

2023-08-13 23:44:24 105

原创 区分等待、阻塞,加拓展

一切回归原始:假设一个场景:多个线程任务执行在同一个单核cpu上,在我们获取临界资源的时候,为了线程安全,是要加锁的,假设锁是synchronized,那么同一时刻,只有一个线程任务能获取锁资源,那么其它的线程就进入了:blocked状态,等待获取锁的状态,如上代码BLOCKED, 此时,这些没有获取到锁的线程有一些条件:1:他们都是可以随时被CPU上下文切换获取到执行权的。,为什么没有挂起状态,因为线程挂起这种操作已经过时,不建议使用了,这里不做过多讨论,有人愿意研究的,请自行搜索:线程挂起。

2023-08-13 23:44:10 80

原创 线程转换状态,傻傻分不清等待和阻塞吗?你还在暴力的停止线程吗?

线程创建之后,调用start()方法开始运行。当线程执行wait()方法之后,线程进入等待状态。进入等待状态的线程需要依靠其他线程的通知才能够返回到运行状态,而超时等待状态相当于在等待状态的基础上增加了超时限制,也就是超时时间到达时将会返回到运行状态。当线程调用同步方法时,在没有获取到锁的情况下,线程将会进入到阻塞状态。线程在执行Runnable的run()方法之后将会进入到终止状态。Java将操作系统中的运行和就绪两个状态合并称为运行状态。阻塞状态是线程。

2023-08-13 20:38:16 1562 2

原创 java的内存模型

Java线程之间的通信由Java内存模型(本文简称为JMM)控制,JMM决定一个线程对共享变量的写入何时对另一个线程可见。从抽象的角度来看,JMM定义了线程和主内存之间的抽象关系:线程之间的共享变量存储在主内存(Main Memory)中,每个线程都有一个私有的本地内存(Local Memory),本地内存中存储了该线程以读/写共享变量的副本。本地内存是JMM的一个抽象概念,并不真实存在。如果线程A与线程B之间要通信的话,必须要经历下面2个步骤。

2023-08-13 13:29:45 107

原创 Redis实现分布式锁

Redis 属于分布式系统,当有多个客户端需要争抢锁时,我们必须要保证,这把锁不能是某。

2023-08-09 09:07:20 86

原创 redis是单线程的,那么他是怎么样避免阻塞的

集合全量查询和聚合操作;bigkey 删除;清空数据库;AOF 日志同步写;从库加载 RDB 文件为了避免阻塞式操作,Redis 提供了异步线程机制。所谓的异步线程机制,就是指,Redis 会启动一些子线程,然后把一些任务交给这些子线程,让它们在后台完成,而不再由主线程来执行这些任务。使用异步线程机制执行操作,可以避免阻塞主线程。

2023-08-08 20:34:13 418

原创 Synchronized同步锁的优化方法 待完工

在JDK1.5 之前,Java 是依靠 Synchronized 关键字实现锁功能来做到这点的。Synchronized 是 JVM 实现的一种内置锁,锁的获取和释放是由 JVM 隐式实现。到了 JDK1.5 版本,并发包中新增了来实现锁功能,它提供了与 Synchronized关键字类似的同步功能,只是在使用时需要显示获取和释放锁Lock 同步锁是基于 Java 实现的,而 Synchronized 是基于底层操作系统的 Mutex Lock。

2023-08-07 22:59:27 155

原创 Bean的Aware接口

Spring中提供了一些以Aware结尾的接口,实现了Aware接口的bean在被初始化之后,可以获取相应资源。比如BeanNameAware之类的以Aware结尾的接口,这个接口获取的资源就是以BeanName相关的。通过Aware接口,可以对Spring相应资源进行操作(一定要慎重,因为获取的资源可能是IOC的核心资源)。为对Spring进行简单的扩展提供了方便的接口。

2023-08-07 22:17:49 421

原创 简单动态字符串 sds

Redis 设计了简单动态字符串(Simple Dynamic String,SDS)的结构,用来表示字符串。相比于 C 语言中的字符串实现,SDS 这种字符串的实现方式,会提升字符串的操作效率,并且可以用来。

2023-08-07 16:08:40 162

原创 BeanFactory和ApplicationContent

我们shift + shift 搜索进入BeanFactory的源码然后进入BeanFactory我们要先查看他的源码呢我们ctrl + F12可以看到这个BeanFactory表面上只能getBean但是实际上控制反转,基本的依赖注入,直至Bean的生命周期的各种功能,都由他的实现类提供。这个实现类呢就是我们来看他的继承关系图ctrl alt u我们看标红的那个地方,单例对象都在哪 选择它,然后F4我们可以看到单例bean放在了map集合里边。

2023-08-07 11:17:41 76

原创 ApplicationContent 和BeanFactory的关系

他是ApplicationContent的父接口他才是Spring的核心容器,主要ApplicationContent实现了组合了他的功能我们点进去发现其实是人家BeanFactory 提供的getBean。

2023-08-07 10:09:56 107

原创 内存快照:宕机后,Redis如何实现快速恢复?RDB

回顾Redis 的AOF的持久化机制。Redis 避免数据丢失的 AOF 方法。这个方法的好处,是每次执行只需要记录操作命令,需要持久化的数据量不大。一般而言,只要你采用的不是 always 的持久化策略,就不会对性能造成太大影响。但是,也正因为记录的是操作命令,而不是实际的数据,所以,用 AOF 方法进行故障恢复的时候,需要逐一把操作日志都执行一遍。如果操作日志非常多,Redis 就会恢复得很缓慢,影响到正常使用。所谓内存快照,就是指内存中的数据在某一个时刻的状态记录。

2023-08-06 15:39:40 522 1

原创 事务到底是隔离的还是不隔离的 (具体)

下面是一个只有两行的表的初始化语句这里,我们需要注意的是事务的启动时机。begin/start transaction 命令并不是一个事务的起点,在执行到它们之后的第一个操作InnoDB 表的语句,事务才真正启动。如果你想要马上启动一个事务,可以使用 start transaction with consistent snapshot 这个命令第一种启动方式,一致性视图是在第执行第一个快照读语句时创建的;

2023-08-05 15:34:29 126

原创 一个小问题,如何优雅的删除表的前1000行数据

在 20 个连接中同时执行 delete from T limit 500),会人为造成锁冲。直接执行 delete from T limit 10000,单个语句占用时间长,锁。而且大事务还会导致主从延迟。这种做法是最合适的。

2023-08-05 15:13:26 519

空空如也

空空如也

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

TA关注的人

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