- 博客(72)
- 收藏
- 关注
原创 String 为什么要设计成不可变的?
2)String 对象可以缓存 hashCode。字符串的不可变性保证了 hash 码的唯一性,因此可以缓存 String 的 hashCode,这样不用每次去重新计算哈希码。因为 String 设计成不可变,当创建一个 String 对象时,若此字符串值已经存在于常量池中,则不会创建一个新的对象,而是引用已经存在的对象。String 被许多 java 类用来当作参数,如 url 地址,文件 path 路径,反射机制所需的 Strign 参数等,若 String 可变,将会引起各种安全隐患。
2024-06-27 09:38:40 905
原创 为什么 Redis 不立刻删除已经过期的数据
过期字典的键指向 Redis 数据库中的某个 key(键),过期字典的值是一个 long long 类型的整数,这个整数保存了 key 所指向的数据库键的过期时间(毫秒精度的 UNIX 时间戳)。在查询一个 key 的时候,Redis 首先检查该 key 是否存在于过期字典中(时间复杂度为 O(1)),如果不在就直接返回,在的话需要判断一下这个 key 是否过期,过期直接删除 key 然后返回 null。通过设置合理的过期时间,Redis 会自动删除暂时不需要的数据,为新的缓存数据腾出空间。
2024-06-26 23:25:20 1944
原创 MongoDB规范
2.4、建议是有业务意义的单词组合,用下划线连接,比如:shipping_orders;3.1、文档的键值不能包括除_以外其他的一些特殊字符;3.2、禁止使用_id,因为这个是默认的主键;1.2、不能包括除_以外其他的一些特殊字符;2.2、不能包括除_以外其他的一些特殊字符;3.3、一个集合中尽可能使用相同类型的文档;4.4、每次查询的文档数建议不超过500。4.2、单个文档的大小建议不超过16M;3.4、经常作为条件的字段添加索引。4.1、单条语句避免查询过多的数据;4.3、禁用不带条件的查询和更新;
2024-06-25 13:31:34 381
原创 Redis规范
1.2、string 类型控制在10 KB以内,hash、list、set、zset元素个数不要超过5000;使用expire设置key的过期时间,防止Redis中残留大量废弃的数据,Redis不是垃圾桶,内存很贵的。如果单个集合结构里有多个元素,单次操作过多的元素,效率可能会很低,并且可能把网卡流量打满。当然,同一个Redis里面的key过期时间也尽量错开,集中过期,可能会导致缓存雪崩。另一方面,放到关系型数据库中,数据很难丢失。一方面,内存是比较贵的,可以节约成本;1.3、控制key的过期时间;
2024-06-24 12:15:04 449
原创 DataBase 的一些规范 ?
原因:可以降低索引所占用的空间,并且很多时候,比如字符串基本是长度大于 20,但是只要建立长度为 20 的索引,就已经有很高的区分度了。原因:外键会导致表与表之间耦合,update 与 delete 操作都会涉及相关联的表,很影响sql 的执行效率,甚至会造成死锁。原因:会浪费更多的磁盘和内存空间,非必要的大量大字段查询会淘汰掉热数据,导致内存命中率急剧降低,影响数据库性能。原因:在存储的时候,FLOAT和DOUBLE都存在精度损失的问题,很可能在比较值的时候,得到不正确的结果。
2024-06-23 09:48:47 1214
原创 聊聊语法糖
在编程中,语法糖通过提供更为简洁、易读的代码形式,使得程序员能够更高效地编写和维护代码。例如,在React中,传统的JavaScript写法可以被替换为JSX写法,两者在功能上完全相同,但JSX的写法更为简洁和直观。Java语言也提供了丰富的语法糖,例如泛型、自动装箱与拆箱、可变长参数等,这些特性在编译阶段会被转化为基本语法结构。在C语言中,使用数组表示法如a[i]实际上等同于*(a+i),这是语法糖的一个早期示例。例如,在Vue 3中,引入了Composition API,其中。:属性名="属性值"
2024-06-21 11:57:32 1178
原创 索引失效的10个场景
虽说name是联合索引的第三个字段,但根据最左匹配原则,该sql语句依然能走索引,因为最左边的第一个字段code,在where中使用了。只不过order by的时候,排序效率比较低,需要走一次。order by后面如果包含了联合索引的多个排序字段,只要它们的排序规律是相同的(要么同时升序,要么同时降序),也可以走索引。id字段本身是有主键索引的,同时height字段也建了普通索引的,并且两个字段都是int类型,类型是一样的。查询所有列的数据,大概率会查询非索引列的数据,非索引列不会走索引,查询效率非常低。
2024-06-20 10:39:59 2227
原创 消息队列的应用场景有哪些?
比如用户在提交订单之后,订单数据写入消息队列,不能立即返回用户订单提交成功,需要在消息队列的订单消费者进程真正处理完该订单之后,甚至出库后,再通过电子邮件或短信通知用户订单成功,以免交易纠纷。生产者(客户端)发送消息到消息队列中去,消费者(服务端)处理消息,需要消费的系统直接去消息队列取消息进行消费即可而不需要和其他系统有耦合,这显然也提高了系统的扩展性。,消息发送者将消息发送至分布式消息队列即结束对消息的处理,消息接受者从分布式消息队列获取该消息后进行后续处理,并不需要知道该消息从何而来。
2024-06-19 11:32:27 597
原创 ThreadLocal内存泄漏
内存泄漏发生在程序中已动态分配的堆内存由于某种原因未被释放或无法释放,导致系统内存浪费。这种情况会让程序运行速度变慢,甚至可能导致系统崩溃。是Java提供的一个本地线程副本变量工具类,它允许每个线程拥有自己独立的变量副本。这样一来,各个线程之间的变量互不影响,完美解决了多线程环境下的数据共享问题。在多线程环境下,多个线程可能需要协作处理同一份数据,这可能会导致数据一致性问题。数据一致性问题指的是多个主体对同一份数据无法达成共识。
2024-06-17 10:54:43 683
原创 后端防接口被刷
比如登陆时用的短信验证码,页面限制60秒发送一次,大大延长用户操作的时间,但是当用户刷新了页面,对于当前页面来说,用户还是可以继续点击发送短信验证码,所以服务端我们也要做访问限制。为何能自动化的使用程序刷接口,就是因为通过各种手段破解了我们接口所需要的参数以及认证信息,那么我们对接口进行加密就可以增加这个过程的难度,让其再去破译该接口就变的没有那么容易。我们可以自定义一个注解,在注解上添加权限授权标识,并在网关上增加权限拦截器,对增加了该权限注解的接口进行权限验证,只有匹配该接口所需要的权限才可以访问。
2024-06-16 12:18:03 2041
原创 JavaScript 的运行
为了提高性能,现代浏览器的 JavaScript 引擎通常会使用一些优化技术,如即时编译(JIT)编译器,将热点代码(频繁执行的代码)编译成。在这个阶段,引擎将源代码字符串分解成一个个的词素(token),这些词素是语言中有意义的最小单元,如。JavaScript 的解释执行通常比较慢,因为它需要在运行时动态地解析和执行代码。引擎会创建一个作用域链,确保变量和函数的访问遵循正确的作用域规则。例如,即使在代码中后面声明了变量,引擎也会在预编译阶段将它们。引擎逐行读取代码,并根据代码的指令执行相应的操作。
2024-06-15 11:55:40 420
原创 乐观 | 悲观 锁
在乐观锁的策略中,线程访问数据时不会立即加锁,而是在数据更新时进行一次检测,查看自读取数据以来数据是否被其他线程修改过。悲观锁(Pessimistic Lock)是一种保守的策略,它假设最坏的情况总是会发生,即数据竞争和冲突是常见的。相反,乐观锁更适合读密集型环境,它能提高系统的响应速度和吞吐量,但在写操作密集的环境中可能因频繁的冲突和重试而导致性能下降。例如,如果系统事务大多是读取操作,只有少量的写入操作,并且这些写入操作不经常发生冲突,那么使用乐观锁可能更合适。
2024-06-14 11:13:24 467
原创 缺陷 & 规避
Checked Exception 是在编译期要求必须处理的异常,也就是非 RuntimeException 类型的异常,但 Java Checked 的异常给接口的调用者造成了一定的负担,导致异常声明层层传递,如果顶层能够处理该异常,我们可以通过 lombok 的 @SneakyThrows 注解规避 Checked exception。虽然 JVM 有垃圾回收机制,但并不意味着内存泄漏问题不存在,一般内存泄漏发生在在长时间持对象无法释放的场景,比如静态集合,内存中的缓存数据,运行时类生成技术等。
2024-06-13 14:25:49 806
原创 Vue小细节
可以同时使用,但是这样做并不推荐,尤其是当它们被放在同一个元素上时。为真时,才会开始遍历和渲染列表,既实现了条件渲染,又避免了优先级冲突和性能问题。,但通过合理的结构调整和计算属性的使用,可以更高效、清晰地实现所需的功能。:在计算属性中预先过滤出需要渲染的数据,然后仅用。)包裹内部的列表元素,并在这个外部元素上使用。为了避免上述问题,最佳实践是将。标签或一个额外的元素(如。遍历这个过滤后的数组。
2024-06-11 22:32:43 555 1
原创 Spring为什么不支持static字段注入
Spring的依赖注入机制是基于对象层面的,意味着它通过为类的实例字段或方法参数注入所需的依赖来工作。由于这种顺序上的不一致,Spring无法直接对静态变量进行注入,因为这需要修改已经加载的类的状态,而这通常是不允许的。重要的是要认识到,过度依赖静态变量可能与Spring框架推崇的编程实践不符,因此在实际开发中应尽量避免使用静态变量,或者谨慎地使用它们。首先,我们来确认一下,在Spring框架中,是否不允许对静态字段和方法进行注入的各种使用方式。注解的方法来初始化静态变量。构造函数注入,不需要任何的注解。
2024-06-03 23:49:00 1042
原创 Mysql全文搜索和LIKE搜索有什么区别
虽然LIKE查询在某些情况下可以满足简单的模糊匹配需求,但在处理大量文本数据和复杂查询时,全文搜索通常是一个更好的选择。如果你正在处理一个包含大量文本数据的数据库,并且需要高效的文本搜索功能,那么建议考虑使用全文搜索而不是LIKE查询。索引:全文搜索需要创建FULLTEXT索引,而LIKE查询通常不需要(尽管在某些情况下,例如使用前缀匹配时,可以创建B-tree索引来优化性能)。功能:全文搜索提供了更丰富的查询功能,如多个关键词的搜索、自然语言搜索、布尔搜索等。全文搜索和LIKE的区别。
2024-06-03 18:51:47 757
原创 过滤器和拦截器有什么区别?
拦截器只能拦截请求到达Controller之前,或者响应返回视图之前的处理。过滤器(filter)是基于servlet容器回调实现的,可以拦截请求和响应的所有内容,包括静态资源和动态资源。拦截器可以进行更复杂的业务逻辑处理,例如权限控制、日志记录、性能监控、事务控制等。拦截器是SpringIOC容器管理,可以获取到spring容器的bean。过滤器主要用于过滤请求和响应,例如字符编码处理、安全控制、日志记录等。过滤器是基于servlet规范中的Filter接口实现的。拦截器通过动态代理(反射)的方式实现。
2024-05-31 20:20:25 450
原创 看看Java基础
HashMap在底层数据结构上采用了数组+链表+红黑树,通过散列映射来存储键值对数据。默认的负载因子是0.75,如果数组中已经存储的元素个数大于数组长度的75%,将会引发扩容操作。【1】创建一个长度为原来数组长度两倍的新数组。【2】1.7采用Entry的重新hash运算,1.8采用高于运算。1、判断数组是否为空,为空进行初始化;2、不为空,则计算 key的hash值,通过(n - 1) & hash计算应当存放在数组中的下标 index;
2024-05-31 11:28:56 1125
原创 动态SQL语句
底层的JDBC的prepareStatement中的sql语句是预编译的,sql语句使用了占位符规定了sql语句的结构,并且在设置参数的时候,如果有特殊字符还会进行自动的转义,#占位符可以预防sql注入。: 使用#{}可以有效防止SQL注入,因为它会将传入的参数都当作一个字符串来处理,并且自动进行转义,即使参数中含有SQL特殊字符也不会影响SQL的执行。两者都是动态SQL的一部分,用于在编写MyBatis的映射文件时动态地构造SQL语句,根据传入的参数改变查询条件或SQL结构。
2024-05-30 16:30:18 496
原创 Spring MVC 启动流程?
在 web.xml 文件中给 Spring MVC 的 Servlet 配置了 load-on-startup,所以程序启动的时候会初始化 Spring MVC,在 HttpServletBean 中将配置的 contextConfigLocation属性设置到 Servlet 中,然后在FrameworkServlet 中创建了 WebApplicationContext,DispatcherServlet 根据 contextConfigLocation 配置的classpath 下的 xml 文件初始
2024-05-30 13:42:47 619
原创 Spring MVC 运行流程?
1.spring mvc 将所有的请求都提交给 DispatcherServlet,它会委托应用系统的其他模块负责对请求 进行真正的处理工作。5.Dispathcher 查询一个或多个 ViewResolver 视图解析器,找到 ModelAndView 对象指定的视图对象。2.DispatcherServlet 查询一个或多个 HandlerMapping,找到处理请求的 Controller。3.DispatcherServlet 请请求提交到目标 Controller。
2024-05-30 09:10:13 446
原创 如何防止重复提交请求?
在搜索框输入内容时,可能需要在用户停止输入一段时间后才发送请求,以减少请求的次数。在用户连续按键时,例如在输入密码时,可以限制按键事件的处理频率。在用户点击提交按钮后,使用防抖或节流的技术延迟发送请求,确保只发送一次请求。对于下单流量不算高的系统,可以采用这种请求唯一ID+数据表增加唯一索引约束的方式,来防止接口重复提交!1. 唯一ID机制:生成一个唯一的ID,并在客户端提交时一并发送,服务器验证ID后进行处理。在登录界面,用户点击登录按钮,请求登录接口后,出现加载动画,防止用户重复点击。
2024-05-29 07:51:18 650
原创 要不优化一下代码
业务场景:在需要频繁查找、添加、删除操作的场景中,选择合适的数据结构可以提高效率。业务场景:正则表达式是强大的字符串处理工具,但过于复杂的正则表达式会严重影响性能。业务场景:在字符串拼接频繁的场景中,使用StringBuilder可以提高性能。业务场景:频繁的类型转换会影响性能,特别是涉及到基础数据类型和包装类之间的转换。业务场景:在需要处理大量并发请求的场景中,合理使用线程池可以提高系统响应速度。业务场景:在处理大量数据的业务场景中,频繁创建对象会增加垃圾收集的负担。首先关注代码的清晰性和正确性。
2024-05-29 00:17:00 623
原创 总结一点sql优化
优化背景sql优化是程序员必备的技能之一,无论是在面试还是实际工作中都是不可或缺的。sql优化同时又是需要持续学习的一件事情,在工作中必然会遇到性能的瓶颈,比如服务器cpu持续90%多,网页加载速度超慢等等这些性能问题,首先想到的是进行sql优化,因为相比于其他优化方式来说,sql优化更直接,成本更小。 1)在查询中避免用到select * from反例:select * from user where id=100;在实际的业务场景中,我们可能只需要1、2列就可以,*是查询出所有的列,这样白白浪费
2024-05-28 17:04:54 864
原创 了解缓存预热
预热一般指缓存预热,一般用在高并发系统中,为了提升系统在高并发情况下的稳定性的一种手段。缓存预热是指在系统启动之前或系统达到高峰期之前,通过预先将常用数据加载到缓存中,以提高缓存命中率和系统性能的过程。缓存预热的目的是尽可能地避免缓存击穿和缓存雪崩,还可以减轻后端存储系统的负载,提高系统的响应速度和吞吐量。:当系统重启或新启动时,缓存是空的,这被称为冷启动。冷启动可能导致首次请求处理缓慢,因为数据需要从慢速存储(如数据库)检索。:通过预先加载常用数据到缓存中,可以确保数据快速可用,从而加快数据访问速度。
2024-05-28 12:43:58 622
原创 为什么MySQL需要binlog、undo log、redo log 3种日志?
为了防止断电导致数据丢失的问题,当有一条记录需要更新的时候,InnoDB 引擎就会先更新内存(同时标记为脏页),然后将本次对这个页的修改以 redo log 的形式记录下来,这个时候更新就算完成了。当系统崩溃时,虽然脏页数据没有持久化,但是 redo log 已经持久化,接着 MySQL 重启后,可以根据 redo log 的内容,将所有数据恢复到最新的状态。在事务提交之前,MySQL 会将更新前的数据记录到 undo log 日志文件里,当事务回滚时,可以利用 undo log 来进行回滚。
2024-05-28 08:18:06 808
原创 前后端联调小细节
前端向后端发数据,有时候前端和后端的字段是一样的,字段没有问题,前端发过来的载荷也没有问题,但后端接收到的字段是null的,这时候可以排查前端发过来的数据是不是多嵌套了一层,比如发过来的是。使用@RequestBody注解接收的实例对象对应不上前端发过来的数据。多嵌套了一层导致后端对应的controller的方法的方法形参。
2024-05-28 08:17:39 521
原创 Arrays.sort 和 Collections.sort 实现原理和区别?
然后还有混排(Shuffling)、反转(Reverse)、替换所有的元素(fill)、拷贝(copy)、返回Collections中最小元素(min)、返回Collections中最大元素(max)、返回指定源列表中最后一次出现指定目标列表的起始位置( lastIndexOfSubList )、返回指定源列表中第一次出现指定目标列表的起始位置( IndexOfSubList )、根据指定的距离循环移动指定列表中的元素(Rotate);java.util.Collection 是一个集合接口。
2024-05-27 08:38:50 392
原创 分段和分页的本质,它们是如何产生的,以及它们在内存管理中的作用。比较这两种机制的异同,在实际应用中的优势和局限
分段:分段将逻辑地址空间划分为若干个不同长度的段(segments),每个段代表程序中的一个逻辑单元,例如代码段、数据段、堆栈段等。分页:分页将逻辑地址空间和物理内存空间划分为固定大小的页(pages),通常为连续的 2 的幂大小,如 4 KB或 4 MB。1)内存碎片:分段可能导致内存碎片,因为每个段的大小可以不同,随着时间的推移,内存中可能会出现许多无法被有效利用的小块内存。2)内存浪费:如果一个段中的某些部分未被使用,这部分内存仍然会被分配给该段,造成内存浪费。3)分页的大小固定,由操作系统决定;
2024-05-27 08:36:08 391
原创 Redis常用作MySQL等数据库的缓存层,如何保证Redis缓存和数据库数据的一致性?
更新缓存会有并发问题,可能会导致缓存与数据库数据不一致,这对大多数业务场景来说是不能接受的。如线程1和2都是写操作,线程1先完成数据库写操作,然后线程2完成了数据库和缓存的写操作,之后线程1完成缓存写操作,那么此时缓存和数据库的数据就不一致了。另外,先删除缓存,由于缓存中数据缺失,加剧数据库的请求压力,可能会增大缓存穿透出现的概率。如果需要强一致性,也是需要加分布式锁的,但是这样的话,方案的复杂性就会大大增加了。2、读操作:读取缓存,存在则直接返回,不存在则读取数据库,之后更新到缓存。
2024-05-27 08:35:14 409
原创 刚上手Java会踩的坑
其它的包装类型Integer, Byte, Boolean, Short, Character Long, Float, Double 这些是对基本数据类型的包装类型。我们做项目的时候,保存数据类型一般都使用Integer这类包装数据类型,因为它们的默认值为null,而不是基本数据类型例如int的默认值是0。像String,数组,类的实例对象或者基本数据类型的包装类这类进行比较是否相等要使用equals(),因为它们是引用类型的数据。其根本原因是:过滤后的集合中,保存的是对象的引用,该引用只有一份数据。
2024-05-26 09:14:34 1132
原创 MySQL什么时候 锁表?如何防止锁表?
总的来说,MySQL 使用页级锁的情况相对较少,因为页级锁通常会导致锁的粒度过大,影响并发性能。在设计数据库和应用程序时,通常会尽量避免使用页级锁,而是优先使用行级锁或其他更细粒度的锁。每次锁定相邻的一组记录,锁定粒度界于表锁和行锁之间,加锁开销和加锁时间界于表锁和行锁之间,并发度一般。MySQL 使用页级锁的情况相对较少,因为 MySQL 默认使用的是行级锁。锁定粒度大,发生锁冲突的概率最高,并发度最低。锁表会带来一系列问题,影响数据库的性能和系统的稳定性。从操作的粒度可分为表级锁、行级锁和页级锁。
2024-05-25 10:24:47 443
原创 SpringBoot之@Builder 注解
(2)有时候将@Builder 和 @Data 搭配使用,以为是一个很好的搭配,导致生成的构造器是可变的,它允许使用 setter 方法修改构造器的状态。不了解底层的@Builder而去使用可能会出现奇奇怪怪的问题,使用大神封装好的东西是这样子的,在出现问题时我们就可能回去分析源码,故而知道问题所在,大家加油学习,这个内容我也是学习了大神的作品才知道的。(1)@Builder 生成的构造器不是完美的,如果没有提供必须的参数,构造器可能会创建出不完整或者不合法的对象,导致代码报错。
2024-05-24 20:30:45 631
原创 sql小总结
1. null我们在进行=//in/not in等判断时,null会不包含在这些判断条件中,所以在对null的处理时可以使用nvl或者coalesce函数对null进行默认转换。尽可能提前对列进行剪裁,即使是全表字段都需要,也尽可能的把字段都写出来,一是减少了数据运算中不必要的数据读取,二是避免后期因为原表或者目标表字段增加,导致报错。3. limit的使用临时查询或者数据探查时,养成习惯加上limit,会快速的查询出你想要的数据,且消耗更少的资源。4. 关联。
2024-05-24 13:04:19 837
原创 Spring、SpringMVC、SpringBoot 三者之间是什么关系
3. SpringBoot是基于Spring框架的一个开发框架,用于快速构建独立的、生产级别的Spring应用程序。它通 过自动配置和约定优于配置的方式,简化了 Spring 应用程序的配置和开发过程。Spring有多 个模块,包括 Spring Core、Spring Context、Spring JDBC、Spring Web 等,每个模块提供了不同的功 能。因此,SpringBoot 可以看作是在 Spring 的基础上,通过自动配置和约定优于配置的方式,提供了更加简单、快速 的开发体验。
2024-05-24 12:28:23 748
原创 mybatis报错之SQL语句
我自己踩过的一个坑就是使用mybatis-plus的根据id进行更新时出现过问题:updateById(),有时候我们要根据其他条件进行修改数据库的某一行,但是updateById()只能通过id进行更改,该方法传入的参数还是一个实体类的实例,使用不好很容易出错。4.留意sql语句的错误,留意别添加多了逗号什么的,留意每一个符号,平时注意sql语句的错误,因为在idea里面sql语句是一个字符串,所以idea自己不会报出错误,在写sql语句或者类似的需要传入一个字符串的时候要留意标点符号等等问题。
2024-05-23 11:21:54 461
原创 什么是网关,网关有哪些作用?
网关(Gateway)是在计算机网络中用于连接两个独立的网络的设备,它能够在两个不同协议的网络之间传递数据。在互联网中,网关是一个可以连接不同协议的网络的设备,比如说可以连接局域网和互联网,它可以把局域网 的内部网络地址转换成互联网上的合法地址,从而使得局域网内的主机可以与外界通信。总的来说,网关可以为不同网络提供连接和通信的功能,同时也可以提供安全、性能、可靠性等方面的增强功能,是现代计算机系统中不可或缺的一部分。API 网关:用于管理和转发 API 请求,实现 API 的授权、限流、监控等功能。
2024-05-23 00:19:39 620
原创 死锁是什么?如何预防和避免死锁?
4. 引入资源剥夺策略:当一个进程请求的资源被其他进程占用时,可以采取剥夺资源的策略,即暂停占用该资源的进程,直到该资源被释放后再恢复该进程的执行。2. 避免资源持有和等待:当一个进程占用了一些资源并等待另一些资源时,其他进程就无法使用这些资源,容易引发死锁。3. 避免资源互斥:有些资源在同一时间只能被一个进程占用,比如打印机、磁带机等,需要采用一些技术手段来避免资源互斥的问题。5. 引入进程抢占策略:当一个进程等待时间过⻓时,可以采取抢占其资源的策略,即中断正在执行的进程,强制释放其占用的资源。
2024-05-23 00:17:18 578
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人