自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Redis内存淘汰机制(MySQL里有2000w数据,Redis中只存20w数据,如何保证redis中的数据都是热点数据?)

redis提供了6种数据淘汰策略: volatile-lru:从已设置过期时间的数据集中挑选最近最少使用的数据淘汰。 volatile-ttl:从已设置过期时间的数据集中挑选将要过期的数据淘汰。 volatile-random:从已设置过期时间的数据集中任意选择数据淘汰。 allkeys-lru(最常用):当内存不足以容纳新写入数据时,在键空间中,移出最近最少使用的key。 allkeys-random:当内存不足以容纳新写入数据时,从数据集中任意选择数据淘汰。 no-eviction

2020-11-07 19:31:17 484

原创 Redis设置过期时间

使用redis在set key的时候可以给一个expire time,就是过期时间,通过过期时间可以指定这个key可以存活的时间。假设设置了一批key只能存活1个小时的时间,那么1个小时之后redis是怎么对这些key进行删除的? 定期删除:redis默认是每隔100ms就随机抽取一些设置了过期时间的key,检查是否过期,如果过期就删除。(这里是随机抽取,因为假如redis存了几十万个key,每隔100ms就遍历所有设置过期时间的key,会给cpu带来很大的负载。) 惰性删除:定期删除导致可能很多过期

2020-11-07 19:30:30 2670 2

原创 Redis和Memcached区别

1. Redis不光支持简单的key-value型数据库,同时还支持list、set、String、hash等数据结构,而memcached只支持简单的数据类型String 2. Redis支持数据持久化,数据可以从内存持久化到磁盘,下次启动再加载,而memcached把数据全部存储在内存中。 3. Redis是单线程网络IO模型,memcached是多线程、非阻塞复用的网络模型。 4. Redis比memcached快...

2020-11-07 19:29:42 170

原创 TCP协议如何保证可靠传输

1. 应⽤数据被分割成 TCP 认为最适合发送的数据块。 2. TCP 给发送的每⼀个包进⾏编号,接收⽅对数据包进⾏排序,把有序数据传送给应⽤层。 3. 校验和: TCP 将保持它⾸部和数据的检验和。这是⼀个端到端的检验和,⽬的是检测数据在传 输过程中的任何变化。如果收到段的检验和有差错,TCP 将丢弃这个报⽂段和不确认收到此报⽂ 段。 4. TCP 的接收端会丢弃重复的数据。 5. 流量控制: TCP 连接的每⼀⽅都有固定⼤⼩的缓冲空间,TCP的接收端只允许发送端发送接收端 缓

2020-10-27 10:41:07 181

原创 Spring事务

Spring 管理事务的⽅式有⼏种? 1. 编程式事务,在代码中硬编码。(不推荐使⽤) 2. 声明式事务,在配置⽂件中配置(推荐使用)声明式事务⼜分为两种: 1. 基于XML的声明式事务 2. 基于注解的声明式事务Spring 事务中哪⼏种事务传播⾏为?⽀持当前事务的情况:1. TransactionDefinition.PROPAGATION_REQUIRED: 如果当前存在事务,则加⼊该事务;如果当前没有事务,则创建⼀个新的事务。 2. Transaction.

2020-10-26 17:18:37 123

原创 Spring框架中用到了哪些设计模式?

1. IOC和DI设计模式。2. 工厂设计模式:Spring使用工厂模式通过BeanFactory和ApplicationContext创建bean对象。3. 单例设计模式:Spring中的Bean对象默认都是单例的。4. 代理设计模式:AOP是基于动态代理实现的。5. 适配器模式:SpringAOP的增强/通知(Advice)以及SpringMVC中的Controller都用到了适配器模式...

2020-10-26 17:07:22 1172

原创 Spring bean

SpringBean的作用域:singleton(默认):为单例模式,唯一的bean实例,当为这个的时候,spring中的对象只创建一次,即外界调用多少次这个对象,都是同一个对象。prototype:多例模式,每次请求都会创建一个新的bean实例对象,actionBean一定要使用prototype多例,其他基本全是默认singleton。Spring 中的单例 bean 的线程安全问题了解吗?单例 bean 存在线程问题,主要是因为当多个线程操作同⼀个对象的时候,对这个对象的⾮静态成员变量

2020-10-26 16:51:04 344

原创 Spring AOP和Aspect AOP有什么区别?

1. Spring AOP属于运行时的增强,而Aspect AOP属于编译时的增强。SpringAOP是基于代理(Proxying),而AspectAOP是基于字节码操作。2. 如果切面比较少,两者差不多,如果切面太多,最好使用AspectAOP,它比SpringAOP快很多。...

