- 博客(42)
- 收藏
- 关注
原创 SLF4J 异常,LoggerFactory is not a Logback LoggerContext but Logback is on the classpath.
再次启动项目,成功启动。
2023-07-12 12:05:49
445
原创 Redis6应用问题解决——缓存穿透,缓存击穿,缓存雪崩,分布式锁
分布式锁:当在分布式模型下,数据只有一份(或有限制),此时需要利用锁技术来控制某一时刻修改数据的进程数。这种锁即为分布式锁。为了保证一个方法或属性在高并发情况下的同一时间只能被同一个线程执行,在传统单体应用单机部署的情况下,可以使用并发处理相关的功能进行互斥控制。但是,随着业务发展的需要,原单体单机部署的系统被演化成分布式集群系统后,由于分布式系统多线程、多进程并且分布在不同机器上,这将使原单机部署情况下的并发控制锁策略失效,单纯的应用并不能提供分布式锁的能力。为了解决这个问题就。
2023-06-30 10:57:01
422
原创 java 泛型深刻理解,泛型实现原理——类型擦除
泛型即参数化类型,用于解决数据类型的安全性问题,通过泛型参数可以指定传入的对象类型。比如创建集合的时候指定了集合的泛型为String类型,就表示该集合中只能存放String类型对象。泛型不能用基本数据类型在给泛型指定具体类型后,可以传入该类型或者其子类类型。
2023-06-30 10:32:30
535
原创 行为型设计模式之模板模式,观察者模式。定义、应用场景、优缺点
通过类之间不同通信方式实现不同行为。包括责任链/命名/解释器/迭代器/中介者/备忘录/观察者/状态/策略/模板/访问者模式。
2023-06-26 23:49:40
169
原创 工厂模式、建造者模式、单例模式的应用场景?优缺点?使用案例?java/spring中有哪些应用?
部分内容参考javaguide。:在创建对象的同时隐藏创建逻辑,不使用 new 直接实例化对象,程序在判断需要创建哪些对象时更灵活。包括工厂/抽象工厂/单例/建造者/原型模式。:通过类和接口间的继承和引用实现创建复杂结构的对象。包括适配器/桥接模式/过滤器/组合/装饰器/外观/享元/代理模式。:通过类之间不同通信方式实现不同行为。包括责任链/命名/解释器/迭代器/中介者/备忘录/观察者/状态/策略/模板/访问者模式。
2023-06-20 00:02:16
376
原创 BIO、NIO、AIO一文搞懂,有具体案例
总的来说,NIO和AIO都是Java中的异步I/O模型,能够高效地处理多个并发的I/O操作。此外,NIO利用操作系统的非阻塞I/O机制,而AIO利用操作系统的异步I/O机制。非阻塞式I/O是一种I/O操作模型,无论操作是否完成,它都不会阻塞当前线程(立即返回),即当线程执行输入或输出操作时,如果暂时没有数据可读或可写,则线程不会阻塞,而是去执行其他任务。实现的,也就是应用操作之后会直接返回,不会堵塞在那里,当后台处理完成,操作系统会通知相应的线程进行后续的操作。来监听指定端口,等待客户端的连接请求。
2023-06-16 10:19:18
530
原创 10.Redis6集群
slot 意为插槽。一个 Redis 集群包含 16384 个哈希插槽(hash slot),数据库中的每个键都属于这 16384 个插槽的其中一个。集群使用公式 CRC16(key)%16384 来计算键 key 属于哪个槽, 其中CRC16(key)语句用于计算键 key的 CRC16 校验和。集群中的每个节点负责处理一部分插槽。6379端口的节点负责处理 0 号至 5460 号插槽。6380端口的节点负责处理 5461 号至 10922 号插槽。
2023-04-25 18:21:25
525
原创 8.Redis持久化
RDB:在指定的时间间隔内将内存中的数据集快照写入磁盘, 也就是行话讲的Snapshot快照,它恢复时是将快照文件直接读到内存里。Redis 会单独创建一个子进程(这个创建过程叫做fork,fork 支流,分叉)来进行持久化。在这个子进程里面,会先将数据写入到一个临时文件中,待这个过程结束,再用这个临时文件替换上次持久化好的文件。整个过程中,主进程是不进行任何 IO 操作的(save方式才是,bgsave会通过子进程来执行RDB),这就确保了极高的性能。
2023-04-25 18:11:40
283
原创 7.Redis6的事务操作
Redis事务是一个:事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。Redis事务的主要作用就是串联多个命令防止别的命令插队。
2023-04-25 18:06:08
63
原创 4.Redis新数据类型
在工作当中,我们经常会遇到与统计相关的功能需求,比如统计网站PV(PageView页面访问量),这种计数问题可以使用 Redis 的 incr、incrby 轻松实现。但像UV(UniqueVisitor,独立访客)、独立IP数、搜索记录数等需要去重和计数的问题如何解决?这种求集合中不重复元素个数的问题称为基数问题。什么是基数?比如数据集 {1, 3, 5, 7, 5, 7, 8}, 那么这个数据集的基数集为 {1, 3, 5 ,7, 8}, 基数(不重复元素)为5。
2023-04-25 17:58:24
66
原创 3.Redis配置文件介绍
前面将redis配置文件 redis.conf 复制到了 /etc/ 目录下了。下面就来分析一下 redis.conf 里面的内容。
2023-04-25 17:54:46
212
原创 2.Redis常用五大数据类型
String是Redis最基本的类型,你可以理解成与Memcached一模一样的类型,一个key对应一个value。String类型是二进制安全的。意味着Redis的string可以包含任何数据。比如jpg图片或者序列化的对象。String类型是Redis最基本的数据类型,一个Redis中字符串value最多可以是512M。list是单键多值。Redis 列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)。
2023-04-25 17:49:42
82
原创 1.Redis6概述和安装
解决方案:运行make distclean,在redis-6.2.1目录下再次执行make命令(只是编译好)特别注意:为什么在任何工作路径下都可以通过 redis-server 来启动redis?redis-benchmark:性能测试工具,可以在自己本子运行,看看自己本子性能如何。redis-check-aof:修复有问题的AOF文件,rdb和aof后面讲。1、备份redis.conf。redis-check-dump:修复有问题的dump.rdb文件。redis-sentinel:Redis集群使用。
2023-04-25 17:43:48
540
原创 Mysql原理-日志
那么,执行一条 update 语句,期间发生了什么?客户端先通过连接器建立连接,连接器自会判断用户身份;因为这是一条 update 语句,所以不需要经过查询缓存,但是表上有更新语句,是会把整个表的查询缓存清空的,所以说查询缓存很鸡肋,在 MySQL 8.0 就被移除这个功能了;解析器会通过词法分析识别出关键字 update,表名等等,构建出语法树,接着还会做语法分析,判断输入的语句是否符合 MySQL 语法;预处理器会判断表和字段是否存在;
2023-04-24 00:26:48
121
原创 Mysql原理-锁
两个事务即使生成的间隙锁的范围是一样的,也不会发生冲突,因为间隙锁目的是为了防止其他事务插入数据,因此间隙锁与间隙锁之间是相互兼容的。在执行插入语句时,如果插入的记录在其他事务持有间隙锁范围内,插入语句就会被阻塞,因为插入语句在碰到间隙锁时,会生成一个插入意向锁,然后插入意向锁和间隙锁之间是互斥的关系。互斥、占有且等待、不可强占用、循环等待,因此发生了死锁。
2023-04-24 00:21:52
160
原创 Mysql原理-事务
事务是在 MySQL 引擎层实现的,我们常见的 InnoDB 引擎是支持事务的,事务的四大特性是原子性、一致性、隔离性、持久性,我们这次主要讲的是隔离性。当多个事务并发执行的时候,会引发脏读、不可重复读、幻读这些问题,那为了避免这些问题,SQL 提出了四种隔离级别,分别是读未提交、读已提交、可重复读、串行化,从左往右隔离级别顺序递增,隔离级别越高,意味着性能越差,InnoDB 引擎的默认隔离级别是可重复读。
2023-04-24 00:16:56
70
原创 Mysql原理-索引
数据库中,索引的定义就是帮助存储引擎快速获取数据的一种数据结构,形象的说就是索引是数据的目录。所谓的存储引擎,说白了就是如何存储数据、如何为存储的数据建立索引和如何更新、查询数据等技术的实现方法。下图是 MySQL 的结构图,索引和数据就是位于存储引擎中:(132条消息) MySQL几种创建索引的方式_mysql怎么创建索引_不会秃头的小齐的博客-CSDN博客key 和 index 关键字都可以用来创建索引。
2023-04-24 00:13:39
119
原创 Mysql原理-基础
执行一条 SQL 查询语句,期间发生了什么?连接器:建立连接,管理连接、校验用户身份;查询缓存:查询语句如果命中查询缓存则直接返回,否则继续往下执行。MySQL 8.0 已删除该模块;解析 SQL,通过解析器对 SQL 查询语句进行词法分析、语法分析,然后构建语法树,方便后续模块读取表名、字段、语句类型;执行 SQL:执行 SQL 共有三个阶段:预处理阶段:检查表或字段是否存在;将select *中的符号扩展为表上的所有列。优化阶段:基于查询成本的考虑, 选择查询成本最小的执行计划;
2023-04-24 00:10:54
105
原创 MySQL数据库6
Annual Salary” 也可以作为别名,加不加AS都可以。第(2)题注意判断null和非null要用 is null 和 is not null,不能用等于符号=,也不能用不等号<> 或者!正确答案:注意第 (1) 题的 c 选项。可以给其他用户授权,也可以收回其权限。
2023-04-22 23:49:45
96
原创 MySQL数据库5
注意:Memory 数据是存储在内存中的,因此不需要 IO 读写,所以访问非常快。细节:1.视图是一个虚拟表,其内容由查询定义。同真实的表一样,视图包含列,其数据来自对应的真实表(基表)
2023-04-22 23:46:21
97
原创 MySQL数据库4
- 应用案例:请统计各个部门(group by)的平均工资(avg),并且平均工资是大于1000的(having), -- 并且按照平均工资从高到低排序(order by),取出前两行记录(limit) SELECT deptno , AVG(sal) AS avg_sal FROM emp GROUP BY deptno HAVING avg_sal > 1000 ORDER BY avg_sal DESC LIMIT 0 , 2;#注意:这个语法顺序一定不能变。
2023-04-22 23:24:46
74
原创 MySQL数据库3
注意:LIKE 的用法,比如某个 student 表有一个 name 字段(列),要找一个姓丁的同学的所有信息。增删改查(CRUD):C——Create,R——Read, U——update, D——Delete。这一章主要讲的是单表查询,多表查询放到11章,也就是下一个25 MySQL数据库.md文件。:对分组后的结果进行过滤。通常跟 group by 结合使用。:返回满足 where 条件的行的和。:返回满足 where 条件的一列的最大/最小值。:返回满足 where 条件的一列的平均值。
2023-04-22 23:19:25
77
原创 MySQL数据库2
如果要在数据库 hsp_db02 和 hsp_db03 中创建一个表,如果没有指定表的字符集和字符集校对规则,那么表的字符集和校对规则与对应的数据库保持一致,而不是按照默认规则指定。比如 hsp_db03 中创建一个没有指定字符集和校对规则的表,则表的字符集为uft8,校对规则为 utf8_bin,hsp_db02 则分别为 utf8 和 utf8_general_ci。对上面最后一条语句的解释:hsp_db02 数据库的字符集校对规则为默认的 utf8_general_ci,它是不区分大小写的。
2023-04-22 23:07:39
52
原创 MySQL数据库1
1.下载zip版本解压后可以直接使用,下载exe版本需要再进行手动安装2.添加环境变量的作用:在任意目录下都可以去操作mysql3.在安装目录下创建 my.ini 文件,需要自己创建:后面的不写了,自己查看老韩的MySQL安装文档。
2023-04-22 22:58:36
115
原创 23 反射
对上面第7点的解释:类加载完了之后,在 方法区 还会得到一个 字节码二进制文件,即前面面向对象章节讲的在方法区中加载类信息。即 类加载 完了之后,除了会在堆生成一个Class类对象(一种数据结构,可以进行操作),还会在方法区生成一个类的字节码二进制数据(又叫元数据,二进制数据操作是很麻烦的)。这两者之间的关系是引用关系,/*** 对Class类特点的梳理,对上面1 2 3 4 条的解释。
2023-04-22 22:44:30
54
原创 21网络编程
socket . getOutputStream() socket . getIputStream() //比如主机1(客户端,红)要跟主机2(服务器、绿)通信,首先客户端发起连接,服务器端接收链接就会建立数据通道(黄色线),然后主机1和2都会有一个套接字socket。如果主机1要给主机2发送数据,那么主机1就会调用socket.getOutputStream() 向数据通道写数据。主机2要接收数据,那么主机2就会调用socket.getIputStream() 从数据通道中读取数据。
2023-04-22 22:34:30
41
原创 19IO流
注意:节点流只能针对某一种特定的数据进行操作,比如FileReader/FileWriter只能对文件进行操作(按字符),ByteArrayInputStream / ByteArrayOutputStream只能对数组进行操作(按字节操作)等等,这样就造成了节点流是固定的,这是跟数据源直接相关的,更加底层。灵活性不足。
2023-04-22 22:20:59
55
原创 17Java多线程
/模拟死锁 public class DeadLock_ {//模拟死锁现象 DeadLockDemo A = new DeadLockDemo(true);A . setName("A线程");B . setName("B线程");} } //线程 class DeadLockDemo extends Thread {//保证多线程,共享一个对象,这里使用static static Object o2 = new Object();
2023-04-22 21:37:59
141
原创 14Java集合
1. 集合的理解与好处前面我们保存多个数据使用的是数组,数组的缺点有:长度开始时必须指定,而且一旦指定,不能更改保存的必须为同一类型的元素使用数组进行增加/删除元素的代码思想如下:重新创建一个新的数组,容量是原数组的 length+1,把前面的元素拷贝进去,再把新元素拷贝到最后的位置,最后把新数组的引用返回给原来的数组(新数组此时没有被引用,就会被回收)。所以引入集合:可以动态地保存任意多个 对象,使用比较方便提供了一系列方便的操作对象的方法:add,remove,set,
2023-04-20 16:22:55
119
原创 13常用类
java.lang.StringBuffer 代表可变的字符序列,可以对字符串内容进行增删。很多方法与 String 相同,但 StringBuffer 是可变长度的。StringBuffer 是一个容器。
2023-04-20 16:10:11
65
原创 12异常(Exception)
基本概念:Java语言中,将程序执行中发生的不正常情况称为 异常。(开发过程中的语法错误和逻辑错误不是异常)执行过程中所发生的异常事件可分为两大类:①、Error(错误):Java虚拟机无法解决的严重问题。如:JVM 系统内部错误、资源耗尽等严重情况。比如:StackOverflowError [栈溢出] 和 OOM (out of memory),Error是严重错误,程序会崩溃。②、Exception:其它因编程错误或偶然的外在因素导致的一般性问题,可以使用针对性的代码进行处理。运行时异常。
2023-04-20 16:04:10
81
原创 10面向对象编程(高级)
类方法也叫静态方法。定义类方法的语句:访问修饰符static数据返回类型 方法名(){}static访问修饰符 数据返回类型 方法名(){}类方法的调用:类名.类方法名 or 对象名.类方法名注意:类方法的调用也要满足访问权限当方法中不涉及到任何和对象相关的成员,则可以将方法设计成静态方法,提高开发效率。比如:将一个冒泡排序方法设置成静态方法,以后需要排序时直接调用 类名.冒泡排序方法名,就不用了重新实例化一个对象代码化块又称为初始化块。
2023-04-20 15:58:51
245
原创 7面向对象编程(中级)
包的三大作用区分相同名字的类当类很多时,可以很好地管理类控制访问范围包基本语法:说明:① package:关键字表示打包;② com.hspedu:表示包名包的本质实际上就是创建不同的文件夹/目录来保存类文件,示意图如下:文件夹 aaa-bbb 就是一个包,它下面有两个类。文件夹 ccc-ddd 也是一个包,下面有三个类。封装就是把抽象出的数据(属性)和对数据的操作(方法)封装在一起,数据被保护在内部,程序的其它部分只有通过被授权的操作(方法),才能对数据进行操作。
2023-04-20 15:50:46
79
原创 6面向对象编程(基础)
属性/成员变量:成员变量 = 属性 ,如 cat 类中定义的 name、age、color 叫做类 Cat 的属性 or 成员变量。属性是类的一个组成部分,一般是基本数据类型,也可以是引用类型(对象,数组)。属性的定义语法同变量:访问修饰符 属性类型 属性名;访问修饰符用于控制属性的访问范围,有四种:public,protected,默认(不写就是默认),private。属性如果不赋值则会有默认值,默认值规则与数组一样。
2023-04-20 15:37:51
108
原创 5数组、排序和查找
第一种动态分配方式//或者 int a[] = new int[3]第二种动态分配方式int [ ] a;// 先声明一个数组 a ,再给它分配内存空间,可以存储3个 int 类型的数据,此时没有指定值,每一个值默认为 0。第三种静态初始化:这种方式在数组的大小不大,且知道每一个具体的值时使用。//还可以写为:int[] a = new[]{2,3,4,5}数组被创建后,如果没有赋值,则有默认赋值:int、short、byte 和 long 默认赋值为0,float、double 默认赋值为0.0。
2023-04-20 15:31:35
105
1
原创 4程序控制结构
程序控制分为:顺序控制,分支控制(if else,switch),循环控制(for,while,do while),break,continue,return。
2023-04-20 15:16:38
101
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人