- 博客(28)
- 收藏
- 关注
原创 日历签到功能实现
在本文中,我们将详细介绍如何使用Vue(前端)和SpringBoot(后端)搭配Vant组件库来实现一个日历签到功能。这个功能将允许用户在日历上进行每日签到,并跟踪他们的连续签到记录。
2024-04-16 09:16:38
1080
原创 在网页应用中实现QQ登录
当用户点击“QQ登录”按钮时,会弹出QQ登录对话框供用户进行授权登录。用户授权成功后,QQ服务器会返回一个授权码(code),然后通过该授权码来获取Access_Token和OpenID。在整个过程中,需要注意的是,保护用户隐私和账户安全是非常重要的,因此开发者需要遵循相关的法律法规和平台规则,确保用户信息的安全。// 用户已授权登录,可以获取到Access_Token和OpenID。// 在这里可以进行后续的登录逻辑处理,如查询用户信息、创建账户等。设置为你的服务器地址,用于接收QQ登录后的回调请求。
2024-04-15 09:02:48
683
原创 select、poll、epoll的区别
Select、Poll和Epoll都是I/O多路复用的实现方式,它们都可以用于处理大量并发连接。Select和Poll的主要区别在于Poll可以监视更多的文件描述符,但它们的工作方式相似,都需要遍历所有文件描述符。Epoll是更高效的I/O多路复用技术,它只关心已准备好进行I/O操作的文件描述符,避免了不必要的遍历,具有更高的性能和可扩展性。在选择使用哪种技术时,需要根据具体需求和场景进行权衡。
2024-04-13 13:10:37
457
原创 Docker部署前后端项目
Docker Compose是Docker的一个工具,它允许用户使用YAML文件格式来配置应用程序的服务。这个配置文件通常命名为。
2024-04-11 13:58:08
1059
原创 如何在SpringBoot中实现定时任务?
注意:如果使用Quartz作为定时任务框架,可以参考官方文档进行配置和使用:http://www.quartz-scheduler.org/documentation/quartz-2.3.0/quick-start.html。在SpringBoot中实现定时任务,可以使用Spring自带的@Scheduled注解或者使用第三方库如Quartz。这里以使用@Scheduled为例,介绍如何在SpringBoot中实现定时任务。
2024-04-10 10:08:57
248
原创 Redis GEO实现附近的人功能
附近的人功能是社交应用中非常常见的一项功能,它允许用户查找并发现他们周围的其他用户。使用Redis的GEO特性来实现这一功能是非常高效和简单的。
2024-04-09 13:25:08
415
原创 SpringBoot中实现阿里云验证码
需要注意的是,在实际开发中,还需要对异常情况进行处理,例如网络异常、阿里云服务异常等。另外,为了提高用户体验,可以考虑添加重试机制或者设置短信发送间隔时间。:在创建短信服务后,你将获得AccessKey和SecretKey,这两个密钥将用于调用阿里云的API接口。:在阿里云控制台中,选择"短信服务",然后点击"创建短信服务"按钮,填写相关信息并提交申请。:在你的SpringBoot项目中,添加阿里云短信服务的依赖。:首先,你需要在阿里云官网注册一个账号,并登录到阿里云控制台。
2024-04-05 19:49:29
509
1
原创 SpringBoot如何实现邮件发送?
以上就是在Spring Boot中实现邮件发送的基本步骤。需要注意的是,不同的邮件服务提供商可能有不同的配置要求,因此在配置邮件服务器信息时,请参考你的邮件服务提供商的文档。此外,如果你需要发送HTML格式的邮件或者带有附件的邮件,你需要使用。在Spring Boot中实现邮件发送相对简单,因为Spring Boot提供了很好的支持。
2024-04-04 13:28:31
207
1
原创 如何使用Redis实现分布式锁
使用Redis实现分布式锁是一个复杂且容易出错的过程。开发者需要仔细考虑各种异常情况,并确保锁的正确性和高效性。在实际生产环境中,还需要关注Redis集群的稳定性和高可用性,以及与其他系统的兼容性和互操作性。
2024-04-01 09:35:08
922
1
原创 Java面向对象
面向对象编程(Object-Oriented Programming,OOP)是一种编程范式,它将现实世界中的事物抽象成程序中的对象,通过对象之间的交互来实现程序功能。Java是一种面向对象的编程语言,它支持封装、继承和多态等特性。封装是将对象的属性和方法包装在一起的过程,它可以隐藏对象的内部实现细节,只暴露必要的接口给外部。总结:Java面向对象编程主要包括类和对象、封装、继承和多态等知识点。继承是一种创建新类的方式,新类可以继承现有类的属性和方法。在Java中,多态主要通过接口和抽象类来实现。
2024-03-31 22:00:30
405
1
原创 Java AQS
当锁被释放时,会调用releaseShared()方法,减少计数器,并根据计数器的值决定是否唤醒等待队列中的线程。当锁被释放时,会调用release()方法,将状态设置为0,并唤醒等待队列中的下一个线程。首先,AQS在独占模式下使用一个整型的volatile变量state来表示同步状态,该变量可以标识当前锁的状态——是否被某个线程持有。总结来说,AQS的独占模式通过一个状态变量和一个基于FIFO原则的等待队列来实现线程间的同步,确保了在任何时刻只有一个线程能够持有锁。共享模式下,允许多个线程同时持有锁。
2024-03-30 09:15:56
653
1
原创 Java反射
Java反射是指在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;总结:Java反射是一个强大且灵活的技术,但需要谨慎使用,避免影响程序的性能和可维护性。Java反射是Java语言中的一个特性,它允许程序在运行时获取类的信息、创建对象、调用方法等。通过Class对象,可以获取类的属性、方法和构造方法等信息。要使用Java反射,首先需要获取目标类的Class对象。三、Java反射的应用场景。四、Java反射的优缺点。一、什么是Java反射。
2024-03-29 11:23:01
412
1
原创 Java 8新特性
摘要:本文详细介绍了Java 8的新特性,包括Lambda表达式、Stream API、日期时间API、默认方法、Optional类、Base64编码和解码、并行数组操作等。通过实例分析,展示了这些新特性在简化代码、提高开发效率、优化性能方面的优势。Java 8带来了许多新特性,如Lambda表达式、Stream API、日期时间API等,这些特性使得Java编程更加简洁、高效。Java 8引入了全新的日期时间API(JSR 310),以解决旧日期时间API存在的问题。二、Stream API。
2024-03-28 16:33:19
386
原创 深入理解Java类加载机制与双亲委派模型
摘要:本文全面详细地介绍了Java类加载机制和双亲委派模型的工作原理,包括类加载器的层次结构、类加载过程、双亲委派模型的优势和不足以及如何打破双亲委派模型。本文全面详细地介绍了Java类加载机制和双亲委派模型,包括类加载器的层次结构、类加载过程、双亲委派模型的优势和不足以及如何打破双亲委派模型。如果没有加载,则将加载请求委派给父类加载器。在Java虚拟机(JVM)中,类加载器(ClassLoader)负责将.class文件或其他来源的Java类加载到JVM中,并在JVM中生成对应的Class对象。
2024-03-27 18:53:43
490
1
原创 Java集合之List
List接口的底层原理取决于具体的实现类。当向ArrayList中添加元素时,如果当前数组容量不足以容纳新元素,它会扩容为原来的1.5倍,并将原数组中的元素复制到新的数组中。而List则是Java集合框架中的一个重要接口,它继承了Collection接口,用于表示一个有序的集合(元素插入的顺序会被保留)。了解List的概念、实现类、底层原理以及代码实操,可以帮助我们更好地利用Java集合框架来处理有序集合的需求。List是集合框架中的一个接口,它表示一个有序的集合,即元素的插入顺序会被保留。
2024-03-26 09:03:43
363
原创 线程池(ThreadPool)
线程池是现代并发编程中不可或缺的工具,它通过减少资源消耗和提高响应速度,帮助开发者构建高性能的应用程序。正确使用线程池需要对其工作原理和关键概念有深入的理解,并根据具体的应用场景进行合理的配置。
2024-03-25 23:04:05
947
原创 Volatile
当一个变量在多线程环境中被多个线程访问和修改时,为了保证这个变量对所有线程的可见性,即当一个线程修改了变量值,其他线程能立即看到这个变化,我们通常会使用volatile关键字来修饰这个变量。此外,volatile还能在一定程度上保证有序性,禁止编译器对代码进行指令重排序,这样能保证代码的执行顺序符合预期。然而,需要注意的是,虽然volatile可以保证单个读操作和写操作的原子性,但它不能保证复合操作的原子性。例如,自增(++)操作实际上是由读取-修改-写入三步操作组成,而volatile。
2024-03-23 10:36:26
906
1
原创 ThreadLocal
这样,每个线程都可以独立地改变自己的副本,而不会影响其他线程的副本。ThreadLocalMap是一个定制化的哈希映射,它的键是ThreadLocal对象,值是线程局部变量。当我们调用ThreadLocal对象的set()方法时,实际上是在当前线程的ThreadLocalMap中添加或更新一个键值对;当我们调用get()方法时,实际上是从当前线程的ThreadLocalMap中获取对应的值。当线程执行完毕后,可以使用ThreadLocal对象的remove()方法删除当前线程的值,以避免内存泄漏。
2024-03-22 11:27:26
516
1
原创 Spring IOC 的概念和原理。
Spring IOC(Inversion of Control,控制反转)是一种设计原则,用于实现对象之间的解耦和模块之间的独立。IOC 的基本原理是通过将对象的创建、配置和管理交给一个外部容器(如 Spring 容器),而不是由对象本身来负责。这样可以实现对象之间的松耦合,提高代码的可维护性和可扩展性。
2024-03-21 16:05:18
893
3
原创 事务有哪些特性?
● 隔离性:数据库系统为每个事务都提供了一个独立的隔离区域,这样在进行事务操作的时候,其他的事务不能对其进行干扰。● 原子性:事务作为一个不可分割的工作单位,要么全部完成,要么全部不完成。● 一致性:在事务开始执行之前和执行期间,数据库的完整性没有被破坏,也就是事务在更新数据的时候要求数据是一个新的状态。● 持久性:一旦事务提交,其修改的结果就不能再被撤销,也就是说它对数据库中数据的改变是永久的。以上这些特性是所有数据库系统都应该遵循的基本原则,以确保数据的完整性和可靠性。
2024-01-14 21:22:38
386
1
原创 Redis线程模型
实际上,主要是指Redis的网络IO和键值对读写是由一个主线程顺序串行完成的。,更多情况下是受到内存大小和网络I/O的限制,所以 Redis 核心网络模型使用单线程并没有什么问题,如果你想要使用服务的多核CPU,可以在一台服务器上启动多个节点或者采用分片集群的方式。此外,Redis的持久化和异步删除等功能也是由额外的线程执行的。使用了单线程后,可维护性高,多线程模型虽然在某些方面表现优异,但是它却引入了程序执行顺序的不确定性,带来了并发读写的一系列问题,除了上面的官方回答,选择单线程的原因也有下面的考虑。
2024-01-11 19:43:39
351
原创 如何避免缓存雪崩、缓存击穿、缓存穿透?
这是当许多或者大部分的缓存在同一时间失效,导致大量的请求直接访问数据库。这种情况下的流量激增可能会给数据库带来极大的压力,甚至使其崩溃。这是与缓存穿透有些相似但又有所区别的情况。缓存击穿是指一个热点的key失效了,但这个key在数据库中有数据。当大量的并发请求都针对这个失效的key时,它们都无法从缓存中获取数据,因此全部打到了数据库上,导致数据库压力剧增。请求的数据既不在缓存中,也不在数据库中。这意味着每次这样的请求都会直接打到数据库上,造成不必要的压力。
2024-01-10 20:14:35
396
原创 Redis使用的过期删除策略是什么?
惰性删除是指在访问一个key时,会同时检查该key是否已过期,如果过期的话,就立即进行删除。这种策略的优点是可以保证获取到的一定是未过期的数据,但可能会存在一些过期数据一直未被删除的情况。具体流程如下:1. 当客户端发起对某个key的访问请求时,Redis会首先检查该key是否存在。2. 如果该key存在,Redis进一步判断该key是否已过期。3. 如果该key已过期,那么Redis会在此时删除这个key,并进行相应的内存释放。
2024-01-03 19:46:10
339
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人