- 博客(30)
- 收藏
- 关注
原创 Netty从入门到超神-NIO 三大核心(selector,channel,buffer)(二)
上一篇文章认识了一下Java的三大IO,这一章节我们详细了解一下NIO的工作原理以及三大核心SelectorChannelBuffer并尝试来做一些小案例。//返回此缓冲区容量capacity//返回此缓冲区位置position//设置缓冲区的位置position//返回此缓冲区limit//设置此缓冲区的限制limit//在此缓冲区的位置设置标记//将此缓冲区的位置重置为以前标记的位置//把position设置为mark//清除此缓冲区, 即将各个标记恢复到初始状态。
2024-08-29 15:23:49
1140
原创 Netty从入门到超神-BIO、NIO、AIO的认识(一)
本篇文章主要介绍java的三大I/O模型:,因为Netty采用了NIO模型,要透彻Netty就得懂NIO原理,NIO又是在BIO基础进行演变,所以我们得对这些I/O都要有一些了解。I/O其实是InputOutput的缩写,意思是输入和输出,比如:把磁盘中的一个文件读入Java内存中,站在Java内存的角度来看就是输入即input, 可以使用Java提供的输入流如:来实现。
2024-08-29 14:56:37
775
原创 数据库优化-(四)MySQL锁和事务原理
本篇文章主要讲解两块内容:Mysql中的锁和ACID原理另外:当某个线程操作一个条被别的线程加了锁的数据时,等待时间过长就会出现:Lock wait timeout exceeded异常> 时间: 50.445s默认情况下:InnoDB的锁获取时间是50s,可以通过命令来查看超时时间事务:指作为单个逻辑工作单元(Service方法)执行的一系列操作(数据库操作),要么完全地执行,要么完全地不执行.事务可以看做是一组任务,通常对应了一个业务方法,这些任务要么全部成功,要么全部失败。
2024-08-19 10:25:40
797
原创 Mybatis进阶提升-(三)缓存的理解
对于Mybatis的缓存在上一章节《Mybatis进阶提升-(二)Mybatis执行流程》我们有提到一部分,这篇文章我们对将详细分析一下Mybatis的一级缓存和二级缓存。
2024-08-19 09:45:21
980
原创 Mybatis进阶提升-(二)Mybatis执行流程
上一篇文章我们分析了一下Mybatis的初始化流程,跟踪了一下Mybatis的配置解析过程,和SqlSession当我们执行SqlSession的select方法时,会从中拿到(包括SQL,参数映射,结果集映射等)。然后调用executor去执行query方法接着代码来到executor执行器,它会先创建CacheKey缓存的key,缓存的key是 statementId;分页;SQL ,参数值 一起组成的,也就是说只要是同一SQL,分页条件也相同,参数也相同的话,就可以命中缓存。如果有开启。
2024-08-01 10:07:51
1118
原创 数据库优化-(三)索引优化实战
主要负责用户登录数据库,进行用户的身份认证,包括校验账户密码,权限等操作,如果用户账户密码已通过,连接器会到权限表中查询该用户的所有权限,之后在这个连接里的权限逻辑判断都是会依赖此时读取到的权限数据,也就是说,后续只要这个连接不断开,即时管理员修改了该用户的权限,该用户也是不受影响的。如果能按照ID列作为条件查询性能是最优的,如果不能,那么需要找到where条件中`唯一性最高,且查询频率最高`的列,比如:手机号,用户名,这样的列让他去命中索引。所以我们编写SQL是需要尽可能按照索引列排序的。
2024-08-01 09:49:01
354
原创 Mybatis进阶提升-(一)Mybatis入门
Mybatis是Java 项目开发使用率非常高的一款持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。同时Mybatis也是面试过程中被高频问到的一门技术,今天我就对Mybatis的重要原理及其源码进行一个分析。
2024-07-31 18:23:59
1252
原创 数据库优化-(二)MySQL-Explain索引分析
通过explain命令我们可以知道以下信息:表的读取顺序,数据读取操作的类型,哪些索引可以使用,哪些索引实际使用了,表之间的引用,每张表有多少行被优化器查询等信息。就能拿到结果,一般是扫描某个二级索引,这种扫描不会从索引树根节点开始快速查找,而是直接对索引的叶子节点遍历和扫描,速度还是比较慢的,这种查询一般为使用覆盖索引,二级索引一般比较小,所以这种通常比ALL快一些。该列展示的是当前SQL可以选择的索引列,如果为null那么需要检查wehre后面的条件列是否有可选择的索引,案例。
2024-07-31 18:00:30
818
原创 数据库优化-(一)认识MySQL索引
索引(Index)是帮助DBMS(数据库)高效获取数据的数据结构,索引是为了加速对表中数据行的检索而创建的一种分散的存储结构。如果数据库没有索引就会走表进行全表扫描,一旦数据量上来,简直就是灾难。
2024-07-30 10:20:23
820
原创 zookeeper实现分布式锁-curator
在之前《Redis实现分布式锁》的文章中我已经介绍了使用Redis实现分布式锁原理,今天主要是介绍一下如何使用zookeeper实现分布式锁。ZooKeeper由雅虎研发,是Google Chubby的开源实现,目前托管给Apache,是一个经典的分布式数据一致性解决方案,致力于为分布式应用提供一个高性能、高可用,且具有严格顺序访问控制能力的分布式协调服务。分布式应用程序可以基于ZooKeeper实现数据发布与订阅、负载均衡、命名服务、分布式协调与通知、集群管理。
2024-07-30 09:40:02
786
原创 Redis从入门到超神-(十二)Redis监听Key的过期事件
试想一个业务场景,订单超过30分钟未支付需要做自动关单处理,修改订单状态库存回退等,你怎么实现?方案一:可以使用定时任务扫表,通过支付状态和下单时间来判断是否支付过期。但是这样的方案是非常消耗性能的,因为大部分的定时扫表都是无效的,而且这种定时任务方案对于时间控制并不精确。类似的业务场景还很多,比如物流自动收货确认,比如某电影上线预约功能的到时提醒等等,对于这些问题有没有比定时任务更优雅的处理方案呢?
2024-07-26 09:49:50
513
原创 Redis从入门到超神-(十一)Redis五大基本结构SortedSet底层原理
有序集合可以看做是在Set集合的的基础上为集合中的每个元素维护了一个顺序值: score,它允许集合中的元素可以按照score进行排序,所以它的经典实用场景如:考生按分数排名,某游戏玩家分数排行,网站首页某数据排行,最新评论按时间排序等等。Redis是一个内存数据库,它在保证读写速度的同时也需要考虑内存开销,那对于SortedSet有序集合而言它需要维护一个顺序值,而对于有序集合的底层实现可以选择:数组,链表,平衡树或者红黑树等结构,但是SortedSet没有选择这些结构。
2024-07-26 09:30:41
1109
原创 Redis从入门到超神-(十)Redis五大基本结构Hash底层原理
Hash也是Redis中非常常用的一种存储结构了,Redis的Hash底层用到了两种存储结构,ziplist压缩列表和hash 表,当存储的所有键值对的键和值的字符串长度都小于64字节,且元素个数少于512个,Redis会选择ziplist存储,这样会比较省内存,否则他会选择hashtable hash表去存,这里的hash表它底层结构和Java中的HashMap比较像,都是数组+链表,链表是为了解决hash冲突。
2024-07-25 09:49:31
1346
原创 Redis从入门到超神-(九)Redis五大基本结构Set底层原理
Redis中的set和java中的set集合有相似之处,它的元素不会按照插入的向后顺序而存储,且元素是不允许重复的。set内部使用到了intset(整数集合)和hashtable(哈希表)两种方式来存储元素,如果set存储的元素是整数,且当元素个数小于512个会选择intset存储,目的是减少内存空间,遇到两种情况会发生变化,就是当存储的元素个数达到512(通过set-max-intset-entries 配置)或者添加了非整数值时如:‘b’,set会选择hashtable作为存储结构。
2024-07-25 09:37:22
1193
原创 Redis从入门到超神-(八)Redis五大基本结构List底层原理
Redis中的List也是一种非常常用的存储结构,它和Java中的List结构类似,通常用来存储一个列表或者作为队列实现,在Redis 3.2之前,list采用了两种数据结构作为底层实现:压缩列表ziplist以及双向链表adlist,在3.2之后,使用quicklist替代,本篇文章将带你了解Redis底层的三种存储结构。本篇文章介绍了Redis中的list存储结构的底层实现,在Redis3.2之前使用到了 双向链表(adlist)和压缩列表(ziplist)。
2024-07-24 10:42:34
1319
原创 Redis从入门到超神-(七)Redis五大基本结构String底层原理
Redis已经成为解决高并发的必备利器,你可能已经把它玩的很熟了,但是对于它的底层,你又了解几分呢?本篇文章我们来聊聊Redis中那些你不知道的秘密之Redis五大基本结构的实现原理。你也许知道Redis常用的存储结构有,但还远远不够,本文章将带你一步一步走进Redis更深处的奥秘。简单动态字符串SDS//字符串长度,即buf已用字节的数量int len;// 记录 buf 数组中未使用字节的数量int free;// 字节数组,用于保存字符串char buf[];SDS内存分配图。
2024-07-24 09:41:57
932
原创 Redis从入门到超神-(六)SpringCache操作缓存
对于缓存声明,Spring的缓存提供了一组java注解:@Cacheable写入缓存清除缓存@CachePut更新缓存@Caching组合多个缓存操作:设置类级别上共享的一些常见缓存设置。
2024-07-23 13:47:16
871
原创 Redis从入门到超神-(五)Redis实现分布式锁原理
指定了解锁时间,Redisson就不会再自动续期,那么如果在线程A业务还没执行完就自动解锁了,这时候线程B获取到锁,继续执行业务,那么等线程A业务执行完释放锁就可能会把线程B的锁删除,当然这种情况Redisson会报异常,但是这种情况是没有把所有线程都锁住的,所以如果要手动设定过期时间需要让过期时间比业务逻辑执行的时间长才对。但是上面的代码依然有问题,就是判断锁的代码和删除锁的代码也不是原子性的,依然可能会导致锁的误删除问题,比如服务A在判断锁成功准备删除锁时,锁自动过期,别的服务B获取到了锁,然后。
2024-07-23 11:39:40
2362
1
原创 Redis从入门到超神-(四)Redis高级特性
单个 Redis 命令的执行是原子性的,但 Redis 没有在事务上增加任何维持原子性的机制,所以 Redis 事务的执行并不是原子性的。事务可以理解为一个打包的批量执行脚本,但批量指令并非原子化的操作,中间某条指令的失败不会导致前面已做指令的回滚,也不会造成后续的指令不做。
2024-07-22 10:54:11
1186
转载 Redis从入门到超神-(三)Redis在项目中的应用场景
Redis 是一个开源的高性能键值对数据库,它以其内存中数据存储、键过期策略、持久化、事务、丰富的数据类型支持以及原子操作等特性,在许多项目中扮演着关键角色。Redis 的使用场景非常广泛,可以根据项目的具体需求来选择合适的应用方式。针对Redis作为缓存层的使用场景,我将提供一个简单的Java Spring Boot应用案例,该应用使用Redis缓存来提高数据库查询的效率。假设我们有一个在线书店,用户可以查看书籍的详细信息。每次用户请求书籍详情时,后端需要查询数据库以获取书籍信息。
2024-07-19 14:32:53
945
原创 Redis从入门到超神-(二)认识Redis五大数据结构
ZRANGEBYSCOREkey heights 0 170 WITHSCORES LIMIT 0 10 #查询heights中0-170分之间的元素,低到高排序,0条 #开始查询,每页10条。hmset user:2 name zs age 18 #给"user:2"这个key设置name=zs键值对和age=18键值对。
2024-07-18 21:50:11
502
1
原创 Redis从入门到超神-(一)认识&安装Redis
NoSQL(NoSQL = Not Only SQL ),意即“不仅仅是SQL”,它泛指非关系型的数据库。随着互联网2003年之后web2.0网站的兴起,传统的关系数据库在应付web2.0网站,特别是超大规模和高并发的交友类型的web2.0纯动态网站已经显得力不从心,暴露了很多难以克服的问题,而非关系型的数据库则由于其本身的特点得到了非常迅速的发展。Redis 是一个高性能的、开源的、C语言写的Nosql(非关系型数据库),数据保存可以存储在内存中或者磁盘中。
2024-07-17 18:03:28
474
原创 SpringBoot入门到精通-(七)SpringBoot启动流程
在SpringBoot中提供了一个Banner接口专门用于以编程方式编写横幅的接口类。//打印横幅//模式OFF,CONSOLE,LOG我们来介绍一下这几个实现类: SpringBoot默认的横幅打印实现类//默认要打印的横幅@Override//打印横幅//拿到SpringBoot的版本号= null)?//打印版本号。
2024-07-17 17:30:42
942
原创 SpringBoot入门到精通-(六)自定义Starter封装通用组件-阿里云短信服务
在实际项目开发中,有大量的公用功能,SpringBoot提供了便利的方式支持我们对公共业务功能进行抽取封装,本篇文章是基于SpringBoot定义starter,以短信为例,定义通用的starter组件实现短信的发送。为了方便大家理解,我这里画了一个图以后有类似于发邮箱、发短信、文件上传等这样的通用功能,我们都可以定义成starter,使用更加方便。结束啦,如果文章对你有所帮助,请一定给个好评哦~
2024-07-16 18:06:01
945
原创 SpringBoot入门到精通-(五)SpringBoot自定义starter
我们来定义一个自动装配redis 的 starter,当某个项目导入该starter之后就可以根据默认配置自动去连接redis服务器。如何才能做到这样的效果呢?或许你应该想到了,仿照SpringBoot的自动配置流程,封装一个自己的jar包。那么我们需要做什么事情创建一个maven工厂,导入操作redis所需要的jar包,我这里会使用 jedis 来演示定义一个Properties类,用来加载yml配置的redis配置项新建自动装配类,使用@Configuration和@Bean来进行自动装配。
2024-07-12 18:11:45
641
原创 SpringBoot入门到精通-(四)SpringBoot自动配置原理
我们看到,在很多的jar包中都有这个文件,就拿 mybatis来说,为了整合SpringBoot在程序启动的时候就需要一些初始配置.那么在 mybatis-spring-boot-autoconfigure 这个包中就提供了 spring.factories 文件其中包含了mybatis的配置类,在SpringBoot启动时就会通过自动配置流程把这些配置类加载到Spring容器,配置类中的配置项也就生效了。DataSourceProperties是用来绑定yml中DataSource配置的,源码如下。
2024-07-11 17:34:56
847
1
原创 SpringBoot入门到精通-(三)基本使用
前言 上一篇文章我们讲的是SpringBoot的入门程序,万事开头难,本篇文章我们将学习SpringBoot的一些基础用法。banner就是在启动程序的时候,控制台出现的很个性的图案通过在classpath下添加一个 banner.txt 或设置 banner.location 来指定相应 的文件可以改变启动过程中打印的banner,比如:我在resources下创建了banner.txt增加以下内容`\ _ /`;
2024-07-10 17:18:42
804
2
原创 SpringBoot入门到精通(二)
经过前面的学习,我们已经掌握的Spring的注解式编程,有此基础后我们再学习SpringBoot就易如反掌,因为SpringBoot就是基于Spring的注解式编程进行开发。接下来我们就正式开始SpringBoot部分内容的学习,先来做个入门程序。SpringBoot入门程序我们来玩一个入门案例,使用SpringBoot编写一个简单的WEB程序,使用浏览器访问后台能够返回一个“Hello Spring Boot”即可。那么我么思考一下,如果我么使用SpringMVC来做这个案例需要做哪些事情?
2024-07-05 11:35:54
598
2
原创 SpringBoot入门到精通(一)
在SpringBoot问世以前的传统项目架构大多都会使用Spring作为业务层技术框架,通常采用XML作为Spring的配置文件,在XML配置文件中我们为了整合持久层框架,WEB层框架以及其他三方框架需要配置一大堆内容,大量的配置内容显得非常的繁杂,降低了程序员的工作效率。在Spring 3.0增加了注解编程(Java Config)来简化XML配置,并且Spring框架本身也大量使用到注解的方式进行配置,在2013年,Pivotal团队开始研发基于JavaConfig配置的SpringBoot框架,设
2024-07-04 17:40:21
378
1
原创 Java基于Springboot的民宿管理系统-计算机毕业设计
本系统力求结合实际找出一种切实可行的开发方案,经过反复研究和学习,借助java编程语言、springboot技术、mysql数据库和tomcat服务器来完成系统的所有功能,最后进行系统测试,来检测系统的权限和漏洞,从而将系统完善,达到符合标准。民宿短租系统能够通过互联网得到广泛的、全面的宣传,让尽可能多的民宿短租企业、民宿短租者了解和熟知民宿短租企业的产品以及产品特色,民宿短租企业服务等,不仅为旅客提供了服务,而且也推广了自己,让更多的旅客了解自己。获取源码:qq:2953706273。
2023-08-30 16:24:04
428
5
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人