2020-10-26 11:50:00 2152

原创 谈谈对SpringIOC和AOP的理解

IOC:控制反转,是一种设计思想,将原本在程序中需要手动创建的对象交给spring框架来管理。(本来对象A需要对象B,需要用对象A来创建对象B,而现在,反转了,对象的创建全部由spring框架来完成,A需要对象B,不需要自己创建,由spring在特定的时候提供给A所需要的对象B,这就是IOC,控制反转,即把自己创建对象反转成交个程序帮忙创建对象。)IOC是由依赖注入实现的(DI),很大程度上简化了应用的开发。AOP:面向切面编程,就是将那些公共的部分封装起来,减少代码的冗余,降低模块耦合度。AOP是基于

2020-10-26 11:45:44 1482

原创 滑动窗⼝和流量控制

TCP利用滑动窗口实现流量控制。流量控制是为了控制发送方发送速率。接收方发送的确认报文中的窗口字段可以控制发送方窗口大小,从而影响发送方的发送速率。将窗口字段设置为0,则发送方不能发送数据。...

2020-10-20 20:25:37 186

原创 四次挥手为什么客户端最后还要等待2MSL?

MSL就是指最大的报文生存时间。第一,保证客户端发送的最后一个ACK报文能够到达服务器,因为这个ACK报文可能丢失,站在服务器的角度看我已经发送了FIN+ACK报文请求断开了,客户端还没有给我回应,应该是我发送的请求断开报文它没有收到,于是服务器重新发了一次,客户端就能在这2MSL时间段内收到重传的报文,接着给出回应报文,并且会重启2MSL计时器。第二,客户端发送完最后一个确认报文后,在这个2MSL时间中,就可以使本连接持续的时间内所产生的所有报文段都从网络中消失,这样新的连接中不会出现旧链接的请求

2020-10-20 19:38:15 913

原创 堆内存中对象分配的基本策略?

堆空间的基本结构:上图所示的eden区、s0区、s1区都属于新生代,tentired区属于老年代。对象会先在eden区域分配,在一次新生代垃圾回收之后,如果对象还存活,会进入s0和s1区域,并且对象的年龄还会加一,当对象年龄增加到一定程度,就会晋升到老年代中。大对象和长期存活的对象会直接进入老年代。...

2020-10-19 20:36:43 390

原创 sleep()和wait()的区别和共同点

区别:1. sleep方法没有释放锁,但是wait释放了锁2. wait()被调用后不会自动苏醒,需要别的线程调用同一对象的notify()/notifyAll()方法;而sleep()执行后会自动苏醒。3. wait()通常用于线程之间的通信,而sleep()一般是用于暂停。共同点:两者都可以暂停线程的执行...

2020-10-17 12:29:55 377

原创 什么是线程死锁?如何避免死锁?

线程死锁:多个线程同时被阻塞,他们中的一个或者全部在等待某个资源被释放,由于线程被无限期的阻塞,因此程序不可能正常终止。产生死锁必须具备的四个条件:1.互斥条件:该资源任意时刻只由一个线程占用。2. 请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。3. 不剥夺条件:线程已获得的资源在未使用完之前不能被其他线程强行剥夺,只有自己使用完之后才释放资源。4. 循环等待条件:若干个进程之间形成一种头尾相接的循环等待资源关系。如何避免线程死锁(破坏其中一个条件即可):1.

2020-10-17 12:25:50 450

原创 表级锁和行级锁的对比

MyISAM采用表级锁,InnoDB支持行级锁和表级锁,一般默认是行级锁。表级锁:MySQL中锁定粒度最大的一种锁,对当前操作的整张表加锁,实现简单,资源消耗也少,加锁快,不会出现死锁。但是锁定粒度大,触发锁冲突的概率最高,并发度低。行级锁:MySQL中锁定粒度最小的一种锁,只针对当前操作的行进行加锁。行级锁能大大减少数据库操作的冲突。加锁的开销也大,加锁慢,会出现死锁。加锁粒度最小,并发度高。...

2020-10-17 10:27:13 1528

原创 事务隔离级别有哪些?MySQL的默认隔离级别是?

SQL标准定义了四个隔离级别:READ-UNCOMMITTED(读未提交):最低的隔离级别,允许读取尚未提交的数据变更,可能会导致脏读、幻读或不可重复读。READ-COMMITTED(读已提交):允许读取并发事务已经提交的数据,可以阻止脏读,但是幻读和不可重复读仍有可能发生。REPEATABLE-READ(可重复读):对同一字段的多次读取结果都是一致的,除非数据是被本身事务所修改,可以阻止脏读和不可重复读,但是幻读仍有可能发生。SERIALIZABLE(可串行化):最高的隔离级别,完全服从A

