SpringBoot日志
SpringBoot日志概念
日志文件:日志文件是用于记录系统操作事件的文件集合,可分为调试日志和系统日志。具有处理历史数据、诊断问题的追踪以及理解系统的活动等重要作用。
调试日志文件:软件开发中,我们经常需要去调试程序,做一些信息,状态的输出便于我们查询程序的运行状况,调试日志就可以帮我们记录下来方便查看
系统日志:系统日志是记录系统中硬件、软件和系统问题的信息,同时还可以监视系统中发生的事件。用户可以通过它来检查错误发生的原因,或者寻找受到攻击时攻击者留下的痕迹。系统日志包括系统日志、应用程序日志和安全日志。
日志框架介绍日志门面:
JCL
SLF4j
日志实现:
JUL
Logback
Log4j
Log4j2
日志门面就是在日志框架和应用程序之间架设一个沟通的桥梁(如JDBC),主要是为了给Java日志访问提供一套标准、规范的API框架。但是日志的配置文件还是写日志实现自身的配置文件
常用选择(SpringBoot底层也是这样的搭配):SLF4j(门面)+ Logback(实现)
SLF4j使用最基本的使用1234567891011121314@Slf4j@Spr ...
Spring Security
Spring Security简介Spring Security 基于 Spring 框架,提供了一套 Web 应用安全性(两方面)的完整解决方案。目前比较主流的用法也是Spring Boot/Spring Cloud + Spring Security
Web 应用的安全性包括:用户认证(Authentication)和用户授权(Authorization)两个部分,这两点也是Spring Security重要核心功能。
认证:验证当前访问系统的是不是本系统的用户,并且要确认具体是哪个用户(一般采用用户名和密码的形式)
授权:经过认证后判断当前用户是否有权限进行某个操作
快速入门
导入依赖
12345678<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId></dependency><dependency> < ...
Redis主从复制
主从复制概述Redis主从复制是指:主机数据更新后根据配置和策略, 自动将一台 Redis服务器的数据复制到其它的 Redis 服务器,前者所在的 Redis服务器也被称为 “主节点”(Master / Leader),后者则被称为 “从节点”(Slave / Follower)。
读操作:主库、从库都可以接收;
写操作:首先到主库执行,然后,主库将写操作同步给从库。
作用:
实现读写分离,性能扩展
能够在Redis服务器崩掉后快速恢复(因为在其他服务器上进行了数据备份)
复制过程当我们启动多个 Redis 实例的时候,它们相互之间就可以通过 replicaof(Redis 5.0 之前使用 slaveof)命令形成主库和从库的关系,之后会按照三个阶段完成数据的第一次同步。
第一阶段:是主从库间建立连接、协商同步的过程,主要是为全量复制做准备。(从库给主库发送 psync 命令,表示要进行数据同步,主库根据这个命令的参数来启动复制。psync 命令包含了主库的 runID 和复制进度 offset 两个参数。)
在第二阶段:主库将所有数据同步给从库。从库收到数据后,在本地完成数 ...
Redis哨兵模式
哨兵模式在 Redis 主从集群中,哨兵机制是实现主从库自动切换的关键机制,它有效地解决了主从复制模式下故障转移问题,弥补了主从复制中需要手动让从机成为主机的缺点,能够后台监控主机是否故障,如果故障了根据投票数自动将从库转换为主机。
哨兵的作用哨兵其实就是一个运行在特殊模式下的 Redis 进程,主从库实例运行的同时,它也在运行。哨兵主要负责的就是三个任务:监控、自动故障转移和通知。
监控
周期性地利用ping命令检查 master 和 slave 是否正常运行,判断主从库是否下线。
哨兵对主库的下线判断有“主观下线”和“客观下线”两种:
主观下线(防止误判):
哨兵进程会使用 PING 命令检测它自己和主、从库的网络连接情况,用来判断实例的状态。如果哨兵发现主库或从库对 PING 命令的响应超时了,那么,哨兵就会先把它标记为“主观下线”。
客观下线:
通常会采用多实例组成的集群模式进行部署,这也被称为哨兵集群。引入多个哨兵实例一起来判断,只有大多数的哨兵实例,都判断主库已经“主观下线”了,主库才会被标记为“客观下线”。
自动故障转移
主库挂了以后,断开 mas ...
Redis集群
Redis集群Redis 集群实现了对Redis的水平扩容,即启动N个redis节点,将整个数据库分布存储在这N个节点中,每个节点存储总数据的1/N即切片集群,也叫分片集群。解决了大型单实例持久化阻塞主线程的问题,也方便了扩容问题。
并且Redis 集群通过分区(partition)来提供一定程度的可用性(availability): 即使集群中有一部分节点失效或者无法进行通讯, 集群也可以继续处理命令请求。
数据切片和实例的对应分布关系切片集群是一种保存大量数据的通用机制,这个机制可以有不同的实现方案。一般使用的是Redis Cluster,这里也讲的是Redis Cluster。
Redis Cluster 方案采用哈希槽(Hash Slot,接下来我会直接称之为 Slot),来处理数据和实例之间的映射关系。
在 Redis Cluster 方案中,一个切片集群共有 16384 个哈希槽,这些哈希槽类似于数据分区,每个键值对都会根据它的 key,被映射到一个哈希槽中。
映射过程:
根据键值对的 key,按照CRC16 算法计算一个 16 bit 的值
再用这个 16bit 值对 ...
Redis缓存雪崩
Redis缓存雪崩缓存雪崩缓存雪崩是指在同一时段大量的缓存key同时失效或者Redis服务宕机,导致大量请求到达数据库,带来巨大压力。
缓存key失效的解决方案:
给不同的Key的TTL添加随机值
Redis服务宕机的解决方案:
利用Redis集群提高服务的可用性
给缓存业务添加降级限流策略
给业务添加多级缓存
Redis缓存击穿
Redis缓存击穿缓存击穿问题也叫热点Key问题,就是一个被高并发访问并且缓存重建业务较复杂的key突然失效了,无数的请求访问会在瞬间给数据库带来巨大的冲击。
常见的解决方案有两种:
互斥锁
逻辑过期
利用锁因为锁能实现互斥性。假设线程过来,只能一个人一个人的来访问数据库,从而避免对于数据库访问压力过大,但这也会影响查询的性能。(我们可以采用tryLock方法 + double check来解决这样的问题。)
优点
没有额外的内存消耗
保证一致性
实现简单
缺点
线程需要等待,性能受影响
可能有死锁风险
redisTemplate实现互斥锁:(没有考虑原子性,原子性可以使用lua脚本保证)
1234567891011121314151617181920212223private static final String ID_PREFIX = UUID.randomUUID().toString(true) + "-";//获取锁public boolean tryLock(long timeoutSec) {// 获取线程标示String th ...
redis缓存穿透
缓存穿透缓存穿透 :缓存穿透是指客户端请求的数据在缓存中和数据库中都不存在,这样缓存永远不会生效,这些请求都会打到数据库。
数据穿透了缓存,直击数据库,我们都知道数据库能够承载的并发不如redis这么高,如果大量的请求同时过来访问这种不存在的数据,这些请求就都会访问到数据库。
常见的解决方案有两种:
缓存空对象
优点:实现简单,维护方便
缺点:
额外的内存消耗
可能造成短期的不一致
布隆过滤
优点:内存占用较少,没有多余key
缺点:
实现复杂
存在误判可能
缓存空对象这种解决方案就是哪怕这个数据在数据库中也不存在,我们也把这个数据存入到redis中去,这样,下次用户过来访问这个不存在的数据,那么在redis中也能找到这个数据就不会进入到数据库了
布隆过滤这种解决方案思路大致是在客户端与Redis中间再加了一层布隆过滤器。
如果布隆过滤器判断存在则放行,否则直接返回,这个请求会去访问redis,哪怕此时redis中的数据过期了,但是数据库中一定存在这个数据,在数据库中查询出来这个数据后,再将其放入到redis中。
(布隆过滤器其实采用的是哈希思想 ...
Redis缓存
Redis缓存缓存数据存储于代码中,而代码运行在内存中,内存的读写性能远高于磁盘,缓存可以大大降低用户访问并发量带来的服务器读写压力
但是缓存也会增加代码复杂度和运营的成本:
缓存的使用实际开发中,会构筑多级缓存来使系统运行速度进一步提升,例如:本地缓存与redis中的缓存并发使用:
常用的缓存更新策略缓存更新是redis为了节约内存而设计出来的一个东西,主要是因为内存数据宝贵,当我们向redis插入太多数据,此时就可能会导致缓存中的数据过多,所以redis会对部分数据进行更新,或者把他叫为淘汰更合适。
内存淘汰:redis自动进行,当redis内存达到咱们设定的max-memery的时候,会自动触发淘汰机制,淘汰掉一些不重要的数据(可以自己设置策略方式)
超时剔除:当我们给redis设置了过期时间ttl之后,redis会将超时的数据进行删除,方便咱们继续使用缓存
主动更新:我们可以手动调用方法把缓存删掉,通常用于解决缓存和数据库不一致问题
主动更新的策略:
人工编码方式:缓存调用者在更新完数据库后再去更新缓存,也称之为双写方案(常用)
由系统本身完成,数据库与缓存的问题交由系统 ...
redis基础
Redis基础
简介:Redis是一个开源的key-value存储系统。
特点:
数据都在内存中,支持持久化,主要用作备份恢复
除了支持简单的key-value模式,还支持多种数据结构的存储,比如 list、set、hash、zset等。
一般是作为缓存数据库辅助持久化的数据库
安装
去官方下载安装包
上传安装包到/opt下
在linux下安装gcc环境:yum install -y gcc tcl
解压 tar -zxvf redis-6.2.1.tar.gz
进入redis目录执行make命令
执行make install 安装
安装目录在/usr/local/bin下
在安装包的目录下备份配置文件cp redis.conf redis.conf.bck
修改配置文件(最好不要直接修改原文件,复制到/etc下运行时用复制后的)vim redis.conf
修改如下配置:
12345678910111213141516# 允许访问的地址,默认是127.0.0.1,会导致只能在本地访问。修改为0.0.0.0则可以在任意IP访问,生产环境不要设置为0.0.0.0 ...