摘要: redis是内存数据库,它把数据存储在内存中,这样在加快读取速度的同时也对数据安全性产生了新的问题,即当redis所在服务器发生宕机后,redis数据库里的所有数据将会全部丢失。 为了解决这个问题,redis提供了持久化功能:RDB和AOF。 全量写入:RDB rdb是redis的一种数据持久化策略,redis将某一时间点的数据全部打包生成一个.rdb的文件,保存在磁盘中,当我们重启redis服务... 阅读全文
posted @ 2019-02-28 23:30 robin·张 阅读(191) 评论(0) 推荐(0) 编辑
摘要: Redis为了达到最快的读写速度将数据都读到内存中,并通过异步的方式将数据写入磁盘。所以Redis具有快速和数据持久化的特性。 如果不将数据放到内存中,磁盘的I/O速度会严重影响redis的性能。在内存越来越便宜的今天,redis将会越来越受欢迎。如果设置了最大使用的内存,则数据已有记录数达到内存限值后将不能继续插入新值。 阅读全文
posted @ 2019-02-28 23:09 robin·张 阅读(3097) 评论(0) 推荐(0) 编辑
摘要: redis采用的是定期删除+惰性删除策略。 为什么不用定时删除策略? 定时删除,用一个定时器来负责监视key,过期则自动删除。虽然内存及时释放,但是十分消耗CPU资源。在大并发请求下,CPU要将时间应用在处理请求,而不是删除key,因此没有采用这一策略. 定期删除+惰性删除是如何工作的呢? 定期删除,redis默认每个100ms检查,是否有过期的key,有过期key则删除。需要说明的是,redi... 阅读全文
posted @ 2019-02-27 23:09 robin·张 阅读(511) 评论(0) 推荐(0) 编辑
摘要: CMS收集器 CMS收集器是一种以获取最短回收停顿时间为目标的收集器。基于“标记-清除”算法实现,它的运作过程如下: 初始标记 并发标记 重新标记 并发清除 初始标记、从新标记这两个步骤仍然需要“stop the world”,初始标记仅仅只是标记一下GC Roots能直接关联到的对象,熟读很快,并发标记阶段就是进行GC Roots Tracing,而重新标记阶段则是为了修正并发标记期间因用户程... 阅读全文
posted @ 2019-02-26 23:18 robin·张 阅读(566) 评论(0) 推荐(0) 编辑
摘要: 在Java中,类加载器把一个类加载进Java虚拟机中,要经过三个步骤来完成:加载、链接和初始化,其中链接又可以分成验证、准备和解析三步,除了解析外,其它步骤是严格按照顺序完成的,各个步骤的主要工作如下: 加载:查找和导入类或接口的二进制数据; 链接:执行下面的校验、准备和解析步骤,其中解析步骤是可以选择的; 验证:检查导入类或接口的二进制数据的正确性; 准备:给类的静态变量分配并初始化存储空间... 阅读全文
posted @ 2019-02-25 23:20 robin·张 阅读(646) 评论(0) 推荐(0) 编辑
摘要: Spring Cloud Eureka Eureka负责服务的注册于发现,Eureka的角色和 Zookeeper差不多,都是服务的注册和发现,构成Eureka体系的包括:服务注册中心、服务提供者、服务消费者。 上图中描述了(图片来源于网络): 两台Eureka服务注册中心构成的服务注册中心的主从复制集群; 然后服务提供者向注册中心进行注册、续约、下线服务等; 服务消费者向Eureka注册中... 阅读全文
posted @ 2019-02-24 23:03 robin·张 阅读(770) 评论(0) 推荐(0) 编辑
摘要: Minor GC触发条件:当Eden区满时,触发Minor GC。 Full GC触发条件: 调用System.gc时,系统建议执行Full GC,但是不必然执行 老年代空间不足 方法去空间不足 通过Minor GC后进入老年代的平均大小大于老年代的可用内存 由Eden区、From Space区向To Space区复制时,对象大小大于To Space可用内存,则把该对象转存到老年代,且老年代的可... 阅读全文
posted @ 2019-02-23 22:58 robin·张 阅读(179) 评论(0) 推荐(0) 编辑
摘要: 封装 封装隐藏了类的内部实现机制,可以在不影响使用的情况下改变类的内部结构,同时也保护了数据。对外界而已它的内部细节是隐藏的,暴露给外界的只是它的访问方法。 封装的优点: 便于使用者正确、方便的使用系统,防止使用者错误修改系统属性; 有助于建立各个系统之间的松耦合关系;提高软件的可重用性; 降低了大型系统的风险,即便整个系统不成功,个别独立的子系统有可能还有价值。 封装的原则又是什么呢,现在我... 阅读全文
posted @ 2019-02-22 23:07 robin·张 阅读(445) 评论(0) 推荐(0) 编辑
摘要: http是HTTP协议运行在TCP之上。所有传输的内容都是明文,客户端和服务器端都无法验证对方的身份。 https是HTTP运行在SSL/TLS之上,SSL/TLS运行在TCP之上。所有传输的内容都经过加密,加密采用对称加密,但对称加密的密钥用服务器方的证书进行了非对称加密。此外客户端可以验证服务器端的身份,如果配置了客户端验证,服务器方也可以验证客户端的身份。 阅读全文
posted @ 2019-02-22 22:58 robin·张 阅读(122) 评论(0) 推荐(0) 编辑
摘要: Redis是一种单线程机制的nosql数据库,基于key-value,数据可持久化落盘。由于单线程所以Redis本身并没有锁的概念,多个客户端连接并不存在竞争关系,但是利用jedis等客户端对Redis进行并发访问时会出现问题。 比如:同时有多个子系统去set一个key。这个时候要注意什么呢? 举一个例子:多客户端同时并发写一个key,一个key的值是1,本来按顺序修改为2,3,4,最后是4;但是... 阅读全文
posted @ 2019-02-21 23:30 robin·张 阅读(732) 评论(0) 推荐(0) 编辑
摘要: 概述 为了确保分布式锁可用,我们至少要确保锁的实现同时满足以下四个条件: 互斥性:在任意时刻,只有一个客户端能持有锁。 不会发生死锁:即使有一个客户端在持有锁的期间崩溃而没有主动解锁,也能保证后续其他客户端能加锁。 容错性:只要大部分的Redis节点正常运行,客户端就可以加锁和解锁。 一致性:加锁和解锁必须是同一个客户端,客户端自己不能把别人加的锁给解了。 代码实现 首先我们要通过Maven... 阅读全文
posted @ 2019-02-21 23:24 robin·张 阅读(181) 评论(0) 推荐(0) 编辑
摘要: 概述 对于普通的Java对象,当new的时候创建对象,当它没有任何引用的时候被垃圾回收机制回收。而由Spring IoC容器托管的对象,它们的生命周期完全由容器控制。Spring中每个Bean的生命周期如下: 1. 实例化Bean 对于BeanFactory容器,当客户向容器请求一个尚未初始化的bean时,或初始化bean的时候需要注入另一个尚未初始化的依赖时,容器就会调用createBean进... 阅读全文
posted @ 2019-02-20 23:25 robin·张 阅读(433) 评论(0) 推荐(0) 编辑
摘要: 在了解一致性哈希算法之前,最好先了解一下缓存中的一个应用场景,了解了这个应用场景之后,再来理解一致性哈希算法,就容易多了,也更能体现出一致性哈希算法的优点,那么,我们先来描述一下这个经典的分布式缓存的应用场景。 场景描述 假设,我们有三台缓存服务器,用于缓存图片,我们为这三台缓存服务器编号为0号、1号、2号,现在,有3万张图片需要缓存,我们希望这些图片被均匀的缓存到这3台服务器上,以便它们能够分摊... 阅读全文
posted @ 2019-02-19 22:57 robin·张 阅读(245) 评论(0) 推荐(0) 编辑
摘要: MVC 在SpringMVC中,MVC三部分的作用如下: 执行流程 具体到执行流程上,SpringMVC主要依赖了HandlerMapping 处理器映射器、HandlerAdapter 处理器适配器以及 ViewReslover 视图解析器三个组件。 SpringMVC执行流程示意图如下: 图中将SpringMVC的执行流程分成了11个步骤: 用户发送请求至前端控制器 Dispatcher... 阅读全文
posted @ 2019-02-18 22:56 robin·张 阅读(2285) 评论(0) 推荐(0) 编辑
摘要: IOC初始化流程 Resource定位;指对BeanDefinition的资源定位过程。Bean 可能定义在XML中,或者是一个注解,或者是其他形式。这些都被用Resource来定位, 读取Resource获取BeanDefinition 并注册到 Bean定义注册表中。 BeanDefinition的载入;把用户定义好的Javabean表示为IoC容器内部的数据结构,这个容器内部的数据结构就是... 阅读全文
posted @ 2019-02-17 23:12 robin·张 阅读(1053) 评论(0) 推荐(0) 编辑
摘要: IOC的核心理念即是控制反转。将对依赖的控制从具体业务对象手中转交到平台或框架中,需要的时候再由平台或框架注入到具体业务对象中。可以说依赖注入是控制反转的实现方式。 IOC的优点: 降低代码耦合度 减少重复代码和冗余对象 提升可测试性 IoC容器是Spring的核心模块,是抽象了对象管理、依赖关系管理的框架解决方案。 在Spring IoC容器的设计中,有两个主要的容器系列,一个是实现了Bean... 阅读全文
posted @ 2019-02-17 22:55 robin·张 阅读(510) 评论(0) 推荐(1) 编辑
摘要: ProxyFacotryBean是FacotryBean的一种实现,FacotryBean要产生bean都要重写getObject方法,而ProxyFacotryBean这里的这个getObject正是为代理做了准备并返回代理对象。首先用initializeAdvisorChain(第一次去取代理对象时初始化一遍)初始化Advisor链后对于singleton和prototype进行区分生成对应... 阅读全文
posted @ 2019-02-16 22:05 robin·张 阅读(803) 评论(0) 推荐(0) 编辑
摘要: 容器初始化 容器的初始化首先是在对应的构造器中进行,在applicationContext的实现类构造器中,首先对参数路径中的${}进行了处理,用系统变量替换(setConfigLocations方法)然后调用refresh方法(这个就是最核心的容器初始化方法)。 1、Resource定位: 在refresh方法中调用obtainFreshBeanFactory方法告诉子类刷新beanfacto... 阅读全文
posted @ 2019-02-16 22:01 robin·张 阅读(205) 评论(0) 推荐(0) 编辑
摘要: 概述 在业务量不大时,单库单表即可支撑。 当数据量过大存储不下、或者并发量过大负荷不起时,就要考虑分库分表。 相关术语 读写分离: 不同的数据库,同步相同的数据,分别只负责数据的读和写; 分区: 指定分区列表达式,把记录拆分到不同的区域中(必须是同一服务器,可以是不同硬盘),应用看来还是同一张表,没有变化; 分库:一个系统的多张数据表,存储到多个数据库实例中; 分表: 对于一张多行(记录)多列(... 阅读全文
posted @ 2019-02-15 23:31 robin·张 阅读(473) 评论(0) 推荐(0) 编辑
摘要: redis-sentinel方案提供了单点的高可用解决方案,但是当数据量和业务量极速增长时,单点的reids不可能无限的纵向扩容(增大内存),这个时候就需要redis有集群的能力来扛。 redis集群的几种实现方式如下: 客户端分片:优点简单,客户端sharding不支持动态增删节点;劣势很大,服务端Redis实例群拓扑结构有变化时每个客户端都需要更新调整,连接不能共享,当应用规模增大时,资源浪... 阅读全文
posted @ 2019-02-15 00:35 robin·张 阅读(335) 评论(0) 推荐(0) 编辑
摘要: sentinel简介 Redis-Sentinel是Redis官方推荐的高可用性(HA)解决方案,当用Redis做Master-slave的高可用方案时,假如master宕机了,Redis本身(包括它的很多客户端)没有实现自动进行主备切换。而Redis-sentinel是一个独立运行的进程,它能监控多个master-slave集群,发现master宕机后能进行自动切换。 它的主要功能有以下几点: ... 阅读全文
posted @ 2019-02-15 00:26 robin·张 阅读(128) 评论(0) 推荐(0) 编辑
摘要: Master&Slave也就是我们所说的主从复制,即主机数据更新后根据配置和策略,自动同步到备机的机制。其中Master以写为主,Slave以读为主。 Master&Slave的作用主要有两个: 读写分离; 容灾恢复。 redis replication核心机制 redis采用异步的形式复制数据到slave,从redis 2.8开始,slave会周期性地确认自己每次复制的数据量 一个maste... 阅读全文
posted @ 2019-02-15 00:16 robin·张 阅读(252) 评论(0) 推荐(0) 编辑
摘要: Redis简介 Redis是一个开源的内存中的数据结构存储系统,它可以用作:数据库、缓存和消息中间件。 它支持多种类型的数据结构,如字符串(String),散列(Hash),列表(List),集合(Set),有序集合(Sorted Set或者是ZSet)与范围查询,Bitmaps,Hyperloglogs 和地理空间(Geospatial)索引半径查询。其中常见的数据结构类型有:String、Li... 阅读全文
posted @ 2019-02-13 23:49 robin·张 阅读(196) 评论(0) 推荐(0) 编辑
摘要: 著名的CAP理论指出,一个分布式系统不可能同时满足C(一致性)、A(可用性)和P(分区容错性)。由于分区容错性在是分布式系统中必须要保证的,因此我们只能在A和C之间进行权衡。在此Zookeeper保证的是CP, 而Eureka则是AP。 Zookeeper保证CP 当向注册中心查询服务列表时,我们可以容忍注册中心返回的是几分钟以前的注册信息,但不能接受服务直接down掉不可用。也就是说,服务注册功... 阅读全文
posted @ 2019-02-12 23:23 robin·张 阅读(376) 评论(0) 推荐(0) 编辑
摘要: 缓存穿透 缓存穿透是指查询一个一定不存在的数据,由于缓存是不命中时需要从数据库查询,查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到数据库去查询,造成缓存穿透。 解决办法: 预校验 在控制层对查询参数先进行校验,不符合则丢弃。 布隆过滤 将所有可能查询的参数添加到BloomFilter中,一定不存在的记录就会被BloomFilter过滤掉,从而避免了对底层存储系统的查询压力。 缓存空... 阅读全文
posted @ 2019-02-12 23:15 robin·张 阅读(399) 评论(0) 推荐(0) 编辑
摘要: CAP原则 CAP原则又称CAP定理,是一个经典的分布式系统理论。CAP理论告诉我们:一个分布式系统不可能同时满足一致性(C:Consistency)、可用性(A:Availability)和分区容错性(P:Partition tolerance)这三个基本需求,最多只能同时满足其中两项。 一致性 在分布式环境下,一致性是指数据在多个副本之间能否保持一致的特性。在一致性的需求下,当一个系统在数据一... 阅读全文
posted @ 2019-02-12 00:06 robin·张 阅读(864) 评论(1) 推荐(0) 编辑
摘要: logs innodb事务日志包括redo log和undo log。redo log是重做日志,提供前滚操作,undo log是回滚日志,提供回滚操作。 undo log不是redo log的逆向过程,其实它们都算是用来恢复的日志: redo log通常是物理日志,记录的是数据页的物理修改,而不是某一行或某几行修改成怎样怎样,它用来恢复提交后的物理数据页(恢复数据页,且只能恢复到最后一次提交的位... 阅读全文
posted @ 2019-02-10 23:08 robin·张 阅读(426) 评论(0) 推荐(0) 编辑
摘要: InnoDB是一个支持行锁的存储引擎,它有三种行锁的算法: Record Lock:行锁,单个行记录上的锁。 Gap Lock:间隙锁,锁定一个范围,但不包括记录本身。GAP锁的目的,是为了防止幻读、防止间隙内有新数据插入、防止已存在的数据更新为间隙内的数据。 Next-Key Lock:1+2,锁定一个范围,并且锁定记录本身。对于行的查询,都是采用该方法,主要目的是解决幻读的问题。InnoDB... 阅读全文
posted @ 2019-02-09 23:01 robin·张 阅读(829) 评论(0) 推荐(0) 编辑
摘要: 什么是MVVC? MVVC (Multi-Version Concurrency Control) (注:与MVCC相对的,是基于锁的并发控制,Lock-Based Concurrency Control)是一种基于多版本的并发控制协议,只有在InnoDB引擎下存在。MVCC是为了实现事务的隔离性,通过版本号,避免同一数据在不同事务间的竞争,你可以把它当成基于多版本号的一种乐观锁。当然,这种乐观锁... 阅读全文
posted @ 2019-02-09 01:02 robin·张 阅读(390) 评论(0) 推荐(0) 编辑
摘要: ANSI/ISO SQL定义的标准隔离级别有四种,从高到底依次为:可序列化(Serializable)、可重复读(Repeatable reads)、提交读(Read committed)、未提交读(Read uncommitted)。 下面将依次介绍这四种事务隔离级别的概念、用法以及解决了哪些问题(读现象) 未提交读(Read uncommitted) 未提交读(READ UNCOMMITTED... 阅读全文
posted @ 2019-02-07 23:58 robin·张 阅读(971) 评论(0) 推荐(1) 编辑
摘要: 为什么需要隔离 当多个线程都开启事务操作数据库中的数据时,数据库系统要能进行隔离操作,以保证各个线程获取数据的准确性,在介绍数据库提供的各种隔离级别之前,我们先看看如果不考虑事务的隔离性,会发生的几种问题: 脏读 脏读是指在一个事务处理过程里读取了另一个未提交的事务中的数据。 当一个事务正在多次修改某个数据,而在这个事务中这多次的修改都还未提交,这时一个并发的事务来访问该数据,就会造成两个事务得到... 阅读全文
posted @ 2019-02-07 23:42 robin·张 阅读(162) 评论(0) 推荐(0) 编辑
摘要: 数据库事务(Database Transaction) ,是指作为单个逻辑工作单元执行的一系列操作,要么完全地执行,要么完全地不执行。事务处理可以确保除非事务性单元内的所有操作都成功完成,否则不会永久更新面向数据的资源。通过将一组相关操作组合为一个要么全部成功要么全部失败的单元,可以简化错误恢复并使应用程序更加可靠。一个逻辑工作单元要成为事务,必须满足所谓的ACID(原子性、一致性、隔离性和持久性... 阅读全文
posted @ 2019-02-07 23:32 robin·张 阅读(212) 评论(0) 推荐(0) 编辑
摘要: 死锁产生 死锁是指两个或多个事务在同一资源上相互占用,并请求锁定对方占用的资源,从而导致恶性循环。 当事务试图以不同的顺序锁定资源时,就可能产生死锁。多个事务同时锁定同一个资源时也可能会产生死锁。 锁的行为和顺序和存储引擎相关。以同样的顺序执行语句,有些存储引擎会产生死锁有些不会——死锁有双重原因:真正的数据冲突;存储引擎的实现方式。 检测死锁 数据库系统实现了各种死锁检测和死锁超时的机制。Inn... 阅读全文
posted @ 2019-02-07 00:10 robin·张 阅读(8341) 评论(0) 推荐(0) 编辑
摘要: 锁粒度 MySQL 不同的存储引擎支持不同的锁机制,所有的存储引擎都以自己的方式显现了锁机制,服务器层完全不了解存储引擎中的锁实现: InnoDB 存储引擎既支持行级锁(row-level locking),也支持表级锁,但默认情况下是采用行级锁。 MyISAM 和 MEMORY 存储引擎采用的是表级锁(table-level locking) BDB 存储引擎采用的是页面锁(page-le... 阅读全文
posted @ 2019-02-07 00:04 robin·张 阅读(1054) 评论(0) 推荐(0) 编辑
摘要: 乐观锁 乐观锁是逻辑概念上的锁,不是数据库自带的,需要我们自己去实现。乐观锁是指操作数据库时(更新操作),想法很乐观,认为这次的操作不会导致冲突,在操作数据时,并不进行任何其他的特殊处理(也就是不加锁),而在进行更新后,再去判断是否有冲突了。 通常实现是这样的:在表中的数据进行操作时(更新),先给数据表加一个版本(version)字段,每操作一次,将那条记录的版本号加1。也就是先查询出那条记录,获... 阅读全文
posted @ 2019-02-06 22:54 robin·张 阅读(561) 评论(0) 推荐(1) 编辑
摘要: 索引选择性 索引选择性是索引基数(cardinality)与表中数据行数(n_row_in_table)的比值,即 索引选择性=索引基数/数据行 其中cardinality是索引中不重复记录的预估值。 不是所有的查询条件出现的列都需要添加索引。对于什么时候添加B+树索引。一般的经验是,在访问表中很少一部分时使用B+树索引才有意义。对于性别字段、地区字段、类型字段,他们可取值范围很小,称为低选择性... 阅读全文
posted @ 2019-02-06 00:18 robin·张 阅读(984) 评论(0) 推荐(0) 编辑
摘要: 执行计划,简单的来说,是SQL在数据库中执行时的表现情况,通常用于SQL性能分析,优化等场景。在MySQL中使用 explain 关键字来查看。如下所示: explain select * from table where table.id = 1 运行上面的sql语句后你会看到,下面的表头信息: table | type | possible_keys | key | key_len | re... 阅读全文
posted @ 2019-02-05 22:47 robin·张 阅读(4414) 评论(0) 推荐(0) 编辑
摘要: 通过实例理解单列索引、多列索引以及最左前缀原则 实例:现在我们想查出满足以下条件的用户id: SELECT `uid` FROM people WHERE lname`='Liu' AND `fname`='Zhiqun' AND `age`=26 因为我们不想扫描整表,故考虑用索引。 单列索引: ALTER TABLE people ADD INDEX lname (lname);将ln... 阅读全文
posted @ 2019-02-04 22:32 robin·张 阅读(791) 评论(0) 推荐(0) 编辑
摘要: WHERE字句的查询条件里有不等于号(WHERE column!=…),MYSQL将无法使用索引 类似地,如果WHERE字句的查询条件里使用了函数(如:WHERE DAY(column)=…),MYSQL将无法使用索引 在JOIN操作中(需要从多个数据表提取数据时),MYSQL只有在主键和外键的数据类型相同时才能使用索引,否则即使建立了索引也不会使用 如果WHERE子句的查询条件里使用了比较操作... 阅读全文
posted @ 2019-02-04 22:26 robin·张 阅读(1372) 评论(0) 推荐(1) 编辑
摘要: mysql的索引分为单列索引(主键索引,唯索引,普通索引)和组合索引. 单列索引:一个索引只包含一个列,一个表可以有多个单列索引. 组合索引:一个组合索引包含两个或两个以上的列, 本文案例使用的表: CREATE TABLE `award` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '用户id', `aty_id` varchar... 阅读全文
posted @ 2019-02-04 22:22 robin·张 阅读(173) 评论(0) 推荐(0) 编辑