2020-10-15 16:58:13 412

原创 并发事务带来哪些问题?

多个事务并发运行,经常会通过操作相同的数据来完成各自的任务(多个用户对同一数据进行操作),并发虽然是必须的,但是会导致以下的问题。1. 脏读:当一个事务正在访问数据并且对数据进行了修改,而这种修改还没有提交到数据库中,这时另一个事务也访问了这个数据,然后使用了这个数据。因为这个数据是还没有提交的数据,那么另一个事务读到的这个数据是“脏数据”,依据“脏数据”做的操作是不正确的。2. 不可重复读:指在一个事务内多次读同一数据。在这个事务还没有结束的时,另一个事务也访问该数据。那么,在第一个事务中的两次读

2020-10-13 22:42:55 3093

原创 事务的四个特性

ACID1. 原子性:事务是最小的执行单位,不可分割,事务的原子性确保动作要么全部完成,要么完全不起作用。2. 一致性:事务执行前后,数据保持一致,多个事务对同一个数据读取的结果是相同的。3. 隔离性:并发访问数据库时,一个用户的事务不被其他事务干扰,各并发事务之间数据库相互独立的。4. 持久性:一个事务被提交后,它对数据库中数据的改变是持久的。...

2020-10-13 20:46:35 193

原创 什么是事务

事务是逻辑上的一种操作,要么都执行,要么都不执行。举个例子就是:A给B转账1000块,A余额减少1000,B账户增加1000,如果银行系统崩溃,A减少了但是B没有增加,这就不对了,事务保证这两个操作要么同时成功,要么同时失败。...

2020-10-13 20:35:48 107

原创 MyISAM和InnoDB的区别

5.5版本以前,MyISAM是MySQL的默认数据库引擎,虽然性能极佳,而且提供了大量的特性,但是MyISAM不支持事务和行级锁,最大的缺陷是崩溃后无法安全恢复;5.5版本以后,MySQL引入了InnoDB(事务性数据库引擎),而且默认存储引擎为InnoDB。大多数情况下我们使用的是InnoDB,但是某些情况下使用MyISAM也是比较合适的,比如读密集的情况下。两者对比:1. 是否支持行级锁:MyISAM只有表级锁,而InnoDB支持行级锁和表级锁,默认为行级锁。2. 是否支持事务和崩溃后的安全

2020-10-13 20:24:04 80

原创 ConcurrentHashMap和HashTable的区别?

ConcurrentHashMap和HashTable的区别主要体现在实现线程安全的方式上的不同:底层数据结构:jdk7之前的ConcurrentHashMap底层采用的是分段的数组+链表实现,jdk8之后采用的是数组+链表/红黑树;HashTable采用的是数组+链表,数组是主体,链表是解决hash冲突存在的。实现线程安全的方式:1. jdk8以前,ConcurrentHashMap采用分段锁,对整个数组进行了分段分割,每一把锁只锁容器里的一部分数据,多线程访问不同数据段里的数据,就不会存在锁竞争

2020-10-11 17:16:47 510

原创 ConcurrentHashMap线程安全的具体实现⽅式/底层具体实现

JDK8以前,ConcurrentHashMap是由Segment数组结构和HashEntry数组结构组成。首先将数据分为一段一段的存储,然后给每一段数据配一把锁,当一个线程占用锁访问其中一个段数据时,其他段的数据也能被其他段访问。Segment是一种数组+链表结构,实现了ReentrantLock接口,是一种可重入锁;HashEntry存储键值对数据。JDK8以后,ConcurrentHashMap取消了Segment分段锁,采用CAS和synchronized保证并发安全。数据结构采用数组+链表/红

2020-10-11 16:52:25 393

原创 集合框架底层数据结构总结

Collection1. List: ArrayList:Object数组 Vector:Object数组 LinkedList:双向链表2. Set: HashSet:无序,唯一,底层是HashMap LinkedHashSet:底层依赖LinkedHashMap实现。 TreeSet:有序,唯一Map HashMap:jdk8以前是数组+链表,jdk8以后是数组+链表/红黑树 LinkedHashMap:有序...

2020-10-10 16:55:09 117

原创 HashSet如何检查重复?

