- 博客(67)
- 收藏
- 关注
原创 Spring:DI的详解☞setter注入、构造器注入
向一个类中传递数据的方式有几种?普通方法(set方法)构造方法依赖注入描述了在容器中建立bean与bean之间的依赖关系的过程,如果bean运行需要的是数字或字符串呢?引用类型简单类型(基本数据类型与String)Spring就是基于上面这些知识点,为我们提供了两种注入方式,分别是:setter注入简单类型==引用类型==构造器注入简单类型引用类型。
2024-08-18 23:59:22
704
原创 Spring:IOC的详解☞Bean的实例化、Bean的生命周期
修改BookServiceImpl类,添加两个接口InitializingBean, DisposableBean并实现接口中的两个方法afterPropertiesSet和destroy。需要注意的一点是,构造方法在类中默认会提供,但是如果重写了构造方法,默认的就会消失,在使用的过程中需要注意,如果需要重写构造方法,最好把默认的构造方法也重写下。现在我们面临的问题是如何在bean的创建之后和销毁之前把我们需要添加的内容添加进去。——单例模式下多次从容器中获取bean的地址是是一样的。
2024-08-17 23:26:03
781
原创 Spring:IOC和DI的入门案例
需求:基于IOC入门案例,在BookServiceImpl类中删除new对象的方式,使用Spring的DI完成Dao层的注入。的作用是让Spring的IOC容器在获取到名称后,将首字母大写,前面加set找对应的。在BookServiceImpl类中,删除业务层中使用new的方式创建的dao对象。使用Spring提供的接口完成IOC容器的创建,创建App类,编写main方法。对象的new操作,它们之间的耦合度还是比较高,这块该如何解决,就需要用到下面的。5.使用Spring提供的接口完成IOC容器的创建。
2024-08-17 21:54:00
1221
原创 Redis数据结构:String、List、Set的详解
String是Redis中最常见的数据存储类型:其基本编码方式是RAW,基于简单动态字符串(SDS)实现,存储上限为512mb。如果存储的SDS长度小于44字节,则会采用EMBSTR编码,此时object head与SDS是一段连续空间。申请内存时只需要调用一次内存分配函数,效率更高。
2024-08-16 23:59:24
903
原创 Redis数据结构:QuickList、
问题1:ZipList虽然节省内存,但申请内存必须是连续空间,如果内存占用较多,申请内存效率很低。怎么办?答:为了缓解这个问题,我们必须限制ZipList的长度和entry大小。问题2:但是我们要存储大量数据,超出了ZipList最佳的上限该怎么办?答:我们可以创建多个ZipList来分片存储数据。问题3:数据拆分后比较分散,不方便管理和查找,这多个ZipList如何建立联系?
2024-08-16 23:56:49
998
原创 Redis数据结构ZipList详解、ZipList的连锁更新问题
压缩列表的可以看做一种连续内存空间的"双向链表"列表的节点之间不是通过指针连接,而是记录上一节点和本节点长度来寻址,内存占用较低如果列表数据过多,导致链表过长,可能影响查询性能增或删较大数据时有可能发生连续更新问题。
2024-08-15 22:26:33
553
原创 Redis数据结构:动态字符串SDS、Intset、Dict详解
Dict的结构:类似java的HashTable,底层是数组加链表来解决哈希冲突Dict包含两个哈希表,ht[0]平常用,ht[1]用来rehashDict的伸缩:当LoadFactor大于5或者LoadFactor大于1并且没有子进程任务时,Dict扩容当LoadFactor小于0.1时,Dict收缩扩容大小为第一个大于等于used + 1的2^n收缩大小为第一个大于等于used 的2^nDict采用渐进式rehash,每次访问Dict时执行一次rehash。
2024-08-15 21:52:23
925
原创 踩坑【已解决】:Redis配置主从复制踩到的坑,主机不显示从机的连接信息,但是从机显示主机信息
在master的配置文件中我们配置了密码的信息,但是我们在从配置文件中没有添加相应的连接配置。
2024-08-13 16:32:25
139
原创 Redis哨兵机制详解
Sentinel的三个作用是什么?监控故障转移通知Sentinel如何判断一个redis实例是否健康?每隔一秒发送一次ping命令,如果超过一定时间没有响应则认为是主观下线如果大多数的sentinel都认为实例主观下线,则判断该服务客观下线。故障转移的步骤有哪些?首先选定一个slave作为新的master,执行slaveof no one然后然所有的二节点都执行slaveof 新master修改故障节点配置,添加slaveof 新master。
2024-08-13 14:36:16
649
原创 Redis主从集群的搭建教程
我们搭建的主从集群结构如图:共包含三个节点,一个主节点,两个从节点。准备实例和配置要在同一台虚拟机开启3个实例,必须准备三份不同的配置文件和目录,配置文件所在目录也就是工作目录。1)创建目录我们创建三个文件夹,名字分别叫7001、7002、7003:这三个文件夹需要在redis文件同级目录下#创建目录mkdir 7001 7002 7003
2024-08-13 13:40:17
484
原创 Redis主从数据同步原理的详解、以及优化方案
简述全量同步和增量同步区别?全量同步:master将完整的内存数据生成RDB,发送RDB到slave。后续命令则记录在repl_baklog逐个发送给slave增量同步:slave提交自己的offest到master,master获取repl_baklog中从offest之后的命令给slave什么时候执行全量同步?slave节点第一次连接master节点时slave节点断开时间太久,repl_baklog中的offset已经被覆盖时什么时候执行增量同步?
2024-08-12 23:03:10
1219
原创 Redis持久化——AOF详解、RDB和AOF的区别
appendOnlyFile(追加文件)。Redis处理的每一个写命令都会记录在AOF文件,可以看作是命令日志文件。AOF默认是关闭的,需要修改redis.conf配置文件来开启AOF:# 是否开启AOF功能,默认是no appendonly yes # AOF文件的名称 appendfilename "appendonly.aof"AOF的命令记录的频率也可以通过redis.conf文件来配:# 表示每执行一次写命令,立即记录到AOF文件 appendfsync always # 写命令执行完
2024-08-12 14:18:42
260
原创 Redis持久化——RDB持久化
Redis有两种持久化方案:RDB持久化AOF持久化。RDB全称Redis Database Backup file(Redis数据备份文件),也被叫做Redis数据快照。简单来说就是把内存中的所有数据都记录到磁盘中。当Redis实例故障重启后,从磁盘读取快照文件,恢复数据。快照文件称为RDB文件,默认是保存在当前运行目录。
2024-08-11 22:22:18
378
原创 Redis的客户端SpringDataRedis的详解+案例
Bean// 创建RedisTemplate对象// 设置连接工厂// 创建JSON序列化工具// 设置Key的序列化// 设置Value的序列化// 返回这里采用了JSON序列化来代替默认的JDK序列化方式。最终结果如图:在这里会将我们自己创建的实体类的信息加入到redis中整体可读性有了很大提升,并且能将Java对象自动的序列化为JSON字符串,并且查询时能自动把JSON反序列化为Java对象。
2024-08-11 22:17:06
689
原创 Reids中List类型、Set类型、SortedSet类型的常用指令
Redis中的List类型与Java中的LinkedList类似,可以看做是一个双向链表结构。既可以支持正向检索和也可以支持反向检索。
2024-08-10 21:38:22
1061
原创 Redis命令-key的层级结构、Hash类型常用指令
一旦我们向redis采用这样的方式存储,那么在可视化界面中,redis会以层级结构来进行存储,形成类似于这样的结构,更加方便Redis获取数据。例如,需要存储用户.商品信息到redis,有一个用户id是1,有一个商品id恰好也是1,此时如果使用id作为key,那就会冲突了,该怎么办?Hash类型,也叫散列,其value是一个无序字典,类似于Java中的HashMap结构。Redis没有类似MySQL中的Table的概念,我们该如何区分不同类型的key呢?:哈希结构也是我们以后实际开发中常用的命令哟。
2024-08-10 21:34:41
787
原创 Redis常用的命令、Redis-String类型常用的命令
EXPIRE:给一个key设置有效期,有效期到期时该key会被自动删除。TTL:查看key的剩余时间,查看一个未设置过期时间的key为-1.String类型,也就是字符串类型,是Redis中最简单的存储类型。贴心小提示:以上命令除了INCRBYFLOAT 都是常用命令。KEYS:查看复合模版的所有key,不建议在生产环境中使用。EXISTS:判断key是否存在。DEL:删除一个指定的key。
2024-08-10 21:28:44
318
原创 redis启动的三种方式
默认启动属于前台启动,会阻塞整个会话窗口,窗口关闭或者按下CTRL + C则Redis停止。不推荐使用。//查看云服务器是否安装过redisredis-server -v//检查安装目录which redis-server//查看redis进程ps -ef | grep redis//运行redis 前台启动(默认)redis-server
2024-08-08 23:45:06
241
原创 Mysql聚簇索引与非聚簇索引B+树实现区别详解
聚簇索引,只能在所搜条件是主键值是才能发挥作用,因为B+树中的数据都是按照主键进行排序的,如果我们想以别的列作为搜索条件,那么就需要创建非聚簇索引。一个表中可以有多个非聚簇索引,但是聚簇索引只能有一个。
2024-08-07 22:05:49
506
原创 Mysql执行计划(下)
而NULL都需要1个字节的额外空间,所以索引字段最好不要为NULL,因为NULL让统计更加复杂并且需要额外的存储空间。复合索引有最左前缀的特性,如果复合索引能全部使用上,则是复合索引字段的索引长度之和,这也可以用来判定复合索引是否部分使用,还是全部使用。变长字段需要额外的2个字节(VARCHAR值保存时只保存需要的字符数,另加一个字节来记录长度(如果列声明的长度超过255,则使用两个字节),所以VARCAHR索引长度计算时候要加2),固定长度字段不需要额外的字节。
2024-08-07 22:01:13
635
原创 Mysql执行计划(上)
执行计划是什么:使用EXPLAIN关键字可以模拟优化器执行SQL查询语句,从而知道MySQL是如何处理你的SQL语句的。作用:分析你的查询语句或是表结构的性能瓶颈语法:Explain + SQL语句执行计划输出内容介绍:表的读取顺序、数据读取操作的操作类型、哪些索引可以使用、哪些索引被实际使用、表之间的引用、每张表有多少行被优化器查询。
2024-08-06 20:23:14
738
原创 Mysql慢查询详解
启动停止技术慢查询日志指定慢查询日志得存储路径及文件(默认和数据文件放一起指定记录慢查询日志SQL执行时间得伐值(单位:秒,默认10秒)是否记录未使用索引的SQLlog_output日志存放的地方【TABLE】【FILE】【FILE,TABLE】表、文件启动慢查询-- 开启慢查询日志-- 设置慢查询时间,这样SQL语句超过1S的都会记录到慢查询日志中。
2024-08-06 09:17:19
301
原创 Mysql中事务的读一致性问题,以及如何用MVCC解决
原子性事务具有回滚的能力,InnoDB引擎使用undo log日志表来进行回滚操作。持久性InnoDB引擎使用redo log日志表来保证数据的持久性。Read Uncommitted (读未提交),未解决任何并发问题,事务未提交的数据对其他事务也是可见的,会出现脏读。Read Committed (已提交读),解决脏读问题,一个事务开始之后,只能看到已提交的事务所做的修改,会出现不可重复读。Repeatable Read (可重复读),解决不可重复读问题,在同
2024-08-05 21:01:30
1302
原创 Mysql事务四大特性的介绍
数据库的事务(Transaction)是一种机制、一个操作序列,包含了一组数据库操作命令。事务把所有的命令作为一个整体一起向系统提交或撤销操作请求,即这一组数据库命令要么都执行,要么都不执行,因此事务是一个不可分割的工作逻辑单元。在数据库系统上执行并发操作时,事务是作为最小的控制单元来使用的,特别适用于多用户同时操作的数据库系统。例如,航空公司的订票系统、银行、保险公司以及证券交易系统等应用场景:银行的转账操作,A账号扣钱,B账号加钱,需要保证A和B的操作同时成功或者同时失败。
2024-08-05 20:41:32
1442
原创 Mysql的聚集索引、散列度、联合索引以及回表和覆盖索引
在什么字段上创建索引?where、join、 order by 去建立索引。索引个数不要过度。散列度低的字段,不要建立索引。随机无序或频繁更新的值,不适合作为主键,推荐使用递增的ID作为主键索引,而不推荐使用UUID或者身份证号等作为索引。递增的ID作为主键索引,数据会按着ID的顺序追加写入,如果使用随机的UUID作为为主键,那么写入数据的顺序是不固定的,可能第一条数据写入到第一个数据中,第二条数据写入到其他的数据页中,会出现数据页分裂和合并的效果。创建联合索引时避免冗余索引。
2024-08-04 19:29:55
489
原创 Mysql的索引
从mysql数据库中查找书籍,就类似于从图书馆找书,如果书比较少,那么查找的速度会比较快,如果书比较多的时候,那么查找的速度就会非常的慢。这个时候图书的分类管理就显得非常重要了,图书分类管理就类似于索引(或者理解成给所有的图书设定目录)。索引的本质就是一种数据结构。mysql中有这样一张表,emp表,表中的数据有1000000条数据。假如在没有索引的情况下,当你执行如下的sql语句,那么执行的速度相对来说比较慢。
2024-08-04 19:24:59
1104
原创 Mysql的架构 ☞ update语句的执行流程
update语句的整体执行流程和select语句是一样的。 mysql想完成数据的修改,会先从存储引擎层读取数据,把数据读取到服务层进行数据的修改,再通过存储引擎层把数据更新到数据库中。 mysql每次读取数据都会读取16384个字节的数据,默认是16KB的数据。一页的数据。 在innodb引擎中设计了 buffer pool 缓冲区。Mysql从磁盘中通过IO读取数据到buffer pool中,引擎从bffer pool中获取数据,然后修改,再把数据写入到buff
2024-08-01 15:48:16
778
原创 MySQL的架构 ☞ select语句的执行流程
执行sql语句的流程总结。当mysql服务器启动(mysql服务器就是一个进程),等待客户端连接,每一个客户的连接请求,服务器都会创建一个新的线程处理(如果是线程池的话,则是分配一个空的线程),每个线程都是独立的,拥有各自的内存处理空间。Mysql数据库中支持缓存,在5.7的版本中默认是关闭状态(在8的版本中已经去掉了mysql的缓存)。可以通过查看缓存相关的命令查看。在mysql的配置文件my.ini或my.cnf中也可以找到缓存相关的配置,默认都是关闭的。
2024-08-01 14:36:37
1335
原创 踩坑【已解决】:Find why ‘userMapper‘ could be null
在使用Test为Mybatis-Plus中的接口做测试的时候,执行报错Find why 'userMapper' could be null。忘记写测试类注解了 蠢哭了。
2024-07-29 15:37:19
232
原创 Mybatis-Plus-常用的注解:@TableName、@TableId、@TableField、@TableLogic
经过之前的测试,在使用MyBatis-Plus实现基本的CRUD时,我们并没有指定要操作的表,只是在Mapper接口继承BaseMapper时,设置了泛型User,而操作的表为user表由此得出结论,MyBatis-Plus在确定操作的表时,由BaseMapper的泛型决定,即实体类型决定,且默认操作的表名和实体类型的类名一致。
2024-07-29 11:45:34
1082
原创 Mybatis-Plus-基本的CRUD->BaseMapper
观察BaseMapper中的方法,大多方法中都有Wrapper类型的形参,这是条件构造器,可针对于SQL语句设置不同的条件,若没有条件,则可以为该形参赋值null,即查询(删除/修改)所有数据。Mybatis-Plus中有一个接口IService和其实现类ServiceImpl,封装了常见的业务曾逻辑。这是因为MyBatis-Plus在实现插入数据时,会默认基于雪花算法的策略生成id。最终执行的结果,所获取的id为1475754982694199298。
2024-07-29 10:26:40
406
原创 Mybatis(四)特殊SQL的查询:模糊查询、批量删除、动态设置表明、添加功能获取自增的主键
不适用#{ },’%?%‘ 问号是属于字符串的一部分 不会被解析成占位符,会被当作是我们字符串的一部分来解析,所以我们执行的语句中找不到占位符,但是我们却为占位符进行了赋值,所以说就会报错。#{ } 还是不使适用,会产生 ' ' ,动态设置表名的时候不可以带 ' '#{ } 在sql语句中被解析之后本身就会加上一个单引号 ' '我们使用${ } ,将#{}替换成${ }不可以使用#{} 需要使用${ }使用字符串拼接的方法。字符串 日期 字段名。
2024-07-26 00:24:43
829
原创 Mybatis(三) 查询不同数据封装的方式
添加@MapKey注解,此时就可以将每条数据转换的map几个作为值,以某个字段的值作为键(该键不能和其他条数据的字段重复),放在同一个map集合中。方式二:每条数据用map接收,将所有的map封装到一个map中去。方式一:每条数据用map接收,将map封装到一个list中。方式三:每条数据用实体类接收,将实体类封装到list中。4、查询一条数据为map集合。5、查询多条数据为map集合。2、查询一个list集合。1、查询一个实体类对象。
2024-07-25 23:44:23
433
原创 Mybatis(二)获取参数值的两种方式:${ }和#{ }
若mapper接口中的方法需要的参数为多个时,此时可以手动创建map集合,将这些数据放在map中 只需要通过${}和#{}访问map集合的键就可以获取相对应的值,注意${}需要手动加单引号。若mapper接口中的方法参数为实体类对象时 此时可以使用${}和#{},通过访问实体类对象中的属性名获取属性值,注意${}需要手动加单引号。若mapper接口中的方法参数为单个的字面量类型,此时可以使用${}和#{}以任意的名称获取参数的值,注意${}需要手动加单引号。
2024-07-22 18:26:49
374
原创 Mybaits(一) 入门案例
1、Mybatis 是支持定制化SQL,存储过程以及高级映射的优秀的持久层框架。2、Mybats 避免了几乎所有的JDBC代码和手动设置参数以及获取结果集。3、MYbatis可以使用简单的XML或注解用于配置和原始映射(两种方式写在xml文件中或者使用注解的方式配置),将接口和javaPOJO(也就是普通的java对象)映射成数据库中的记录。4、Mybatis 是一个半自动的ORM框架(Object Relation Mapping)
2024-07-21 19:50:57
766
原创 踩坑【已解决】:The content of element type “configuration“ must match “(properties?,settings?,typeAlias
报错信息:The content of element type "configuration" must match "(properties?,settings?,typeAliases?,typeHandlers?,objectFactory?,objectWrapperFactory?,reflectorFactory?,plugins?,environments?,databaseIdProvider?,mappers?)".
2024-07-21 18:46:30
196
原创 Pinia的简介和基本使用
Pinia是Vue专属的最新状态管理库,是Vuex状态管理工具的替代品将Pinia添加到Vue项目:1、使用creat-vue 创建空的新项目2、将pinia添加到新的项目中Pinia用来做什么:状态管理工具是Vuex的替代品Pinia中不需要使用mutation了,使用action既支持同步也支持异步Pinia实现getter:使用computed进行模拟就可以Pinia产生的Store如何解构赋值数据保持响应式:使用storeToRefs。
2024-07-18 12:08:26
353
原创 vue3中的watch函数
作用:监听数一个或者多个数据的变化,数据变化时执行回调函数,两个额外的参数:1、immediate(立即执行)2、deep(深度监听)deep:通过watch监听的ref对象默认是浅层监听的,直接修改嵌套的对象属性不会触发回调执行,需要开启deep选项。4、不开启deep,想在某个层次比较深的属性变化时执行回调:可以把第一个参数写成函数的写法,这回要监听具体的属性。在不开启deep的前提下,监听age的变化,只有age发生变化的时候才会发生回调。3、不开启deep,直接修改嵌套属性不会触发回调。
2024-07-17 21:44:00
474
原创 vue3 项目的创建、组合式API、rective和ref、watch函数
setup的执行时机:在beforeCreate钩子执行之前,自动执行setup写代码的特点:定义数据+函数 然后以对象的方式retrurn语法糖:更简单的使用组合式APIsetup中的this不再指向组件实例,而是指向undefinereactive和ref :都用来生成响应式数据reactive vs ref:reactive不能处理简单的数据类型,ref在script中必须通过.value访问在实际的开发过程中我们通常使用ref函数。
2024-07-17 21:25:17
788
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人