锁轻量级锁场景:如果一个对象虽然有多线程访问,但是多线程时间式错开的(没有竞争),那么可以使用轻量级锁优化
轻量级锁式透明的,仍是synchronized
示例
123456789101112Object obj = new Object();public void method1(){ synchronized(obj){ method2(); }}public void method2(){ synchronized(obj){ ...... }}
创建锁记录对象,每一个线程的栈帧都会包含一个锁的记录结构,内部可以存储锁对象的Mark Word
让锁记录中Object reference指向锁对象,并尝试cas替换Object的Mark Word,将Mark Word的值存入锁记录
如果cas替换成功,对象头中存储了锁记录地址和状态00,表示由该线程给对象加锁
如果cas失败,有两种情况
如果是其他线程已经持有了该对象的锁,这时有竞争,进入锁膨胀
如果是自己执行了synchroni ...
工厂模式三种工厂方式 在java中,万物皆是对象,创建时如果直接new对象,就会使该对象耦合严重,假如需要更换对象,所有new对象的地方都需要该一遍,违反了设计模式开闭原则。如果使用工厂生产对象,我们只需要与工厂打交道,彻底的与对象解耦,如果需要更换对象,直接在工厂更换该对象即可,达到与对象解耦的目的,工厂模式巨大优点就是 : 解耦
简单工厂模式 (不属于GOF 23种经典设计模式)
工厂方法模式
静态工厂方法
简单工厂模式不是一种设计模式,像是一种约定。
结构抽象产品:定义了产品规范,描述了产品主要功能和特性
具体产品:实现或者继承抽象产品的子类
具体工厂:提供了创建产品的方法,调用者通过调用该方法获取产品
示例类图简单工厂实现了对象的解耦合,需要对象只需要工厂去进行生产
代码咖啡类
12345678910public class Coffee { public void getName(){} public void addMilker(){ System.out.println("加牛奶&q ...
RedisSpring data Redis
yml文件12345678910redis: host: 82.157.245.249 port: 6379 password: root lettuce: pool: max-active: 10 max-idle: 10 min-idle: 1 time-between-eviction-runs: 10s
RedisTemplate修改序列化器,防止出现一些问题
使用Json序列化器,会将类的全限定名写进redis
为了节省空间,我们并不会使用JSON序列化器来处理value,二十使用统一的String序列化器,要求只能存储String类型的Key和Value。当需要存储java对象时,手动完成对象序列化和反序列化
StringRedisTemplate使用StringRedisTemplate,它的Key和Value序列化方式默认使用String序列化器
缓存更新策略
低一致性需求:使用Redis自带的内存淘汰策略
高一致性需求 ...
单例模式单例模式: java中最简单的设计模式之一,这种类型的设计模式述语创建者模式,它提供了一种创建对象的最佳方式
这种模式只涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象
特点
单例类: 只能创建一个实例的类
访问类:使用单例类
实现
两种实现方法
饿汉式:类加载就会创建该单例的对象
懒汉式:加载类不会导致该实例对象被创建,首次使用该对象时才会创建
饿汉式Singleton是在类加载的时候创建的对象,饿汉式存在内存浪费问题
静态变量方式12345678910111213public class Singleton { //私有化构造方法 private Singleton() { } //本类中创建对象 private static Singleton INSTANCE = new Singleton(); //暴露一个公共方法对外界获取对象 public static Singleton getIn ...
MySQL三大日志(bin log 、redo log、undo log)
MySQL日志分类 MySQL 日志 主要包括错误日志、查询日志、慢查询日志、事务日志、二进制日志几大类。其中,比较重要的还要属二进制日志 binlog(归档日志)和事务日志 redo log(重做日志)和 undo log(回滚日志)。
redo log(崩溃恢复) redolog(物理日志)是InnoDB数据库引擎独有的,它让数据库具有了崩溃恢复的能力
比如:mysql因为意外导致服务宕机或者挂掉,重启时,InnoDB引擎会重新加载redo log恢复数据,保证了数据库完整性与持久性
刷盘时机(刷盘策略)
InnoDB存储引擎为redo log刷盘提供了innodb_flush_log_at_trx_commit参数,它支持三种策略
0:设置为 0 的时候,表示每次事务提交时不进行刷盘操作
1:设置为 1 的时候,表示每次事务提交时都将进行刷盘操作(默认值)
2:设置为 2 的时候,表示每次事务提交时都只把 redo log buffer 内容写入 page cache
默认是1:也就是说当 ...
RBAC模型权限管理方式RBAC模型 RBAC模型(Role-Based Access Control:基于角色的访问控制)模型是比较早期提出的权限实现模型,在多用户计算机时期该思想即被提出,其中以美国George Mason大学信息安全技术实验室(LIST)提出的RBAC96模型最具有代表,并得到了普遍的公认。
RBAC认为权限授权的过程可以抽象地概括为:Who是否可以对What进行How的访问操作,并对这个逻辑表达式进行判断是否为True的求解过程,也即是将权限问题转换为Who、What、How的问题,Who、What、How构成了访问权限三元组。
RBAC组成
User(用户):每个用户都有唯一的UID识别,并被授予不同的角色
Role(角色):不同角色具有不同的权限
Permission(权限):访问权限
用户-角色映射:用户和角色之间的映射关系
角色-权限映射:角色和权限之间的映射
RBAC模型分类基本模型RBAC0 RBAC0是基础,很多产品只需基于RBAC0就可以搭建权限模型了。在这个模型中,我们把权限赋予角色,再把角色赋予用户。用户和角色,角色和 ...
Docker初始Docker
大型项目组件较多,运行环境复杂,部署会碰到一些问题
依赖关系复杂,出现不兼容问题
开发、测试、生产环境的问题
解决依赖兼容问题
总结Docker是一个快速交付应用、运行应用的技术:
可以将程序及依赖、运行环境一起打包成为镜像,可以迁移到任意的Linux操作系统
运行沙箱机制形成隔离容器、哥哥应用互不干扰
启动、移除都可以通过一个命令完成、方便快捷
Docker与虚拟机
镜像和容器镜像:Docker将应用程序及所需要的依赖、函数库、环境、配置等文件打包在一起,成为镜像
容器:镜像中的应用程序运行后uu形成的进程就是容器,只是Docker会给容器做隔离,对外不可见
容器是为了防止对镜像造成污染
DockerHub:是一个Docker镜像托管平台
Docker架构
安装CentOS安装Docker CE 支持 64 位版本 CentOS 7,并且要求内核版本不低于 3.10, CentOS 7 满足最低内核的要求,所以我们在CentOS 7安装Docker。
卸载如果之前安装过旧版本的Docker,可以使用下面命令卸载:
1234 ...
JWT令牌的组成一个JWT由三个部分组成:JWT头、有效载荷、签名哈希最后由这三者组合进行base64url编码得到JWT
典型的,一个JWT看起来如下图:该对象为一个很长的字符串,字符之间通过”.”分隔符分为三个子串。
JWT头
JWT头部分是一个描述JWT元数据的JSON对象,通常如下所示。
1234{ "alg": "HS256", "typ": "JWT"}
在上面的代码中,alg属性表示签名使用的算法,默认为HMAC SHA256(写为HS256);
typ属性表示令牌的类型,JWT令牌统一写为JWT。
最后,使用Base64 URL算法将上述JSON对象转换为字符串保存。
有效载荷
有效载荷部分,是JWT的主体内容部分,也是一个JSON对象,包含需要传递的数据。 JWT指定七个默认字段供选择。
1234567iss: jwt签发者sub: 主题aud: 接收jwt的一方exp: jwt的过期时间,这个过期时间必须要大于签发时间nbf: 定义在什么时间之前,该jwt都是 ...
spring
未读Spring Security简介
它是spring家族中的一个安全框架,核心功能是授权与认证
Spring Security是一个功能强大且高度可定制的身份验证和访问控制框架。提供了完善的认证机制和方法级的授权功能。是一款非常优秀的权限管理框架。它的核心是一组过滤器链,不同的功能经由不同的过滤器
一般的web应用需要进行授权和认证。
认证:验证当前访问系统的是不是本系统用户,并且具体到那一个用户
授权:经过认证后判定当前用户是否有权限执行某个操作
1.简单上手1.1 准备工作1234<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId></dependency>
1.2数据库验证1.2.1引入依赖123456789<dependency> <groupId>com.baomidou</gro ...
Swagger使用简介Swagger是一款RESTFUL接口的文档在线自动生成+功能测试功能软件。Swagger是一个规范和完整的框架,用于生成、描述、调用和可视化RESTful风格的Web服务。目标是使客户端和文件系统作为服务器以同样的速度来更新文件的方法,参数和模型紧密集成到服务器。
这个解释简单点来讲就是说,swagger是一款可以根据resutful风格生成的生成的接口开发文档,并且支持做测试的一款中间软件。
依赖123456789101112一:引入Swagger依赖库<!--引入swagger--><dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger2</artifactId> <version>2.7.0</version></dependency><dependency> <groupId>io.springfox< ...