当把对象加入HashSet的时候,HashSet会先计算对象的hashCode值来判断对象加入的位置,同时与其他加入的对象的hashcode值作比较,如果没有相同的,则加入该对象,如果有相同的hashcode值,则调用equals方法判断是不是同一个对象,如果不是则加入;如果相同,则加入不成功;...

2020-10-10 16:35:47 229

原创 List,Set,Map三者的区别?

List:存储有序的对象Set:不允许重复的集合,独一无二Map:使用键值对存储,Key是唯一的。

2020-10-10 16:08:15 203

原创 hashcode与equals

1. hashcode()的作用是获取哈希码返回一个int的整数,哈希码的作用是确定对象在哈希表中的位置。当对象加入hashset时,HashSet会先计算对象的hashcode,判断该位置上有无相同的hashcode,如果有会再调用equals方法检查hashcode相同的对象是否为同一个对象;如果该位置上没有相同的hashcode,则说明该对象没有重复,可以加入hashset。2. 如果两个对象hashcode相等,两个对象不一定相等;如果两个对象相等,hashcode一定相等,且equals方法返

2020-10-08 19:15:34 100

原创 关于final关键字的总结

final关键字主要用在3个地方:变量,类,方法变量:final修饰是成员变量,如果是基本数据类型,在赋初值后不能改变;如果是引用数据类型,在初始化之后不能指向另一个对象。类:当用final修饰一个类的时候,说明这个类是不能被继承,且类里的所有方法被隐式的指定为final方法。方法:final修饰方法,任何类继承该类不能修改这个方法。所有的private方法都隐式的被指定为final...

2020-10-08 16:44:38 131

原创 深拷贝vs浅拷贝

1. 浅拷贝:对基本的数据类型进行值传递,对引用数据类型只是增加了一个指向同一个堆里对象的指针,这是浅拷贝。2. 深拷贝:对基本的数据类型进行值传递,对引用数据类型,创建一个新的对象,并复制其内容,这是深拷贝。...

2020-10-08 16:30:24 57

原创 java中序列化如果有些字段不想进行序列化怎么办

对于不想被序列化的变量,用transient关键字修饰。transient关键字的作用就是:阻止用这个关键字修饰的不想被序列化的变量序列化;transient只能修饰变量,不能修饰类和方法。

2020-10-08 16:09:08 1208

原创 成员变量和局部变量的区别

1. 从语法形式上:成员变量属于类,局部变量属于方法或者方法的参数;成员变量可以被public,protected,private和static修饰,局部变量不可以;但是二者均可以被final关键字修饰。2.从变量在内存的存储方式上:如果成员变量是static修饰,那么这个成员变量属于类,如果没有static修饰,那么这个成员变量属于实例;对象存于堆内存,如果局部变量为基本数据类型,那么存储在栈内存,如果为引用数据类型,那存放的是指向堆内存对象的引用或者指向常量池中的地址。3. 从变量在内存中的生存

2020-10-08 11:58:21 539

原创 在一个静态方法里调用一个非静态成员为什么是非法的

因为静态方法可以不通过对象进行调用,可以直接类名.静态方法,所以静态方法里不可以直接调用或访问费静态成员变量。

2020-10-08 10:57:20 295

原创 String、StringBuilder、StringBuffer的区别?为什么说String是不可变的

1. String类中使用final关键字修饰字符数组,private final char[] value,所以String类是不可变的。2. StringBuffer和StringBuilder都是继承AbstractStringBuilder父类,从线程安全性上来说StringBuffer的方法有同步锁,是线程安全的,StringBuilder不是线程安全的。3. 从性能上来说StringBuilder比StringBuffer更快点。总结:少量数据用String,单线程下大量数据用Str

2020-10-08 10:54:41 161

原创 CPU寻址?为什么需要虚拟地址空间?

CPU寻址:现代处理器使用的是一种称为虚拟寻址的寻址方式。使用虚拟寻址,CPU需要将虚拟地址翻译成物理地址,这样才能访问到真实的物理内存。实际上完成虚拟地址转换为物理地址转换的硬件是CPU中含有一个被称为内存管理单元的硬件。为什么要有虚拟地址空间:先从没有虚拟地址空间说起吧,没有虚拟地址空间的时候,程序都是直接访问和操作物理内存。但会有一些问题:1. 用户可以访问任意的内存,寻址内存的每个字节,这样容易破坏操作系统,造成操作系统崩溃。2. 想要同时运行多个程序特别困难。总结来说:如果直接把物

2020-09-22 20:37:33 1987

原创 系统调用

