Redis实战学习笔记一

初识RedisRedis是一个远程内存数据库。它是一个速度非常快的非关系型内存数据库。它可以存储键到五种类型的映射。并且可以将存储到内存中的数据持久化到磁盘。并且可以使用复制特性来提高读性能,使用客户端分片来提高写性能/ Redis的独到之处Redis不同于我们常用的MySQL数据库的一个特性是它是非关系型数据库。简单的讲就是不会使用表。 它和memcached的一大不同之处在于它支持多种不同的数据类型,而memcached只支持字符串键。 Redis还有一个独特之处在于它是内存数据库。因为内存是易失性存储,所以不得不考虑持久化的问题。Redis的持久化提供了两种方案,一种是时间点转储,第二种方案就是将所有修改了数据库的命令写入一个只追加的文件中,根据用户的设置可以选择从不同步、每秒同步一次或者没写入一个命令就同步一次。

SpringCloud学习笔记三

分布式配置中心 Spring cloud configspring cloud config 是用来为分布式系统中的基础设施和微服务应用提供集中化的外部配置支持,它分为服务端和客户端,其中服务端被称为分布式配置中心,它是一个独立的微服务应用,用来链接仓库,并为客户端提供配置信息。 快速入门搭建配置中心 创建工程,导入相关依赖 12345<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-config-server</artifactId></dependency> 在主程序类中开启sprong cloud config的服务端功能 12345678@SpringBootApplication@EnableConfigServerpublic class ConfigServerApplication { public static void main(String[] args) { SpringApplication.run(ConfigServerApplication.class, args); }}

SpringCloud学习笔记二

服务容错保护Hystrix在微服务架构中,我们将服务拆分为多个服务,通过远程调用的方式执行,很容易出现因为网络或服务本身问题而导致的调用故障和延迟,并且导致调用方的对外服务也出现延迟,若此时调用方的请求不断增加,最终就会出现因为等待故障方响应而形成任务积压,最终导致自身服务的瘫痪。 在分布式架构中,但某个服务单元发生故障之后,通过断路器的故障监测,向调用方返回一个响应,而不是长时间的等待。这样就不会使得线程因调用故障服务被长时间占用不释放,避免了故障在分布式系统中的蔓延。 Hystrix实现了断路器,线程隔离等一系列服务保护功能。

SpringCloud学习笔记一

简介spring cloud是一个基于spring boot实现的微服务架构开发工具。它包含了多个子项目。 spring cloud config: 配置管理工具,支持使用git存储配置内容,可以使用它实现应用配置的外部化存储,并支持客户端配置信息刷新、加密/解密配置内容等。 spring cloud Netflix: 核心组件 Eureka:服务治理组件,包含服务注册中心、服务注册与发现机制的实现。 Hystrix:容错管理组件,实现断路器模式,帮助服务依赖中出现的延迟和为故障提供强大的容错能力。 Ribbon:客户端负载均衡的服务调用组件。 Feign: 基于Ribbon和Hystrix的声明式服务调用组件。 Zuul: 网关组件,提供智能路由、访问过滤等功能。 Archaius:外部化配置组件。 spring cloud bus:事件、消息总线。

SpringBoot使用数据库

使用MySQL添加相应的依赖123456789<dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.15</version></dependency><dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId></dependency> 实体建模创建一些对象与数据库的表建立映射关系假如数据库的E-R图如下:

如何让多个线程同时开始执行

有些时候有这样的情况,需要多个线程同时开始执行任务。为了实现这样的需求,我大概想到了以下两种方式。第一种方式是采用CyclicBarrier类来实现,让多个线程相互等待,直到达到一个屏障点,并且 CyclicBarrier是可重用的。第二种方案是使用CountDownLatch来实现,当计数器为0的时候,所有等待的线程都被唤醒,开始执行他们的任务。

MySQL的锁机制

