- 博客(47)
- 收藏
- 关注
原创 sql优化(1)
当处理大型数据集时,不加优化地使用LIMIT可能会导致数据库执行大量不必要的操作,优化LIMIT可以减少数据读取量和计算量,从而加快查询速度,节省服务器资源,并且能够更快地将结果反馈给用户,提升用户体验,尤其是在网页应用中的分页功能等场景下,高效的LIMIT优化可以使页面加载更加迅速。数据库可以通过索引快速定位到最近的销售日期对应的记录,而不需要扫描整个表,因为索引本身是按照一定顺序存储的,在这种情况下,按照销售日期倒序排列的索引可以帮助快速找到最前面的10条记录。
2025-01-02 16:39:49
860
13
原创 苍穹外卖day07缓存部分分析
利用 Redis 的 keys 命令获取所有以 "dish:" 开头的键值,也就是获取所有与菜品相关的缓存键,然后使用 redisTemplate.delete(set),将这些键对应的缓存数据全部删除。但是使用keys命令在生产环境中如果数据量很大可能会影响性能,因为它需要遍历所有键,可以考虑采用更精准的缓存失效策略,比如根据具体变更的菜品 id 来有针对性地删除相关缓存,而不是批量删除所有菜品缓存,也可以使用Spring Cache注解。
2024-12-26 18:10:42
1301
9
原创 苍穹外卖项目Day02代码结构深度解析
通过对苍穹外卖项目 Day02 代码结构的深入剖析,我们清晰地看到了一个结构严谨、层次分明且高效协作的代码体系,分层架构的设计使得各层职责明确。随着项目的不断发展和业务需求的日益复杂,代码结构也需要持续优化。例如,可以进一步优化数据库查询语句,引入更高效的缓存机制以提升数据访问速度,对代码中的重复逻辑进行更深入的重构以提高代码的复用性和可维护性。同时,加强单元测试和集成测试的覆盖范围,确保代码的稳定性和正确性,为项目的长期发展奠定更加坚实的基础。
2024-12-23 10:00:07
1990
15
原创 java数据结构之链表(下)
这里 prev 用于指向该节点的前一个节点,方便双向操作。构建双链表类并实现相关操作,例如创建、插入、删除等操作与单链表有相似之处,但由于双向指针的存在,实现细节上有所不同。在添加节点时,不仅要更新 next指针,还要更新新节点的 prev指针以及当前尾节点的 next 指针,确保双向连接正确。先找到指定位置的节点,然后通过调整指针将新节点插入到相应位置。找到要删除的指定位置节点后,根据该节点是否为尾节点进行不同的指针处理,以正确断开与前后节点的连接。
2024-12-22 14:49:33
592
4
原创 java数据结构之链表(上)
先判断要删除的位置是否为 0,若是则调用deleteAtHead方法,否则,通过循环找到指定位置的前一个节点,然后跳过要删除的节点,将其前后节点连接起来,实现删除功能。该方法先创建一个新节点,然后让新节点的 next 指针指向当前的头节点,最后将新节点设置为头节点,实现了在表头插入的功能,时间复杂度为O(1),非常高效。否则,通过循环遍历找到指定位置的前一个节点,然后将新节点插入到相应位置。val表示节点存储的数据值,next就是指向后续节点的引用,初始化为null表示当前节点暂时没有后续连接的节点。
2024-12-20 07:40:18
597
3
原创 java数据结构之栈
栈作为一种重要的数据结构,以其简单而有效的后进先出原则,在 Java 编程以及计算机科学的各个领域都有着广泛的应用,通过理解栈的基本概念、操作方法、Java 中的实现方式以及应用场景,我们能够更好地利用栈来解决各种实际问题,提高程序的性能和可读性。
2024-12-19 19:12:40
540
8
原创 Java线性搜索算法详解
线性搜索的算法逻辑非常直观,几乎不需要任何复杂的前置知识就能理解其工作原理。无论是对于初学者学习算法基础,还是在代码的可读性方面,简单的逐元素比较方式使得代码容易被理解和维护。其对数据结构的要求很低,只要是线性的数据结构,无论其是否有序,都可以应用线性搜索算法进行元素查找。不像一些高级搜索算法(如二分搜索要求数据必须有序),线性搜索不存在这样的限制条件。从代码实现的角度来看,线性搜索的代码通常都比较简洁,不需要复杂的算法设计和大量的额外代码逻辑来支持。
2024-12-17 11:01:43
984
4
原创 使用 Knife4j 进行 API 文档生成与管理
除了基础的配置和使用,还能通过以下方式扩展 Knife4j 的应用,在复杂的微服务架构中,利用其分组功能,为不同的微服务模块创建独立的 Docket 实例并设置不同 groupName ,使各模块 API 文档清晰区分,方便维护和查看。对于 API 版本管理,除了在 URL 中体现版本,还可以结合自定义请求头,在 Knife4j 配置中精准匹配不同版本的接口路径,展示版本演进。
2024-12-15 17:55:14
1038
7
原创 Apache 开源宝藏库,程序员的“百宝箱”
Apache Commons是Apache软件基金会旗下超实用的Java开源工具库,由一系列子项目构成,堪称Java开发者的得力助手。拿Commons Lang举例,其处理字符串时优势尽显,以往判断字符串是否为空,要写繁琐的条件判断,防止空指针异常,现在只需用StringUtils的isEmpty、isBlank方法, 非常便捷。
2024-12-08 14:42:27
796
8
原创 Java实现三种排序方式
对于每一个未排序的元素key = arr[i] ,内层的while循环while(j >=0 && arr[j] > key)在已排序的序列中从后向前扫描,当arr[j] > key时,说明当前元素 arr[j] 的位置应该在key之后,所以将arr[j]向后移动一位,然后 j 减1,继续向前比较,当找到合适的位置(arr[j] <= key 或者 j < 0)时,将key插入到该位置。j++)用于比较相邻的元素,在每一轮排序中,由于最大的元素会“浮”到数组的末尾,所以下一轮比较的元素个数会减少1。
2024-12-04 16:17:00
1325
3
原创 java单例设计
单例模式是一种创建型设计模式,它保证一个类在整个系统中只有一个实例,并提供一个全局访问点来访问该实例,当需要共享某个资源时,使用单例模式可以确保系统中只有一个实例在工作。从实现角度讲,在单例模式中,为了防止外部代码随意创建该类的多个实例,类的构造函数通常是私有的,通过一个静态方法来获取这个唯一的实例。
2024-12-02 16:46:52
1180
5
原创 Lombok :简化 Java 编程的得力工具
在 Java 开发过程中,常常需要编写大量的样板代码,例如构造函数、Getter 和 Setter 方法、equals 和 hashCode 方法等。这些代码虽然逻辑相对固定,但编写起来却较为繁琐且容易出错,并且会使代码显得冗长。Lombok 应运而生,它通过注解的方式自动为 Java 类生成这些常用的方法,极大地简化了代码编写过程,让开发者能够将更多精力集中在业务逻辑的实现上。
2024-11-28 19:41:14
1733
14
原创 Spring数据接收揭秘
RequestMapping是Spring框架中用于将HTTP请求映射到控制器的处理方法上的注解,它能将特定的HTTP请求与控制器中的方法进行关联,使开发者可以根据请求的路径、请求方法、请求头、请求参数等条件,来确定由哪个方法处理该请求,从而实现对不同类型请求的精准处理。当控制器方法被调用时,Spring会检查方法的参数是否被@RequestParam注解标注,如果是,它会根据注解中指定的参数名称,从HTTP请求中查找对应的参数值,找到后,将其转换为方法参数所需的类型,并赋值给该参数。
2024-11-25 14:45:44
1042
9
原创 依赖注入注解
适用于纯Spring项目,依赖对象主要由Spring容器管理和配置。当需要按类型自动装配,且容器中该类型Bean唯一,或虽有多个但可通过 @Qualifier 等方式区分时常用。
2024-11-22 22:41:15
876
7
原创 java实现枚举
枚举算法也叫暴力算法,是一种简单直接的问题求解方法,它通过逐一列举问题的所有可能解,并检查每个可能解是否符合问题的条件,直到找到正确的解或者遍历完所有可能的情况。对于一个问题,首先确定解的范围,然后在这个范围内逐个尝试所有可能的值,例如,在寻找一个整数 n 的所有因数时,枚举算法会从1开始,逐个检查到 n ,判断每个数是否能整除 n。
2024-11-20 15:38:09
1649
56
原创 java实现贪心算法
贪心算法是一种在每一步决策时都采取当前状态下的最优选择,从而希望导致全局最优解的算法策略,它总是做出在当前看来是最好的选择,但不会考虑这个选择对未来可能产生的影响,也不会回溯去改变之前的决策,就像是一个贪婪的人,在每一个选择点只考虑眼前的最大利益。Java是面向对象的编程语言,具有丰富的类库和数据结构,这使得在实现贪心算法时,可以方便地利用已有的数据结构,如数组、列表、集合等,来存储和操作数据。题目1假设有一个花坛,部分地块已经种了花,用数组 flowerbed 表示, 1 表示已种花, 0 表示未种花。
2024-11-19 00:26:16
1627
10
原创 MySQL中Flashback(闪回)技术
作为一个开发人员,数据的误操作(如误删除、误更新)是一个常见且可能导致严重后果的问题。Flashback(闪回)技术作为一种数据恢复手段,能够帮助数据库管理员将数据库恢复到过去某个特定的时间点或事务点之前的状态,从而挽回因误操作造成的数据损失。
2024-11-16 18:48:53
1350
4
原创 Hutool:代码便捷之道
核心模块这些模块犹如 Hutool 的基石,其中包含了诸如 StringUtils、ArrayUtils、CollectionUtils 等极为重要的工具类。字符串判空:isEmpty和isNotEmpty方法用于判断字符串是否为空或非空。// true// true字符串转换: toString 和toStringOrNull 方法用于将对象转为字符串,null会分别返回"null" 和null// "null"// null。
2024-11-15 17:06:37
2907
6
原创 Spring Security概述
Spring Security是一个功能强大且高度可定制的框架,专门用于保护Java Web应用程序。它为开发者提供了一套全面的解决方案,帮助他们在应用程序中实现安全控制,从而确保数据的安全性和完整性。
2024-11-14 20:54:32
753
6
原创 SSM框架概述
在当今竞争激烈的软件开发领域,高效、稳定且易于维护的框架对于项目的成功至关重要。SSM框架作为一种经典的Java Web开发框架,以其独特的优势和卓越的性能,在众多开发者和企业中备受青睐,它由Spring、Spring MVC和MyBatis三个杰出的开源项目整合而成,下面将对其进行详尽的剖析。
2024-11-13 23:55:50
1193
6
原创 spring框架基础
在传统的程序设计中,对象的创建和对象间的依赖关系是由对象自身控制的。例如,如果一个类A需要使用类B的功能,那么类A会在自己的代码中直接创建类B的实例。这种设计会导致类A和类B之间的耦合度很高,不利于代码的重用和测试。IoC的核心思想是将对象的创建和对象间依赖关系的控制权从对象本身转移到外部容器。这样,对象就不再需要自己创建或管理依赖,而是通过容器来注入所需的依赖。
2024-11-12 23:06:27
1309
7
原创 redis只存入一次
然后,创建一个配置类来配置RedisTemplate,并设置序列化,我们使用了 StringRedisSerializer 来序列化Redis的键,而值则使用了 GenericJackson2JsonRedisSerializer 来序列化,这是一种将对象序列化为JSON格式的序列化器。在Spring中,你可以使用Redis的 SETNX命令来确保一个键只被设置一次,如果键已经存在,则命令不会执行任何操作。这样,你就可以确保即使有多个存入请求,键也只会被设置一次。
2024-11-11 07:41:14
582
7
原创 mysql特性
MyISAM是非聚集索引,与InnoDB的聚集索引不同,MyISAM适合于那些对读取性能要求高、不需要事务支持的应用,但其崩溃恢复与InnoDB相比,MyISAM在崩溃后可能会出现数据损坏,需要手动修复,而InnoDB具备强大的崩溃恢复机制。
2024-11-07 20:50:51
1489
8
原创 mysql约束和高级sql
事务是一组SQL语句的集合,它们要么全部成功执行,要么全部不执行,把一系列的操作放在一个地方,然后再决定是否生效。MySQL存储过程是一组为了完成特定功能的SQL语句集合,它被编译并存储在数据库中,可被多次调用执行,使用存储过程可以提高性能,加强可维护性。:连接用于结合两个或多个表的行,基于相关的列。这个查询的结果将是一个包含两列的表 books.title 和 authors.name,每一行都对应一个书籍及其作者的名称。MySQL中的约束用于定义表中数据的规则,以确保数据的准确性和可靠性。
2024-11-06 16:35:57
3368
42
原创 mysql数据表和索引
table_name是你想要创建的表的名称,column1,column2,是表中的列名,datatype是列的数据类型,如INT,VARCHAR,DATE等,constraints是列的约束条件,如NOT NULL,PRIMARY KEY,UNIQUE等。你可以使用这个命令来添加、删除或修改列,或者修改表的约束。UNIQUE关键词用于创建唯一索引,index_name是索引的名称,table_name是表的名称。创建、修改和删除数据表通常是数据库管理的基本操作,这些操作可以在不同的数据库管理系统中执行。
2024-11-05 09:25:55
515
10
原创 mysql基础知识
数据库是系统化的工具,用来存放、检索和分析数据。它的核心价值在于帮助我们高效地处理信息,确保数据的准确性和安全性。想象一下,如果没有数据库,我们可能需要用无数的文件柜来存放各种文件,查找信息时就得一个一个翻,这很低效。数据库的出现,就像是给这些文件柜装上了智能搜索系统,我们只需要输入一些关键词,就能快速找到想要的信息。数据库的工作原理,是基于一套复杂的数据结构和算法,这些结构和算法能够确保数据的存储既有序又高效。它允许我们通过简单的查询语言,比如SQL,来访问和操作数据。
2024-11-04 15:08:21
1091
4
原创 redis详细教程(7.哨兵)
哨兵机制是Redis数据库提供的一种高可用性解决方案。它由一个或多个特殊的Redis服务器(称为哨兵)组成,这些服务器不执行数据存储功能,而是专注于监控和管理其他Redis服务器(主节点和从节点)。
2024-11-02 20:31:15
1406
18
原创 redis详细教程(6.主从复制)
主节点将从同步点开始,发送所有新的写命令给从节点,从节点接收到这些命令后,会按照相同的顺序执行它们,从而更新其数据集,使其与主节点的数据集保持一致。在从节点加载完RDB文件之后,主节点会将自开始创建快照以来缓冲的所有写命令发送给从节点,从节点会执行这些命令,确保其数据状态与主节点保持一致。通过这个过程,从节点能够获得主节点的数据副本,并开始在后续的操作中接收和执行主节点的写命令,以保持数据的同步。如果复制缓冲区足够大,能够包含从节点断开连接时的数据,主节点就可以从这个点开始发送后续的写命令给从节点。
2024-11-01 00:03:51
791
3
原创 redis详细教程(5.AOP和RDB持久化)
AOF(Append Only File)日志和RDB(Redis Database Backup)持久化是Redis中两种重要的数据持久化机制。RDB持久化机制原理RDB是Redis提供的一种数据快照保存机制,它将某个时间点的数据库状态保存到一个RDB文件中。这个文件非常适合用于灾难恢复,因为它是自包含的,并且可以被复制到任何其他支持RDB格式的Redis服务器上。RDBRDB的触发方式有两种:自动触发:Redis可以在配置文件中设置自动保存点,例如save 60 1000,意味着如果60
2024-10-30 10:46:46
608
2
原创 redis详细教程(4.GEO,bitfield,Stream)
Redis GEO 是 Redis 数据库中的一个功能模块,自 Redis 3.2 版本开始引入,专门用于处理地理位置信息。这个模块使得 Redis 能够存储并查询地理坐标,非常适合用于需要地理位置数据的应用,如实时位置查询、地理围栏、距离计算等。Redis GEO 的数据结构是基于有序集合(Sorted Set)。每个地理位置信息由经度、纬度和一个唯一的标识符组成。
2024-10-29 11:01:09
1568
12
原创 redis详细教程(3.ZSet,Bitmap,HyperLogLog)
Redis 的 ZSet(有序集合)是一种特殊的数据类型,它允许存储一系列不重复的字符串元素,并为每个元素关联一个分数(score)。这个分数用于对集合中的元素进行排序。ZSet 的特点是:唯一性:集合中的每个元素都是唯一的。可排序性:元素可以根据分数进行排序。内部实现:ZSet 的内部实现主要依赖于两种数据结构:跳跃表(skiplist)和哈希表(hash table)。跳跃表用于实现元素的排序和范围查询,而哈希表则用于实现元素的快速查找。
2024-10-29 00:57:45
1569
3
原创 redis详细教程(3.hash和set类型)
Redis中的Hash是一种数据结构,用于存储键值对集合。在Redis中,Hash非常适合表示对象,其中对象的每个字段都对应一个键值对。以下是关于Redis中Hash的详细讲解:特点:1. 键值对集合:Hash是一个包含字段和值的映射表,字段和值都是字符串类型。2. 存储结构:Hash内部实现为一个字典,当数据量较小时,使用ziplist(压缩列表)存储,当数据量较大时,会使用hashtable(哈希表)存储。3. 动态字段:Hash可以动态地添加或删除字段,非常灵活。
2024-10-27 22:44:54
1734
10
原创 redis详细教程(2.List教程)
List是一种可以存储多个有序字符串的数据类型,其中的元素按照顺序排列(可以重复出现),可以通过数字索引来访问列表中的元素,索引可以从左到右或者从右到左。Redis 列表可以通过两种方式实现:压缩列表(ziplist)和双向链表(linked list)。在不同的条件下,Redis 会自动在这两种实现之间进行转换。
2024-10-27 21:54:34
1278
23
原创 安装redis教程(Windows,Linux)
1. 数据结构丰富:Redis 支持多种数据结构,如字符串(strings)、列表(lists)、集合(sets)、有序集合(sorted sets)、哈希表(hashes)、位图(bitmaps)、超日志(hyperloglogs)和地理空间(geospatial)索引半径查询。2. 持久化:虽然 Redis 是基于内存的,但它提供了数据持久化的功能,可以将内存中的数据保存到磁盘中,以便在系统重启后能够恢复数据。4. 支持事务:Redis 支持事务,允许执行一组命令,并确保所有命令在事务中被顺序执行。
2024-10-26 17:53:37
808
6
原创 redis详细教程(1.String类型)
Redis 的 String 类型内部使用了一种叫做 SDS(Simple Dynamic String)的结构。SDS 的设计比传统的 C 语言字符串更加高效和安全,主要特点如下:头部信息:SDS 的头部包含了一些元数据,比如字符串的长度、剩余可用空间的长度以及一个标志位,这允许 Redis 快速获取字符串的长度,避免频繁的遍历操作。二进制安全:SDS 保证二进制安全,即字符串可以,包括空字符(\0),这对于存储如图片、视频等二进制数据至关重要。
2024-10-26 13:33:27
672
2
原创 java基础全篇(已完结)
完结撒花!!!在经历了漫长而充实的创作过程后,我终于完成了关于Java基础的全面教程系列。在这个系列中,我们一起走过了从Java环境的搭建到复杂编程概念的掌握,一起吃了各种各样的bug。
2024-10-25 00:03:01
1239
19
原创 java基础2024(8.JDBC和反射)
getDeclaredMethods():返回类中声明的所有方法,包括公共、保护、默认(包)访问和私有方法,但不包括继承的方法。getDeclaredFields():返回类中声明的所有字段,包括公共、保护、默认(包)访问和私有字段,但不包括继承的字段。Class对象是Java运行时系统的一个特殊对象,它包含了关于类的结构信息,包括字段、方法、接口、构造器等信息。这个方法要求类有一个无参的构造器。1. 性能开销:反射涉及到类型信息的解析,因此相对于直接的Java代码,反射操作通常有更高的性能开销。
2024-10-25 00:01:07
655
原创 java基础2024(7.多线程)
要使用Runnable接口,你需要创建一个实现了Runnable接口的类,并实现run()方法。创建并运行Runnable线程:Runnable接口的类需要通过Thread类来启动线程,如下:run()方法内部的代码是由线程调度器来调用的,
2024-10-24 16:58:41
655
4
原创 java基础2024(6.I/O)
Java I/O(输入/输出)是指Java程序与外部世界进行通信的过程。这通常涉及从文件、网络连接、控制台等读取数据以及向这些源写入数据。
2024-10-24 11:22:34
696
2
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人