介绍系统调用之前,先来了解一下用户态和系统态。根据进程访问资源的特点,我们可以把进程在系统上的运行分为两个级别:1. 用户态:用户态运行的进程或可以直接读取用户程序的数据。2. 系统态:系统态运行的进程或程序几乎可以访问计算机的任何资源,不受限制。我们运行的程序基本都是运行在用户态,如果我们调用操作系统提供的系统态级别的子功能就需要系统调用了。也就是说在我们运行的用户程序中,凡是与系统态级别的资源有关的操作(如文件管理、进程控制、内存管理等),都必须通过系统调用方式向操作系统提出服务请求,并由操

2020-09-22 20:25:03 162

原创 页面置换算法

页面置换算法的作用:地址映射过程中,如果在页面中发现所要访问的页面不在内存(主存)中,则发生缺页中断。当发生缺页中断时,如果当前内存中并没有空闲的页面,操作系统就必须在内存选择一个页面将其移出内存,以便为即将调入的页面让出空间。用来选择淘汰哪一页的规则叫做页面置换算法(我们可以把页面置换算法看成是淘汰页面的规则。)OPT页面置换算法(最佳页面置换算法):最佳页面置换算法所选择的被淘汰页面将是以后永不使用的,或者说在最长时间内不再被访问的页面,这样可以保证获得最低的却也率。但由于人们无法预知进程未来最长时

2020-09-22 20:08:51 345

原创 虚拟内存技术的实现

虚拟内存技术的实现需要建立在离散分配的内存管理方式的基础上。虚拟内存的实现有以下三种方式:1. 请求分页存储管理:建立在分页管理之上,为了支持虚拟存储器功能而增加了请求调页功能和页面置换功能。请求分页是目前最常用的一种实现虚拟存储器的方法。请求分页存储管理系统中,在作业开始运行之前,仅装入当前要执行的部分段即可运行。假如在作业运行的过程中发现要访问的页面不在内存,则由处理器通知操作系统按照对应的页面置换算法将相应的页面调入到主存,同时操作系统也可以将暂时不用的页面置换到外存中。2. 请求分段存储管理

2020-09-21 21:37:54 2107

原创 介绍一下虚拟存储器

基于局部性原理,在程序装入时,可以将程序的一部分装入内存,而将其他部分留在外存,就可以启动程序执行。由于外存往往比内存大很多,所以我们运行的软件的内存的大小实际上是可以比计算机系统实际的内存大小大的。在程序执行过程中,当访问的信息不在内存时,由操作系统将所需要的部分调入内存,然后继续执行程序。另一方面,操作系统将内存中暂时不使用的内容换到外存上,从而腾出空间存放将要调入内存的信息。这样,计算机好像为用户提供了一个比实际内存大的多的存储器——虚拟存储器。...

2020-09-21 21:21:13 107

原创 局部性原理

想要更好的理解虚拟内存技术,必须要知道计算机中著名的局部性原理。局部性原理是虚拟内存技术的基础,正是因为程序运行具有局部性原理,才可以只装入部分程序到内存就开始运行。局部性原理主要表现在以下两个方面:1. 时间局部性:如果程序中的某条指令一旦执行,不久以后该指令可能再次执行;如果某数据被访问过,不久以后该数据可能被再次访问。产生时间局部性的典型原因,是由于在程序中存在着大量的循环操作。2. 空间局部性:一旦程序访问了某个存储单元,在不久以后,其附近的存储单元也将被访问,即程序在一段时间内所访问的

2020-09-21 21:01:12 3452

原创 什么是虚拟内存

这在我们平时的电脑使用中太常见了,很多时候我们点开了很多占内存的软件,这些软件占用的内存可能已经远远超出了我们电脑本身具有的物理内存,正是因为虚拟内存的存在,通过虚拟内存可以让程序可以拥有超过系统物理内存大小的一种自己在独享主存的错觉,虚拟内存是计算机系统内存管理的一种技术,我们可以手动设置自己电脑的虚拟内存。虚拟内存的重要意义是它定义了一个连续的虚拟地址空间,,并且把内存扩展到硬盘。...

2020-09-21 20:50:47 111

原创 介绍一下逻辑地址和物理地址

我们编程一般只和逻辑地址打交道,比如c语言指针里存储的数值就可以理解成内存里的一个地址,这个地址就是我们说的逻辑地址,逻辑地址由操作系统决定。物理地址是真实物理内存中地址,具体点来说就是内存地址寄存器中的地址,物理地址是内存单元真正的地址。...

2020-09-20 21:16:53 2217

空空如也

空空如也

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

TA关注的人

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