MySQL锁的概述锁是计算机协调多个进程或线程并发访问某一资源的机制。MySQL中不同的存储引擎支持不同的锁机制。InnoDB存储引擎支持行级锁和表级锁,默认情况下使用的是行级锁。MyISAM支持表级锁。表级锁:开销小,加锁快,不会出现死锁,锁定粒度大,发生锁冲突的概览极高,并发度最低。行级锁: 开销大,加锁满,会出现死锁,锁定粒度最小,发生锁冲突的概览最低,并发度也最高。页面锁: 开销和加锁时间介于表锁和行锁之间,会出现死锁,锁定粒度介于表锁和行锁之间,并发度一般。 MyISAM表锁MySQL的表级锁有两种模式:表共享读锁,表独占写锁。对MyISAM的读不会阻塞其它用户的读请求,但是会阻塞对同一表的写请求。当一个线程获得了一个表的写锁后,只有持有锁的线程可以对表进行更新操作。其它读写操作都会被阻塞。 如何加表锁MyISAM在执行select操作之前会自动给涉及到的表加读锁。在执行更新操作(update,insert,delete)前,会自动给涉及到的表添加写锁。因此一般是不需要显式的去加锁的。一般手动加锁是模拟事务:比如:检查两个表的合计金额是否相同, 123//这种写法显然可能会出现错误(第一条sql执行之后,可能会有金额变动)select sum(total) from orders;select sum(subtotal) from order_detail;

高性能MySQL读书笔记一

索引基础索引类似于书的目录。存储引擎在索引中找到对应值,然后再根据匹配的索引记录找到对应的数据行。索引可以包含一个活多个列的值。如果索引包含多个列,那么列的顺序也十分重要,因为MySQL只能高校地利用索引地最左前缀列。 索引的类型索引有很多类型,MySQL的索引是在存储引擎层实现的,所以没有统一的索引标准。 B-Tree索引大多少MySQL引擎都支持这种索引。他们的内部实现也是不同的,有些存储引擎使用T-Tree结构存储这种索引,有些使用B+Tree。当然性能也各有不同。B-Tree通常意味着所有的值都是按顺序存储的,并且每一个叶子页到根的距离相同相同。B-Tree索引能够加快访问数据的速度,因为存储引擎不再需要进行全表扫描来获取需要的数据,取而代之的是从索引的根节点开始进行搜索。B-Tree对索引是顺序组织存储的,所以很适合查找范围数据索引对多个值进行排序的依据是建表语句中定义的索引列的顺序进行排序的。B-Tree索引适用于全键值、键值范围或键前缀查找。其中键前缀查找只适用于根据最左前缀的操作。 1234567create table People( last_name varchar(50) not null, first_name varchar(50) not null, dob date not null, gender enum('m','f') not null, key(last_name,first_name,dob))

Java多线程编程实战指南读书笔记四

java运行时存储空间Java运行时空间可以非位堆空间,栈空间和非堆空间**。其中堆空间和非堆空间时被多个线程共享的**,而栈空间则是线程的私有空间。每个线程都有自己私有的栈空间。栈空间时为线程的执行而准备的一段固定大小的内存空间,栈空间时线程创建的时候非配的。线程的方法调用是利用栈帧。局部变量的变量之存储在栈空间中,基础类型变量和引用的类型的变量的变量值都是直接存储在栈帧中的。由于一个线程无法访问另一个线程的栈空间,所以线程堆局部变量以及对只能通过当前线程的局部变量才能访问的对象进行操作具有固有的线程安全性堆空间用于存储对象,它也时垃圾回收器工作的场所,即堆空间中没有可达引用的对象会被回收。非堆空间用于存储常量以及类的元数据等,它是Java虚拟机系统的时候分配的一段可以动态扩容的内存空间。类的元数据包括类的静态变量、类有哪些方法以及这些方法的元数据(包括名称,参数和返回值等)

Java多线程编程实战指南读书笔记三

线程数设置的原则 对于CPU密集型线程,考虑到这些线程执行任务值消耗的主要是处理器资源,我们可以将线程数设置为$N_{cpu}$,有事也可以设置为$N_{cpu}+1$ 对于I/O密集型线程,考虑到I/O操作可能导致上下文切换,为这样的线程设置过多的线程数会导致过多的额外系统开销,如果一个工作线程能够满足旧不需要设置更多的线程,如果一个工作者线程不够用,我们可以考虑将这类线程的数量设置为$2*N_{cpu}$ 等待与通知:wait/notify一个线程因为执行目标动作所需的保护条件未满足而被暂停的过程就被称为等待,一个线程更新了系统的状态,使得其它线程所需要的保护条件得以满足的时候唤醒那些被暂停的线程的过程被称为通知。 wait/notify的作用与用法Java平台中Object.wait()/Object.wait(long)和Object.notify()/Object.notifyAll()可用于实现等待和通知。

1789101113