05 2021 档案
摘要:以下内存参考蒋德钧老师讲义 如何保存更多的数据 为了保存更多的数据,通常使用大内存云主机和切片集群两种方法。实际上,这两种方法分别对应着redis应对数据量增多的两种方法:纵向扩展和横向扩展。 纵向扩展:升级单个redis实例的资源配置,包括增加内存容量、增加磁盘容量、使用更高配置的cpu。就像下图
阅读全文
摘要:内容参考蒋德钧老师讲义 上一节,了解了哨兵机制,它可以实现主从库的自动切换。通过部署多个实例,就形成了哨兵集群。哨兵集群中的多个实例共同判断,可以降低对主库下线的误判率。 但是,还有一个要考虑的问题:如果有哨兵实例运行时发生了故障,主从库还能正常切换吗? 实际上,一旦多个实例组成了哨兵集群,即使有哨
阅读全文
摘要:内容参考蒋德钧老师讲义 哨兵其实就是一个运行在特殊模式下的redis进程,主从库实例运行的同时,它也在运行。哨兵主要负责的就是三大任务:监控、选主和通知。 我们先看监控。监控是指哨兵进程在运行时,周期性地给所有地主从库发送PING命令,检测他们是否仍然在线运行。如果从库没有在规定时间内响应哨兵地PI
阅读全文
摘要:此内容参考蒋德钧老师将讲义 Redis具有高可靠性,具有两层含义:一是数据尽量少丢失,二是服务尽量少中断。AOF和RDB保证了前者,而对于后者,redis的做法是增加副本冗余,将一份数据同时保存在多份实例上。即使有一个实例出现了宕机,需要一段时间才能恢复,其他实例也可以对外提供服务,不会影响业务使用
阅读全文
摘要:redis如何实现事务 事务的执行包含三个步骤,redis提供multi、exec两个命令来完成这三个步骤。 第一步:客户端要使用一个命令显示的表示一个事务的开启。在redis中这个命令就是multi。 第二步:客户端把事务中本身要执行的具体操作(例如增删改查)发送给服务器端。这些操作就是redis
阅读全文
摘要:缓存雪崩 缓存雪崩是指缓存同一时间大面积失效,所以后面的请求都会落在数据库上,造成数据库短时间内承受大量请求而崩掉。 目前电商首页以及热点数据都会缓存,一般缓存都是定时刷新或者查不到之后更新缓存。定时任务刷新就会存在一个问题。假如,所有的缓存数据失效时间都是12个小时,中午12点刷新缓存,双十一零点
阅读全文
摘要:redis是单线程 redis是单线程模型,因为redis是完全基于内存的操作,CPU不是redis的瓶颈,redis的瓶颈有可能是机器内存大小或者网络带宽。既然单线程容易实现,而CPU又不会是瓶颈,那就顺理成章采用单线程。 为什么快 redis是完全基于内存操作的,绝大部分请求都是单纯的内存操作,
阅读全文
摘要:存储方式:memcached会把数据全部存在内存之中,断电即失。redis使用aof和rdb持久化,可以把数据持久化到磁盘上。 数据支持类型:memcached对数据的支持很简单,只支持简单的key-value存储,而redis还支持list hash set sort set类型。redis还有三
阅读全文
摘要:缓存污染问题指的是留存在缓存中的数据,实际不会再被访问了,但是又占据了缓存空间。如果这样的数据体量很大,甚至占满了缓存,每次有新数据写入缓存时,还需要把这些数据逐步淘汰出缓存,就会增加缓存操作的时间开销。 因此,要解决缓存污染问题,最关键的技术就是能识别出这些只访问一次或是访问次数很少的数据,在淘汰
阅读全文
摘要:redis4.0之后一共有8中淘汰策略。我们按照是否会进行数据淘汰把他们分成两类: 不进行数据淘汰的策略,只有noeviction这一种 会进行数据淘汰的7中其他策略。 会进行淘汰的其中策略,我们可以进一步根据淘汰候选数据集的范围把他们分成两类: 在设置了过期时间的数据中进行淘汰,包括volatil
阅读全文
摘要:redis是key-value数据库,我们可以设置redis中缓存的key的过期时间。redis的过期策略就是指当redis中缓存的key过期了,redis如何处理。 惰性删除:只有当访问一个key时,才会判断该key是否已经过期,过期则删除。该策略可以最大化节省CPU资源,却对内存非常不友好。极端
阅读全文
摘要:RDB:Redis DataBase 在指定的时间间隔内将内存中的数据集快照写入磁盘,实际操作过程是fork出一个子进程,先将数据集写入临时文件,写入成功后,再替换之间的文件,用二进制压缩存储。 为了写快照而暂停写操作,这肯定是不能接受的。所以这个时候,Redis就会借助操作系统提供的写时复制(Co
阅读全文
摘要:INNODB和MYISAM 在MySQL 5.1之前的版本中,默认的搜索引擎是MyISAM,从MySQL 5.5之后的版本中,默认的搜索引擎变更为InnoDB MYISAM INNODB 事务支持 不支持 支持 数据行锁定 不支持(表锁定) 支持 外键约束 不支持 支持 全文索引 支持 不支持 表空
阅读全文
摘要:mysql主从同步过程: mysql的主从复制主要有三个线程:master:二进制日志转储线程(binlog dump thread)、slave:I/O线程(I/O thread)和SQL线程(SQL thread).master一条线程和slave中的两条线程。 主节点binlog,主从复制的基
阅读全文
摘要:多版本并发控制:读取数据时通过一种类似快照的方式将数据保存下来,这样读锁就和写锁不冲突了,不同事务会话看到自己特定版本的数据,使用版本链。 MVCC只在READ COMMITTED 和 REPEATABLE READ 两个隔离级别下工作。其他两个隔离级别和MVCC不兼容,因为READ UNCOMMI
阅读全文
摘要:A 原子性 由undo log日志保证,它记录了需要回滚的日志信息,事务回滚是撤销已经成功执行的sql C 一致性 由其他三大特性保证、程序代码要保证业务上的一致性 I 隔离性 由MVCC来保证 D 持久性 由内存+redo log来保证,mysql修改数据同时在内存和redo log记录这次操作,
阅读全文
摘要:什么是Mysql执行计划 执行计划是Mysql如何执行一条sql语句,包括sql查询顺序、是否使用索引、索引信息、查询命中率等信息。 基本语法 explain select ... InnoDb引擎的执行计划内容 id:由一组数字组成,表示一个查询中各个子查询的执行顺序; id相同执行顺序由上之下
阅读全文
摘要:在业务系统中,除了使用主键进行查询,其他的都会在测试库上测试其耗时。 慢查询的优化首先要搞明白慢的原因是什么?是查询条件没有命中索引?是load了不需要的数据列?还是数据量太大? 所以优化也是针对这三个方向来的: 首先分析语句,看看是否load了额外的数据列,可能是查询了多余的行并且抛弃掉了(使用s
阅读全文
摘要:事务的基本特性ACID分别是: 原子性指的是一个事务中的操作要么都成功,要么都失败。 一致性指的是数据库总是从一个一致性状态转移到另外一个一致性状态。比如A转账给B100块钱,假设A只有90块,支付之间我们数据库里面的数据都是符合约束的,但是如果事务执行成功了,我们的数据库数据就破坏了约束,因此事务
阅读全文
摘要:基于锁的属性分类:共享锁、排他锁 基于锁的力度分类:页级锁(BDB引擎)、表级锁(InnoDb、Myisam)、行级锁(InnoDb)、记录锁、间隙锁、临键锁(next-key lock) 基于锁的状态分类:意向共享锁、意向排他锁 共享锁 共享锁又称读锁,简称S锁;当一个事务为数据加上读锁之后,其他
阅读全文
摘要:查询更快、占用空间更小 1、适合索引的列是出现where子句中的列,或者连接子句中指定的列。 2、基数较小的表,索引效果较差,所以数量较小的表没有必要建立索引 3、使用短索引,如果对长字符串列进行索引,应该指定一个前缀长度,这样能够节省大量索引空间,如果搜索词超出索引前缀长度,则使用索引排除不匹配的
阅读全文
摘要:都是B+树的数据结构 聚簇索引:将数据存储和索引放在一起、并且是按照一定的顺序组织的,找到索引也就找到了数据,数据的物理存放顺序与索引顺序是一致的,即:只要索引是相邻的,那么对应的数据一定也是相邻的存放在磁盘上的。 非聚簇索引:叶子节点不存储数据,存储的是数据行地址,也就是说根据索引查找到数据行的位
阅读全文
摘要:spring事务的原理是AOP,进行了切面增强,那么失效的根本原因时这个AOP不起作用了!常见情况如下集中: 1、发生自调用,类里面使用this调用本类的方法(this通常省略),此时这个this不是代理对象,而是UserService类本身,所以失效。 解决办法很简单,让this变成UserSer
阅读全文
摘要:多个方法相互调用时,事务如何在这些方法间传播 方法A是一个事务的方法,方法A执行过程中调用了方法B,那么方法B有无事务以及方法B对事务的要求不同都会对方法A的事务具体执行造成影响,同时方法A的事务对方法B的事务执行也会有影响,这种影响具体是什么就由两个方法所定义的事务传播类型所决定。 require
阅读全文
摘要:在使用spring框架时,可以有两种使用事务的方式,一种时编程式事务,一种是申明式事务,@Transactional注解就是申明式的。 首先,事务这个概念式数据库层面的,Spring只是基于数据库中的事务进行了扩展,以及提供了一些能让程序员更加方便操作事务的方式。 比如我们可以通过在某个方法上增加@
阅读全文
摘要:单例Bean不是线程安全的 Spring中Bean默认是单例模式的,框架并没有对bean进行对线程封装和处理。 如果Bean是有状态的,那就需要开发人员自己来进行线程安全的保证,最简单的办法就是改变bean的作用域,把singleton改为prototype,这样每次请求bean就相当于是new B
阅读全文
摘要:singletion:默认,每个容器只能有一个bean的实例,单例模式由BeanFactory自身来维护。该对象的生命周期是与Spring IOC容器一致的(但在第一次被注入时才会创建) prototype:为每一个bean请求提供一个实例。在每次注入时都会创建一个新的对象 request:bean
阅读全文
摘要:1、解析类得到BeanDefinition (Spring创建对象不是使用程序员定义的class文件,而是使用的BeanDefination) 2、如果有多个构造方法,则需要推断构造方法 3、确定好构造方法后,进行实例化得到一个对象。(原始对象) 4、填充属性,依赖注入。 5、回调Aware,比如B
阅读全文
摘要:ApplicationContext是BeanFactory的子接口 ApplicationContext 提供了更完整的功能: 继承MessageSource,因此支持国际化 统一的资源文件访问方式 提供在监听器中注册bean的事件 同时加载多个配置文件 载入多个(有继承关系)上下文,使得每一个上
阅读全文
摘要:系统是由许多不同的组件所组成,每一个组件各负责一块特定功能。除了实现自身核心功能之外,这些组件还经常承担着额外的职责。例如日志、事务管理和安全这样的核心服务经常融入到自身具有核心业务逻辑的组件中去。这些系统服务经常被称为横切关注点,因为他们会跨越系统的多个组件。 当我们需要为分散的对象引入公共行为的
阅读全文
摘要:IOC有三点:容器概念、控制反转、依赖注入。 IOC容器 实际上就是一个map(key,value),里面存放的时各种对象(在xml里配置的bean节点、@repository、@service、@controller、@component),在项目启动的时候或读取配置文件里面的bean节点,根据全
阅读全文
摘要:线程池将线程和任务进行解耦,线程是线程,任务是任务,拜托了之前通过Thread创建线程时一个线程必须对应一个任务的限制 在线程池中,同一个线程可以从阻塞队列中不断获取新任务来执行,其核心原理在于线程池对Thread进行了封装,并不是每次执行任务都会调用Thread.start()来创建新线程,而是让
阅读全文
摘要:1、一般的队列只能保证作为一个有限长度的缓冲区,如果超出了缓冲长度,就无法保留当前的任务了,阻塞队列通过阻塞可以保留住当前想要继续入队的任务。 阻塞队列可以保证任务队列中没有任务时阻塞来获取任务的线程(即线程池中没有任务时,阻塞核心线程),使得线程进入wait状态,释放cpu 阻塞队列自带阻塞和唤醒
阅读全文
摘要:1、降低资源消耗;提高线程利用率,降低创建和销毁线程的消耗。 2、提高响应速度;任务来了,直接就有线程可用可执行,而不是先创建线程,在执行。 3、提高线程可管理性;线程时稀缺资源,使用线程池可以统一分配调优监控。 corePollSize 代表核心线程数,也就是正常情况下创建工作的线程数,这些线程创
阅读全文
摘要:内存泄漏为程序在申请内存后,无法释放已申请的内存空间,一次泄露危害可以忽略,但内存泄漏堆积后果很严重,无论多少内存,迟早会被占光。 不再会被使用的对象或者变量占用的内存空间不能被回收,就是内存泄漏。 强引用:使用最普遍的一个引用(new),一个对象具有强引用,不会被垃圾收集器回收。当内存空间不足,j
阅读全文
摘要:每一个Thread对象均含有一个ThreadLocalMap类型的成员变量threadLocals,它存储本线程中所有ThreadLocal对象及其对应的值 ThreadLocalMap是由一个个Entry对象构成,Entry继承自WeakReference,一个Entry是由ThreadLocal
阅读全文
摘要:锁池 所有需要竞争同步锁的线程都会放在锁池当中,比如当前对象的锁已经被其中一个线程得到,则其他线程需要在这个锁池进行等待,当前面的线程释放同步锁后锁池中的线程去竞争同步锁,当某个线程得到后会进入就绪队列进行等到CPU资源分配。 等待池 当我们调用wait()方法后,线程会放到等待池当中,等待池的线程
阅读全文
摘要:引用计数法:每个对象有一个引用计数属性,新增一个引用时计数器+1,引用释放时计算器 -1,计数为0时可以回收。 可达性分析:从GC Roots开始向下收索,搜索走过的路径成为引用链。当一个对象到GC Roots没有任何引用链相连时,则证明此对象是不可用的,那么虚拟机就判断是可回收对象。 引用计数法,
阅读全文
摘要:java类加载器 jdk自带有三个类加载器:BootstrapClassLoader、ExtClassLoader、APPClassLoader。 BootStrapClassLoader时ExtClassLoader的父类加载器 (这里所说的父类加载器时组合关系,并不是继承关系) 默认负责加载%J
阅读全文
摘要:jdk7 数据结构:ReentrantLock + Segment + HashEntry,一个Segment中包含一个HashEntry数组,每个HashEntry又是一个链表结构 元素查询:二次hash,第一次hash定位到Segment,第二次hash定位到segment中元素所在的链表头部
阅读全文
摘要:hashCode介绍 hashCode()的做用是获取哈希码,也称为散列码;它实际上返回的是一个int整数。这个哈希码的作用是确定该对象在哈希表中的索引位置。hashCode()定义在JDK的Object类中,java中的任何类都包含hashCode()函数。散列表存储的是键值对(key-value
阅读全文
摘要:抽象类可以存在普通成员函数,而接口中只能存在public abstract方法 抽象类只能单继承,接口可以多实现 抽象类中的成员变量可以是多种类型,而接口中的成员变量只能是public static final 接口设计的目的,是对类的行为进行约束,也就是提供一种机制,可以强烈要求不同的类具有相同的
阅读全文
摘要:public class Main { public static void main(String[] args) { OutClass outClas= new OutClass(); outClas.outPrint(2); H1 t = new H1(); t.test(3); } } cl
阅读全文

浙公网安备 33010602011771号