04 2025 档案

摘要:二叉搜索树(Binary Search Tree,简称 BST)是一种特殊的二叉树,它满足以下性质: 每个节点最多有两个子节点,即左子节点和右子节点; 对于任意一个节点: 它的左子树中所有节点的值都小于该节点的值; 它的右子树中所有节点的值都大于该节点的值; 左右子树也分别是二叉搜索树。 阅读全文
posted @ 2025-04-30 23:00 kuki' 阅读(46) 评论(0) 推荐(0)
摘要:Spring Boot Starter 的作用是简化和加速项目的配置和依赖管理 Spring Boot Starter 可以理解为一种预配置的模块 它封装了特定功能的依赖项和配置,开发者只需引入相关的Starter 依赖,无需手动配置大量的参数和依赖项。 常用的启动器包括(pom.xml中) spr 阅读全文
posted @ 2025-04-30 19:10 kuki' 阅读(47) 评论(0) 推荐(0)
摘要:@SpringBootApplication 用于标识主应用程序类,通常位于项目的顶级包中。 这个注解包含了@Configuration、@EnableAutoConfiguration 和 @ComponentScan @Controller 用于标识类作为 Spring MVC 的Control 阅读全文
posted @ 2025-04-30 17:20 kuki' 阅读(28) 评论(0) 推荐(0)
摘要:Spring框架提供了很多注解,用于简化配置、管理Bean、处理事务、处理AOP等 @Componet: 用于将一个类标识为Spring容器中的一个组件(Bean) @Autowired 用于自动装配Bean。可以用在构造方法、Setter方法、字段上, Spring会自动查找匹配类型的Bean进行 阅读全文
posted @ 2025-04-30 16:00 kuki' 阅读(33) 评论(0) 推荐(0)
摘要:SpringBoot是用于简化Spring应用程序开发的框架。 提供快速启动的方式、自动配置和约定优于配置的原则, 简化了Spring应用的开发过程。 Spring Boot 提供了快速启动的能力 通过内嵌的服务器(如Tomcat、Jetty)等,可以将应用程序 打包成 一个 可执行的JAR 文件, 阅读全文
posted @ 2025-04-30 15:19 kuki' 阅读(38) 评论(0) 推荐(0)
摘要:用户发送请求至前端控制器 DispatcherServlet(调度员 Server applet小应用程序)。 DispatcherServlet收到请求调用HandlerMapping(驯狗师映射) 即处理映射器。 处理器映射器找到具体的处理器(可以根据注解、xml配置查找),生成处理器对象 及处 阅读全文
posted @ 2025-04-30 14:42 kuki' 阅读(19) 评论(0) 推荐(0)
摘要:1 Spring Spring是一个全面的 Java 企业级应用程序开发框架,提供了如下功能 依赖注入(DI)、 AOP(面向切面编程) 事务管理等 2 SpringMVC Spring MVC 是Spring中的一个很重要的模块、赋予Spring快速构建MVC架构的Web程序的能力。 MVC是模型 阅读全文
posted @ 2025-04-30 14:14 kuki' 阅读(31) 评论(0) 推荐(0)
摘要:String, StringBuilder, StringBuffer 都是Java中处理字符串的类。区别如下 1. 不可变性 1.1 String String内部的字符数组使用final修饰,为不可变的字符串类, 每当对String对象进行改变时,都会创建一个新的String对象,旧的Strin 阅读全文
posted @ 2025-04-28 18:59 kuki' 阅读(35) 评论(0) 推荐(0)
摘要:https://docs.spring.io/spring-kafka/api/org/springframework/kafka/annotation/KafkaHandler.html 1. @KafkaHandler 的背景和意义 在使用 Spring for Apache Kafka 时,为 阅读全文
posted @ 2025-04-28 11:29 kuki' 阅读(90) 评论(0) 推荐(0)
摘要:这段代码使用了 Spring Kafka 提供的注解方式,使得方法可以作为 Kafka 消费者自动监听指定主题的消息。下面详细解释各个部分: 1. @KafkaListener 注解 功能: @KafkaListener 注解告诉 Spring,该方法是一个 Kafka 消费者,用于接收并处理来自 阅读全文
posted @ 2025-04-27 22:23 kuki' 阅读(292) 评论(0) 推荐(0)
摘要:句法 XREAD [COUNT count] [BLOCK milliseconds] STREAMS key [key ...] id [id ...] 从一个或多个流中读取数据,仅返回 ID 大于调用者报告的最后一个接收 ID 的条目。此命令具有一个选项,用于在条目不可用时进行阻止,其方式类似于 阅读全文
posted @ 2025-04-27 12:48 kuki' 阅读(114) 评论(0) 推荐(0)
摘要:https://docs.spring.io/spring-data/redis/docs/current/api/org/springframework/data/redis/core/StreamOperations.html#read(org.springframework.data.redi 阅读全文
posted @ 2025-04-27 12:23 kuki' 阅读(62) 评论(0) 推荐(0)
摘要:https://docs.spring.io/spring-data/redis/docs/current/api/org/springframework/data/redis/core/RedisTemplate.html#opsForStream() opsForStream public <H 阅读全文
posted @ 2025-04-26 23:08 kuki' 阅读(30) 评论(0) 推荐(0)
摘要:Package org.springframework.data.redis.connection.stream Interface MapRecord<S,K,V> public interface MapRecord<S,K,V> S是stream, <K,V> 是固定的 extends Rec 阅读全文
posted @ 2025-04-26 22:42 kuki' 阅读(26) 评论(0) 推荐(0)
摘要:@SuppressWarnings("unchecked") 是 Java 中的一个注解,用于在编译时抑制与未检查的类型转换相关的警告信息。 Annotation Type SuppressWarnings public @interface SuppressWarnings 表示应在被注解的元素( 阅读全文
posted @ 2025-04-26 16:26 kuki' 阅读(393) 评论(0) 推荐(0)
摘要:send方法 public CompletableFuture<SendResult<K,V>> send(String topic, @Nullable V data) Description copied from interface: KafkaOperations 将数据发送到没有键或分区的 阅读全文
posted @ 2025-04-26 16:05 kuki' 阅读(122) 评论(0) 推荐(0)
摘要:https://docs.spring.io/spring-kafka/api/org/springframework/kafka/core/KafkaTemplate.html class KafkaTemplate<K,V> public class KafkaTemplate<K,V> ext 阅读全文
posted @ 2025-04-26 15:55 kuki' 阅读(16) 评论(0) 推荐(0)
摘要:产生死锁需要同时满足四个必要条件: 1 互斥条件(Mutual Exclusion): 资源不能被多个进程共享,即资源一次只能被一个进程使用。 如果一个资源已经被分配给了一个进程,其他进程必须等待,直到该资源被释放。 2 持有并等待条件(Hold and Wait): 一个进程已经持有了至少一个资源 阅读全文
posted @ 2025-04-25 14:38 kuki' 阅读(87) 评论(0) 推荐(0)
摘要:G1 在 JDK 1.7 时引入,在 JDK 9 时取代 CMS 成为默认的垃圾收集器。 G1 把 Java 堆划分为多个大小相等的独立区域Region,每个区域都可以扮演新生代或老年代的角色。 同时,G1 还有一个专门为大对象设计的 Region,叫 Humongous 区。 这种区域化管理使得 阅读全文
posted @ 2025-04-25 13:51 kuki' 阅读(40) 评论(0) 推荐(0)
摘要:JVM 的垃圾收集器主要分为两大类:分代收集器和分区收集器, 分代收集器的代表是 CMS, 分区收集器的代表是 G1 和 ZGC。 CMS CMS 是第一个关注 GC 停顿时间的垃圾收集器,JDK 1.5 时引入,JDK9 被标记弃用,JDK14 被移除。 G1 G1 在 JDK 1.7 时引入,在 阅读全文
posted @ 2025-04-25 13:42 kuki' 阅读(56) 评论(0) 推荐(0)
摘要:进程是一个正在执行的程序实例。每个进程都有自己独立的 地址空间、全局变量、堆栈、和文件描述符等资源。 线程是进程中的一个执行单元。一个进程可以包含多个线程, 它们共享进程的地址空间和资源。 每个进程在独立的地址空间中运行,不会直接影响其他进程。 线程共享同一个进程的内存空间、全局变量和文件描述符。 阅读全文
posted @ 2025-04-25 12:23 kuki' 阅读(27) 评论(0) 推荐(0)
摘要:1 之前的分布式锁toy存在以下问题 1.1 分布式锁不可重入: 不可重入是指同一线程不能重复获取同一把锁。 比如,方法A中调用方法B,方法A需要获取分布式锁,方法B同样需要获取分布式锁, 线程1进入方法A获取了一次锁,进入方法B又获取一次锁,由于锁不可重入,所以就会导致死锁 1.2 分布式锁不可重 阅读全文
posted @ 2025-04-23 18:44 kuki' 阅读(173) 评论(0) 推荐(0)
摘要:1 思路解析 用户 → seckillVoucher() ↓ [Redis Lua 脚本校验库存和下单资格] ↓ 通过? → 否:返回失败信息 ↓ 是:发送订单消息到 Kafka 后台 → Kafka 消费线程 ← 订单消息 ↓ 调用 createVoucherOrder() ↓ 更新数据库(扣减库 阅读全文
posted @ 2025-04-23 18:19 kuki' 阅读(479) 评论(0) 推荐(0)
摘要:此坑不补了,直接用redisson 阅读全文
posted @ 2025-04-23 17:39 kuki' 阅读(25) 评论(0) 推荐(0)
摘要:超时重传 其原理是在发送某个数据后开启一个计时器,如果在一定时间内没有得到发送数据报的 ACK 报文,就重新发送数据,直到发送成功为止。 重传包括超时重传、快速重传、带选择确认的重传(SACK)和重复 SACK 四种。 快速重传 TCP 还有另外⼀种快速重传(Fast Retransmit)机制,它 阅读全文
posted @ 2025-04-23 15:24 kuki' 阅读(27) 评论(0) 推荐(0)
摘要:②、序列号/确认机制: TCP 将数据分成多个小段,每段数据都有唯一的序列号,以确保数据包的顺序传输和完整性。同时,发送方如果没有收到接收方的确认应答,会重传数据。 ④、超时重传: 如果发送方发送的数据包超过了最大生存时间,接收方还没有收到,发送方会重传数据包以保证丢失数据重新传输。 阅读全文
posted @ 2025-04-23 14:50 kuki' 阅读(86) 评论(0) 推荐(0)
摘要:TCP 三次握手吗? TCP 首先通过三次握手和四次挥手来保证连接的可靠性 阅读全文
posted @ 2025-04-23 14:46 kuki' 阅读(19) 评论(0) 推荐(0)
摘要:TCP 是面向连接的,而 UDP 是无连接的。 阅读全文
posted @ 2025-04-23 14:41 kuki' 阅读(17) 评论(0) 推荐(0)
摘要:https://javabetter.cn/sidebar/sanfene/network.html#_25-tcp-握手为什么是三次-为什么不能是两次-不能是四次 为什么 TCP 握手不能是两次? 为了防止服务器一直等,等到黄花菜都凉了。 为了防止客户端已经失效的连接请求突然又传送到了服务器。 阅读全文
posted @ 2025-04-23 14:38 kuki' 阅读(30) 评论(0) 推荐(0)
摘要:①、第一次握手:SYN(最开始都是 CLOSE,之后服务器进入 LISTEN) 发起连接:客户端发送一个 TCP 报文段到服务器。这个报文段的头部中,SYN 位被设置为 1,表明这是一个连接请求。同时,客户端会随机选择一个序列号(Sequence Number),假设为 x,发送给服务器。 目的:客 阅读全文
posted @ 2025-04-23 14:27 kuki' 阅读(44) 评论(0) 推荐(0)
摘要:问题 那不同的业务,就是我们大家用不同的业务,可能会共用同一个RabbitMQ组件,不同的业务之间是怎么区分的?他这个消息是谁去消费的?就我发的消息,谁去消费,谁不消费? 回答Demo 在 RabbitMQ 中,不同业务之间的区分主要依赖于 Exchange(交换机)、Queue(队列) 和 Rou 阅读全文
posted @ 2025-04-23 13:41 kuki' 阅读(77) 评论(0) 推荐(0)
摘要:消息队列是什么 你可以把消息队列理解为一个使用队列来通信的组件。它的本质,就是个转发器,包含发消息、存消息、消费消息的过程。最简单的消息队列模型如下: 作用 ①、解耦 生产者将消息放入队列,消费者从队列中取出消息,这样一来,生产者和消费者之间就不需要直接通信,生产者只管生产消息,消费者只管消费消息, 阅读全文
posted @ 2025-04-23 13:21 kuki' 阅读(53) 评论(0) 推荐(0)
摘要:了解。Java 堆被划分为新生代和老年代两个区域。 新生代又被划分为 Eden 空间和两个 Survivor 空间(From 和 To)。 新创建的对象会被分配到 Eden 空间。当 Eden 区填满时,会触发一次 Minor GC,清除不再使用的对象。存活下来的对象会从 Eden 区移动到 Sur 阅读全文
posted @ 2025-04-23 13:06 kuki' 阅读(26) 评论(0) 推荐(0)
摘要:Java 通过可达性分析算法来判断一个对象是否还存活。 通过一组名为 “GC Roots” 的根对象,进行递归扫描,无法从根对象到达的对象就是“垃圾”,可以被回收。 这也是 G1、CMS 等主流垃圾收集器使用的主要算法。 什么是引用计数法? 每个对象有一个引用计数器,记录引用它的次数。当计数器为零时 阅读全文
posted @ 2025-04-23 12:55 kuki' 阅读(27) 评论(0) 推荐(0)
摘要:垃圾回收是什么 垃圾回收就是对内存堆中已经死亡的或者长时间没有使用的对象进行清除或回收。 JVM 在做 GC 之前,会先搞清楚什么是垃圾,什么不是垃圾,通常会通过可达性分析算法来判断对象是否存活。 Java 的垃圾回收过程主要分为 标记存活对象、 清除无用对象、 以及内存压缩/整理三个阶段。 不同的 阅读全文
posted @ 2025-04-23 12:50 kuki' 阅读(18) 评论(0) 推荐(0)
摘要:导致原因 ThreadLocalMap 的 Key 是 弱引用,但 Value 是强引用。 如果一个线程一直在运行,并且 value 一直指向某个强引用对象,那么这个对象就不会被回收,从而导致内存泄漏。 怎么解决 很简单,使用完 ThreadLocal 后,及时调用 remove() 方法释放内存空 阅读全文
posted @ 2025-04-23 12:41 kuki' 阅读(27) 评论(0) 推荐(0)
摘要:强引用 我先说一下强引用,比如 User user = new User("沉默王二") 中,user 就是一个强引用,new User("沉默王二") 就是强引用对象。 当 user 被置为 null 时(user = null),new User("沉默王二") 对象就会被垃圾回收;否则即便是内 阅读全文
posted @ 2025-04-23 12:22 kuki' 阅读(28) 评论(0) 推荐(0)
摘要:1 问题 对ThreadLocal怎么理解的,它有哪些特性?又有哪些需要注意的地方。 为什么会有内存泄漏 2 ThreadLocal 是什么? ThreadLocal 是一种用于实现线程局部变量的工具类。 它允许每个线程都拥有自己的独立副本,从而实现线程隔离。 使用 ThreadLocal 通常分为 阅读全文
posted @ 2025-04-23 11:13 kuki' 阅读(26) 评论(0) 推荐(0)
摘要:动态代理是什么? Java的动态代理是一种 在运行时动态创建代理对象的机制, 主要用于在不修改原始类的情况下 对方法调用进行拦截和增强。 Java动态代理主要分为两种类型: 基于接口的代理(JDK动态代理): 这种类型的代理要求目标对象必须实现至少一个接口。 Java动态代理会创建一个实现了相同接口 阅读全文
posted @ 2025-04-22 21:31 kuki' 阅读(34) 评论(0) 推荐(0)
摘要:@Transactional 的作用范围方法: https://javaguide.cn/system-design/framework/spring/spring-transaction.html#transactional-注解使用详解 方法:推荐将注解使用于方法上,不过需要注意的是:该注解只能 阅读全文
posted @ 2025-04-22 20:37 kuki' 阅读(60) 评论(0) 推荐(0)
摘要:分析 左移1,导致扩容2倍 源码解析 1. 初始变量设置与容量计算 Node<K,V>[] oldTab = table; int oldCap = (oldTab == null) ? 0 : oldTab.length; int oldThr = threshold; int newCap, n 阅读全文
posted @ 2025-04-22 14:39 kuki' 阅读(70) 评论(0) 推荐(0)
摘要:结构 JDK 8 中 HashMap 的数据结构是数组+链表+红黑树。 红黑树节点个数<6,转回链表 链表过长时,查询效率会比较低,于是当链表的长度超过 8 时(且数组的长度大于 64),链表就会转换为红黑树。 扩容2倍,负载因子 如果键值对的数量(size)/ 数组的长度,大于负载因子(默认0.7 阅读全文
posted @ 2025-04-22 11:02 kuki' 阅读(42) 评论(0) 推荐(0)
摘要:1 问题 像性能池对吧?一般一个性能池的一个正常工作原理是什么样的? 它里面有哪些核心的参数呢?这些参数是怎么配合做工作的呢? 2 第一种回答 任务提交 → 核心线程执行 → 任务队列缓存 → 非核心线程执行 → 拒绝策略处理。 第一步,线程池通过 submit() 提交任务。 ExecutorSe 阅读全文
posted @ 2025-04-21 20:13 kuki' 阅读(13) 评论(0) 推荐(0)
摘要:https://www.w3ccoo.com/javalang/java_lang_thread.html void join() 等待此线程终止。 当调用 t1.join() 和 t2.join() 时,主线程会阻塞,直到 t1 和 t2 分别执行完毕。 static void yield() 该 阅读全文
posted @ 2025-04-21 17:57 kuki' 阅读(21) 评论(0) 推荐(0)
摘要:线程创建方式,都是实现接口 但是Runnable,要实现run()方法,并将实现类传递给Thread的构造方法 而Callable是实现call()方法,然后创建FutureTask对象(参数为Callable的实现类),然后用FutureTask对象作参数创建Thread对象。 优点是获取线程的执 阅读全文
posted @ 2025-04-21 17:41 kuki' 阅读(15) 评论(0) 推荐(0)
摘要:问题 多线程的场景,线程这块你平常用的多么,那像线程,比如说如果是去实现一个线程,对吧,有哪些方法? 回答 https://javabetter.cn/sidebar/sanfene/javathread.html#🌟2-说说进程和线程的区别 有三种,分别是继承 Thread 类、实现 Runna 阅读全文
posted @ 2025-04-21 17:33 kuki' 阅读(26) 评论(0) 推荐(0)
摘要:Zset 类型的底层数据结构是由压缩列表(已放弃)或跳表实现的: 跳表是有序集合 Zset 的底层实现之⼀。 在 Redis 7.0 之前, 如果有序集合的元素个数小于 128 个,并且每个元素的值小于 64 字节时,Redis 会使用压缩列表作为 Zset 的底层实现, 否则会使用跳表; 在 Re 阅读全文
posted @ 2025-04-20 20:57 kuki' 阅读(78) 评论(0) 推荐(0)
摘要:Redis 有五种基本数据类型,这五种数据类型分别是:string(字符串)、hash(哈希)、list(列表)、set(集合)、sorted set(有序集合,也叫 zset)。 string 字符串是最基础的数据类型,key 是一个字符串,不用多说,value 可以是: 字符串(简单的字符串、复 阅读全文
posted @ 2025-04-20 15:25 kuki' 阅读(39) 评论(0) 推荐(0)
摘要:字段注入是一种依赖注入(Dependency Injection)的方式, 其中依赖对象直接通过在类的字段(成员变量)上加注解(例如 @Autowired、@Resource 或 @Inject)来注入,而不需要通过构造器或 setter 方法将依赖对象传入。具体说明如下: 工作原理 注解标记字段: 阅读全文
posted @ 2025-04-20 15:21 kuki' 阅读(59) 评论(0) 推荐(0)
摘要:问题 比如说像用Spring Boot,涉及到ioc,依赖反转,就注入的这一块。一般在写代码的时候,怎么样去做Bean注入的。 比如说我用Spring框架,我做Bean注入,你在代码里,就是本身框架有哪些可以实现一个Bean注入。 @Resource是Spring提供的么,还是Java自带的,JDK 阅读全文
posted @ 2025-04-20 15:19 kuki' 阅读(65) 评论(0) 推荐(0)
摘要:问题 做拦截,基于http比如基于那个servelet里面做filter,还是信息上报像springboot,现在这个你想去实现可以用什么方式去实现? 因为通过拦截http请求,http的一些web框架去做的。 如果只是单纯记录一些比如业务信息,这个地方还可以什么方式做么? 这里你想要拿到服务调用参 阅读全文
posted @ 2025-04-20 12:54 kuki' 阅读(43) 评论(0) 推荐(0)
摘要:在 MyBatis 等框架中,常见的两种占位符形式为 #{} 和 ${}。两者的差别主要在于它们处理传入参数的方式,从而直接影响了 SQL 注入风险。以下是详细说明: 1. 占位符工作机制 #{} 占位符 比如,在 MyBatis 中,使用#{}占位符来代替直接拼接 SQL 语句,MyBatis 会 阅读全文
posted @ 2025-04-19 20:18 kuki' 阅读(69) 评论(0) 推荐(0)
摘要:字段映射逻辑是指 在后端预先定义一个“白名单”或映射表, 将前端传入的字段名称与实际数据库中的字段名称建立安全且固定的对应关系, 而不是将前端传入的原始字符串直接拼接到 SQL 语句中,从而避免 SQL 注入漏洞。 1. 问题背景 通常,数据库的字段名称应由后端来控制,保证只能操作预定义的字段。若前 阅读全文
posted @ 2025-04-19 18:42 kuki' 阅读(91) 评论(0) 推荐(0)
摘要:SQL 注入漏洞 的定义 如果ORM框架在执行SQL操作时没有正确过滤或转义用户输入, 攻击者可以利用输入的恶意数据来执行未经授权的数据库操作,从而造成数据泄露、损坏或篡改。 什么情况下会引起 SQL 注入攻击呢?通常是在以下情况: 表结构部分:通常包含表字段、表名等固定内容。 表字段参数/变量部分 阅读全文
posted @ 2025-04-19 10:36 kuki' 阅读(42) 评论(0) 推荐(0)
摘要:摘录自 https://blog.csdn.net/u012060033/article/details/108442434 1 ibatis基础 iBatis 是一个持久层框架。 在Apache寄居六年之后,iBatis将代码托管到Google Code。于此同时,iBatis 更名为 MyBat 阅读全文
posted @ 2025-04-18 23:50 kuki' 阅读(261) 评论(0) 推荐(0)
摘要:iBatis和MyBatis两者之间有什么差异? SQL写在XML文件,一般如何做安全性上的一些防范。 写了一个SQL,变量不是用变量做替换,怎么防止外面的黑客做攻击,比如写SQL的时候,做替换,有没有留意一些SQL可能要防范攻击的,针对这个SQL的安全漏洞的注入。比如像MyBatis和IBatis 阅读全文
posted @ 2025-04-18 20:52 kuki' 阅读(7) 评论(0) 推荐(0)
摘要:1 单体synchronized的缺陷 synchronized是JVM内部锁 两者都进入了锁的内部,这个synchronized锁形同虚设,这是由于synchronized是本地锁,只能提供线程级别的同步,每个JVM中都有一把synchronized锁,不能跨 JVM 进行上锁,当一个线程进入被 阅读全文
posted @ 2025-04-15 17:00 kuki' 阅读(83) 评论(0) 推荐(0)
摘要:ArrayList ArrayList() 此构造函数用于创建一个初始容量足以容纳 10 个元素的空列表。 boolean add(E e) 此方法将指定元素附加到此列表的末尾。 E remove(int index) 此方法删除此列表中指定位置的元素。 阅读全文
posted @ 2025-04-15 16:54 kuki' 阅读(23) 评论(0) 推荐(0)
摘要:java.lang.string https://docs.oracle.com/javase/8/docs/api/java/lang/String.html#intern-- intern public String intern() 返回字符串对象的规范表示。 Returns a canoni 阅读全文
posted @ 2025-04-15 15:35 kuki' 阅读(43) 评论(0) 推荐(0)
摘要:https://docs.oracle.com/javase/tutorial/essential/concurrency/locksync.html Another way to create synchronized code is with synchronized statements. U 阅读全文
posted @ 2025-04-15 15:20 kuki' 阅读(18) 评论(0) 推荐(0)
摘要:https://baomidou.com/guides/wrapper/#示例-3 gt gt 方法是 MyBatis-Plus 中用于构建查询条件的基本方法之一,它用于设置单个字段的大于条件。 使用范围 QueryWrapper LambdaQueryWrapper UpdateWrapper L 阅读全文
posted @ 2025-04-15 14:47 kuki' 阅读(46) 评论(0) 推荐(0)
摘要:https://baomidou.com/guides/data-interface/#count count // 查询总记录数 int count(); // 根据 Wrapper 条件,查询总记录数 int count(Wrapper<T> queryWrapper); //自3.4.3.2开 阅读全文
posted @ 2025-04-15 14:40 kuki' 阅读(22) 评论(0) 推荐(0)
摘要:解决一人一单的逻辑 乐观锁 乐观锁需要判断数据是否修改,而当前是判断当前是否存在,所以无法像解决库存超卖一样使用CAS机制, 但是可以使用版本号法,但是版本号法需要新增一个字段, 悲观锁 所以这里为了方便,就直接演示使用悲观锁解决超卖问题 加悲观锁的逻辑 1. 使用Mybatis-Plus判断各种字 阅读全文
posted @ 2025-04-15 13:03 kuki' 阅读(145) 评论(0) 推荐(0)
摘要:boolean flag = seckillVoucherService.update( new LambdaUpdateWrapper<SeckillVoucher>() .eq(SeckillVoucher::getVoucherId, voucherId) .eq(SeckillVoucher 阅读全文
posted @ 2025-04-15 12:48 kuki' 阅读(72) 评论(0) 推荐(0)
摘要:涉及的表 tb_voucher:优惠券的基本信息,优惠金额、使用规则等 tb_seckill_voucher:优惠券的库存、开始抢购时间,结束抢购时间。特价优惠券才需要填写这些信息 voucher_id 主键 关联的优惠券... stock 库存 create time 创建时间 begin tim 阅读全文
posted @ 2025-04-15 12:38 kuki' 阅读(112) 评论(0) 推荐(0)
摘要:save // 插入一条记录(选择字段,策略插入) boolean save(T entity); // 插入(批量) boolean saveBatch(Collection<T> entityList); // 插入(批量) boolean saveBatch(Collection<T> ent 阅读全文
posted @ 2025-04-15 12:38 kuki' 阅读(20) 评论(0) 推荐(0)
摘要:setSql setSql 方法是 MyBatis-Plus 中用于构建更新操作的高级方法之一,它允许你直接设置更新语句中的 SET 部分 SQL。通过调用 setSql 方法,可以将一个自定义的 SQL 片段作为 SET 子句添加到更新语句中。 使用范围 UpdateWrapper LambdaU 阅读全文
posted @ 2025-04-15 12:27 kuki' 阅读(120) 评论(0) 推荐(0)
摘要:条件构造器 eq eq 方法是 MyBatis-Plus 中用于构建查询条件的基本方法之一,它用于设置单个字段的相等条件。 使用范围 QueryWrapper LambdaQueryWrapper UpdateWrapper LambdaUpdateWrapper 方法签名 // 设置指定字段的相等 阅读全文
posted @ 2025-04-15 12:25 kuki' 阅读(20) 评论(0) 推荐(0)
摘要:Lambda Wrapper (LambdaUpdateWrapper): 包装 LambdaUpdateWrapper<User> lambdaUpdateWrapper = new LambdaUpdateWrapper<>(); lambdaUpdateWrapper.set(User::ge 阅读全文
posted @ 2025-04-15 12:21 kuki' 阅读(43) 评论(0) 推荐(0)
摘要:Service Interface IService 是 MyBatis-Plus 提供的一个通用 Service 层接口,它封装了常见的 CRUD 操作,包括插入、删除、查询和分页等。通过继承 IService 接口,可以快速实现对数据库的基本操作,同时保持代码的简洁性和可维护性。 IServic 阅读全文
posted @ 2025-04-15 12:21 kuki' 阅读(110) 评论(0) 推荐(0)
摘要:@RestController 注解 这是一个组合注解,结合了 @Controller 和 @ResponseBody 的功能。 它表明该类是一个控制器,其中的每个方法的返回值都会直接作为 HTTP 响应的主体内容。 阅读全文
posted @ 2025-04-14 10:32 kuki' 阅读(21) 评论(0) 推荐(0)
摘要:SISMEMBER SISMEMBER key member Returns if member is a member of the set stored at key. INCRBY INCRBY key increment 将存储在 key 中的数字增加 increment 值。如果 key 阅读全文
posted @ 2025-04-14 10:32 kuki' 阅读(39) 评论(0) 推荐(0)
摘要:文档地址 https://www.runoob.com/lua/lua-variables.html lua的一些语法 local就是局部变量 key [key ...]: 从 EVAL 的第三个参数开始算起,表示在脚本中所用到的那些 Redis 键(key),这些键名参数可以在 Lua 中通过全局 阅读全文
posted @ 2025-04-14 10:21 kuki' 阅读(62) 评论(0) 推荐(0)
摘要:文档地址 https://docs.oracle.com/javase/8/docs/api/java/lang/Long.html#intValue-- intValue public int intValue() Returns the value of this Long as an int 阅读全文
posted @ 2025-04-13 20:13 kuki' 阅读(24) 评论(0) 推荐(0)
摘要:文档地址 https://docs.spring.io/spring-data/redis/docs/current/api/org/springframework/data/redis/core/RedisTemplate.html#execute(org.springframework.data 阅读全文
posted @ 2025-04-13 20:01 kuki' 阅读(67) 评论(0) 推荐(0)
摘要:文档地址 https://guava.dev/releases/snapshot-jre/api/docs/com/google/common/util/concurrent/RateLimiter.html Class RateLimiter java.lang.Object com.google 阅读全文
posted @ 2025-04-13 19:31 kuki' 阅读(193) 评论(0) 推荐(0)
摘要:文档地址 https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/core/io/ClassPathResource.html Package org.springframework.c 阅读全文
posted @ 2025-04-13 19:03 kuki' 阅读(48) 评论(0) 推荐(0)
摘要:文档地址 https://docs.spring.io/spring-data/redis/docs/current/api/org/springframework/data/redis/core/script/DefaultRedisScript.html Package org.springfr 阅读全文
posted @ 2025-04-13 18:51 kuki' 阅读(69) 评论(0) 推荐(0)
摘要:1 Redis实现的Demo分布式锁的问题 分布式锁不可重入: 不可重入是指同一线程不能重复获取同一把锁。 比如,方法A中调用方法B,方法A需要获取分布式锁,方法B同样需要获取分布式锁,线程1进入方法A获取了一次锁,进入方法B又获取一次锁,由于锁不可重入,所以就会导致死锁 分布式锁不可重试: 获取锁 阅读全文
posted @ 2025-04-13 13:48 kuki' 阅读(152) 评论(0) 推荐(0)
摘要:1 原理:setnx指令 setnx指令的特点:setnx只能设置key不存在的值,值不存在设置成功,返回 1 ;值存在设置失败,返回 0 文档地址 https://redis.io/docs/latest/commands/setnx/ 如果键不存在,则将键设置为保存字符串值。在这种情况下,它相当 阅读全文
posted @ 2025-04-13 12:58 kuki' 阅读(98) 评论(0) 推荐(0)
摘要:什么是缓存穿透 缓存穿透是指客户端请求的数据在缓存中和数据库中都不存在, 这样缓存永远不会生效,这些请求都会打到数据库。 shop实体对应的数据库中表tb_shop 字段有 id name type等 typeid(有索引) public Shop querywithchuantou(Long id 阅读全文
posted @ 2025-04-12 23:06 kuki' 阅读(70) 评论(0) 推荐(0)
摘要:什么是缓存击穿 缓存击穿问题也叫热点Key问题, 就是一个被高并发访问并且缓存重建业务较复杂的key突然失效了, 无数的请求访问会在瞬间给数据库带来巨大的冲击。 店铺查询 + 互斥锁的逻辑图 public Shop querywithjichuan_mutex(Long id) 逻辑 1. 先根据k 阅读全文
posted @ 2025-04-12 22:51 kuki' 阅读(159) 评论(0) 推荐(0)
摘要:文档地址 https://plus.hutool.cn/apidocs/ Class JSONUtil public class JSONUtil extends Object JSON工具类 toBean public static T toBean(JSONObject json, Class 阅读全文
posted @ 2025-04-12 22:29 kuki' 阅读(578) 评论(0) 推荐(0)
摘要:<img src="https://img2024.cnblogs.com/blog/3214105/202504/3214105-20250412203844206-1650968827.png" width="300" style="display: block; margin: auto;" 阅读全文
posted @ 2025-04-12 20:41 kuki' 阅读(10) 评论(0) 推荐(0)
摘要:整体思路:更新数据时更新数据库并删除缓存,查询时更新缓存,无效写操作较少 public Result update(Shop shop)的逻辑 写在前面 shop.getId() 的调用依赖于 Shop 类中存在名为 id 的字段。如果 Shop 类使用了 Lombok 的 @Data 注解,并且包 阅读全文
posted @ 2025-04-12 20:14 kuki' 阅读(45) 评论(0) 推荐(0)
摘要:文档地址 https://baomidou.com/guides/data-interface/#update 简介 updateById(shop) 是 MyBatis-Plus 提供的一个便捷方法,用于根据实体对象的主键 ID 更新对应的数据库记录。 为什么传入 shop 就可以? 在 MyBa 阅读全文
posted @ 2025-04-12 20:08 kuki' 阅读(447) 评论(0) 推荐(0)
摘要:文档地址 https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/web/servlet/config/annotation/InterceptorRegistration.html C 阅读全文
posted @ 2025-04-12 18:38 kuki' 阅读(26) 评论(0) 推荐(0)
摘要:文档地址 https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/web/servlet/config/annotation/InterceptorRegistry.html Class 阅读全文
posted @ 2025-04-12 18:36 kuki' 阅读(82) 评论(0) 推荐(0)
摘要:文档地址 https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/web/servlet/config/annotation/WebMvcConfigurer.html Interfac 阅读全文
posted @ 2025-04-12 18:30 kuki' 阅读(23) 评论(0) 推荐(0)
摘要:1. 将python 重定向到python3 注意python3的路径以你自己的为准 sudo ln -s /usr/bin/python3 /usr/local/bin/python 查看python3的命令 which python3 2. 修改zsh中的path 执行 vim ~/.zshrc 阅读全文
posted @ 2025-04-12 18:24 kuki' 阅读(154) 评论(0) 推荐(0)
摘要:RefreshTokenInterceptor的优先级设置为0,最高 LoginInterceptor @Configuration /** * @Configuration 注解 * @Configuration:标识该类是一个配置类,Spring 在启动时会自动加载并应用其中的配置。 */ pu 阅读全文
posted @ 2025-04-12 17:41 kuki' 阅读(96) 评论(0) 推荐(0)
摘要:逻辑 下图第二个拦截器 preHandle 查询当前线程的ThreadLocal中的userDTO信息,有则放行 否则返回401未授权 afterCompletion 销毁ThreadLocal public class LoginInterceptor implements HandlerInte 阅读全文
posted @ 2025-04-12 17:36 kuki' 阅读(123) 评论(0) 推荐(0)
摘要:在 RefreshTokenInterceptor 中使用 ThreadLocal(通过 UserHolder.saveUser(userDTO))的主要目的是在一次 HTTP 请求的整个处理过程中,方便地在各个组件中访问当前用户的信息,而无需显式地传递用户对象。 🧩 为什么使用 ThreadLo 阅读全文
posted @ 2025-04-12 17:23 kuki' 阅读(65) 评论(0) 推荐(0)
摘要:文档地址 https://docs.oracle.com/javase/8/docs/api/java/lang/ThreadLocal.html Class ThreadLocal public class ThreadLocal extends Object 此类提供线程局部变量。这些变量与普通 阅读全文
posted @ 2025-04-12 16:39 kuki' 阅读(35) 评论(0) 推荐(0)
摘要:逻辑步骤 preHandle()方法 1. 获取request中的token String token = request.getHeader("authorization"); 2. token非空,则基于token获取Redis(Hash数据结构)中的userMap即用户数据 key为"logi 阅读全文
posted @ 2025-04-12 16:21 kuki' 阅读(84) 评论(0) 推荐(0)
摘要:文档地址 https://plus.hutool.cn/apidocs/ fillBeanWithMap public static T fillBeanWithMap(Map map, T bean, boolean isIgnoreError) 使用Map填充Bean对象 Type Parame 阅读全文
posted @ 2025-04-12 16:17 kuki' 阅读(79) 评论(0) 推荐(0)
摘要:文档地址 https://docs.spring.io/spring-data/redis/docs/current/api/org/springframework/data/redis/core/HashOperations.html#entries(H) entries Map<HK,HV> e 阅读全文
posted @ 2025-04-12 16:12 kuki' 阅读(23) 评论(0) 推荐(0)
摘要:文档地址 https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/web/servlet/HandlerInterceptor.html preHandle default boolea 阅读全文
posted @ 2025-04-12 15:54 kuki' 阅读(73) 评论(0) 推荐(0)
摘要:文档地址 https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/web/servlet/HandlerInterceptor.html Interface HandlerInterce 阅读全文
posted @ 2025-04-12 15:49 kuki' 阅读(63) 评论(0) 推荐(0)
摘要:login逻辑 1. 输入邮箱 + 验证码,校验邮箱格式 接受的输入为 邮箱: phone 用户输入的验证码:code 这里只用工具类检查邮箱格式(仅判空) 2. 检查验证码是否一致 1.从Redis中取出key"login:code:"+phone对应的value(字符串)。 String Cac 阅读全文
posted @ 2025-04-12 14:49 kuki' 阅读(73) 评论(0) 推荐(0)
摘要:文档地址 https://docs.spring.io/spring-data/redis/docs/current/api/org/springframework/data/redis/core/RedisTemplate.html#delete(java.util.Collection) del 阅读全文
posted @ 2025-04-12 14:42 kuki' 阅读(39) 评论(0) 推荐(0)
摘要:文档地址 https://docs.spring.io/spring-data/redis/docs/current/api/org/springframework/data/redis/core/HashOperations.html#putAll(H,java.util.Map) putAll 阅读全文
posted @ 2025-04-12 14:16 kuki' 阅读(30) 评论(0) 推荐(0)
摘要:文档地址 https://docs.spring.io/spring-data/redis/docs/current/api/org/springframework/data/redis/core/RedisTemplate.html#opsForHash() opsForHash public < 阅读全文
posted @ 2025-04-12 14:09 kuki' 阅读(30) 评论(0) 推荐(0)
摘要:文档地址 https://plus.hutool.cn/apidocs/ Class BeanUtil public class BeanUtil extends Object Bean工具类 把一个拥有对属性进行set和get方法的类,我们就可以称之为JavaBean。 copyPropertie 阅读全文
posted @ 2025-04-12 13:47 kuki' 阅读(537) 评论(0) 推荐(0)
摘要:文档地址 https://plus.hutool.cn/apidocs/ Class UUID public class UUID extends Object implements Serializable, Comparable 提供通用唯一识别码(universally unique iden 阅读全文
posted @ 2025-04-12 13:26 kuki' 阅读(297) 评论(0) 推荐(0)
摘要:代码: String token = UUID.randomUUID().toString(); 用于生成一个全局唯一的字符串标识符(UUID),并将其赋值给变量 token。 详细解析 UUID.randomUUID() 这是 hutool工具类 提供的静态方法,用于生成一个类型为 4 的 UUI 阅读全文
posted @ 2025-04-12 13:22 kuki' 阅读(297) 评论(0) 推荐(0)
摘要:条件构造器的方法 eq eq 方法是 MyBatis-Plus 中用于构建查询条件的基本方法之一,它用于设置单个字段的相等条件。 使用范围 QueryWrapper LambdaQueryWrapper UpdateWrapper LambdaUpdateWrapper 方法签名 // 设置指定字段 阅读全文
posted @ 2025-04-12 11:17 kuki' 阅读(351) 评论(0) 推荐(0)
摘要:MyBatis-Plus文档地址 https://baomidou.com/guides/data-interface/#使用步骤 持久层接口 query 提供链式查询操作,可以连续调用方法来构建查询条件。 // 链式查询 普通 QueryChainWrapper<T> query(); // 链式 阅读全文
posted @ 2025-04-12 11:12 kuki' 阅读(121) 评论(0) 推荐(0)
摘要:在 MyBatis-Plus 中, User user = query().eq("phone", phone).one(); 创建一个查询条件,指定字段 phone 等于变量 phone 的值,然后执行查询,返回符合条件的单个 User 对象。 逐部分解释 query():这是在 IService 阅读全文
posted @ 2025-04-12 11:05 kuki' 阅读(130) 评论(0) 推荐(0)
摘要:在 Java 中,Boolean 是一个包装类,它可以为 null,而基本类型 boolean 则不能。因此,在进行布尔值判断时,必须首先检查对象是否为 null,以避免在解包时抛出 NullPointerException。 在代码中: if (oneLevelLimit != null && o 阅读全文
posted @ 2025-04-12 00:00 kuki' 阅读(32) 评论(0) 推荐(0)
摘要:sendCode逻辑 1. 一级限制(5分钟内禁止发送验证码)检查 借助isMember判断value "1"是否在key "limit:onelevel:"+phone对应的Set中 返回true,则存在一级限制 2. 二级限制(20分钟内禁止发送验证码)检查 借助isMember判断value 阅读全文
posted @ 2025-04-11 23:59 kuki' 阅读(122) 评论(0) 推荐(0)
摘要:文档地址 https://docs.spring.io/spring-data/redis/docs/current/api/org/springframework/data/redis/core/ZSetOperations.html#add(K,V,double) ZSetOperations. 阅读全文
posted @ 2025-04-11 20:53 kuki' 阅读(37) 评论(0) 推荐(0)
摘要:文档地址 https://docs.spring.io/spring-data/redis/docs/current/api/org/springframework/data/redis/core/ValueOperations.html#set(K,V) set void set(K key, V 阅读全文
posted @ 2025-04-11 20:45 kuki' 阅读(53) 评论(0) 推荐(0)
摘要:文档地址 https://docs.spring.io/spring-data/redis/docs/current/api/org/springframework/data/redis/core/RedisTemplate.html#expire(K,long,java.util.concurre 阅读全文
posted @ 2025-04-11 20:37 kuki' 阅读(113) 评论(0) 推荐(0)
摘要:文档地址 https://docs.spring.io/spring-data/redis/docs/current/api/org/springframework/data/redis/core/SetOperations.html#add(K,V...) add @Nullable Long a 阅读全文
posted @ 2025-04-11 20:02 kuki' 阅读(34) 评论(0) 推荐(0)
摘要:文档地址 https://docs.spring.io/spring-data/redis/docs/current/api/org/springframework/data/redis/core/ZSetOperations.html#count(K,double,double) count方法 阅读全文
posted @ 2025-04-11 15:01 kuki' 阅读(30) 评论(0) 推荐(0)
摘要:文档地址 https://docs.spring.io/spring-data/redis/docs/current/api/org/springframework/data/redis/core/RedisTemplate.html#opsForZSet() 文档 opsForZSet() pub 阅读全文
posted @ 2025-04-11 14:57 kuki' 阅读(66) 评论(0) 推荐(0)
摘要:文档地址 https://docs.spring.io/spring-data/redis/docs/current/api/org/springframework/data/redis/core/RedisTemplate.html Class RedisTemplate<K,V> Type Pa 阅读全文
posted @ 2025-04-11 14:46 kuki' 阅读(29) 评论(0) 推荐(0)
摘要:文档地址 https://docs.spring.io/spring-data/redis/docs/current/api/org/springframework/data/redis/core/StringRedisTemplate.html StringRedisTemplate 文档介绍 p 阅读全文
posted @ 2025-04-11 14:42 kuki' 阅读(24) 评论(0) 推荐(0)
摘要:Spring文档 https://docs.spring.io/spring-data/redis/docs/current/api/org/springframework/data/redis/core/SetOperations.html#isMember(K,java.lang.Object) 阅读全文
posted @ 2025-04-11 14:20 kuki' 阅读(71) 评论(0) 推荐(0)
摘要:Spring文档 https://docs.spring.io/spring-data/redis/docs/current/api/org/springframework/data/redis/core/RedisTemplate.html#opsForSet() opsForSet() 返回一个 阅读全文
posted @ 2025-04-11 14:11 kuki' 阅读(31) 评论(0) 推荐(0)
摘要:思路 发送手机号 校验手机号合法与否 符合,则生成验证码 验证码保存到session 发送验证码 代码实现 // 发短信 @Override public Result sendCode(String phone, HttpSession session) throws MessagingExcep 阅读全文
posted @ 2025-04-11 14:02 kuki' 阅读(76) 评论(0) 推荐(0)
摘要:总体逻辑图 发送短信验证码 输入手机号 校验手机号 若符合,则生成验证码,保存验证码到session 发送验证码 短信验证码登录、注册 提交手机号和验证码 校验验证码 一致则,根据手机号查询用户 用户不存在,则创建新用户,保存到数据库,保存用户到session 用户存在,保存用户到session 校 阅读全文
posted @ 2025-04-11 13:23 kuki' 阅读(21) 评论(0) 推荐(0)
摘要:分布式锁的定义 分布式锁:满足分布式系统或集群模式下多进程可见并且互斥的锁 前面sychronized锁失效的原因是 原本,由于每一个JVM都有一个独立的锁监视器,用于监视当前JVM中的sychronized锁,所以无法保障多个集群下只有一个线程访问一个代码块。 所以直接将使用一个分布锁,在整个系统 阅读全文
posted @ 2025-04-10 17:26 kuki' 阅读(39) 评论(0) 推荐(0)
摘要:单体解决一人一单的问题 如上图,两个JVM,多个锁监视器。有问题 出现的问题 两者都进入了锁的内部,这个synchronized锁形同虚设, 这是由于synchronized是本地锁,只能提供线程级别的同步,每个JVM中都有一把synchronized锁,不能跨 JVM 进行上锁, 当一个线程进入被 阅读全文
posted @ 2025-04-10 16:26 kuki' 阅读(22) 评论(0) 推荐(0)
摘要:1 基础版逻辑图 2 上图存在的问题 问题原因:出现这个问题的原因和前面库存为负数数的情况是一样的。 线程1查询当前用户是否有订单,当前用户没有订单准备下单, 此时线程2也查询当前用户是否有订单,由于线程1还没有完成下单操作,线程2同样发现当前用户未下单,也准备下单, 这样明明一个用户只能下一单,结 阅读全文
posted @ 2025-04-10 16:21 kuki' 阅读(61) 评论(0) 推荐(0)
摘要:版本号法 为 tb_seckill_voucher 表新增一个版本号字段 version 线程1查询完库存,在进行库存扣减操作的同时将版本号+1, 线程2在查询库存时,同时查询出当前的版本号, 发现库存充足,也准备执行库存扣减操作,但是需要判断当前的版本号是否是之前查询时的版本号, 结果发现版本号发 阅读全文
posted @ 2025-04-10 15:33 kuki' 阅读(56) 评论(0) 推荐(0)
摘要:定义 CAS(Compare and Swap)是一种并发编程中常用的原子操作,用于解决多线程环境下的数据竞争问题。 它是乐观锁算法的一种实现方式。 CAS操作包含三个参数: 内存地址V、 旧的预期值A和 新的值B。 CAS的执行 CAS的执行过程如下: 比较(Compare):将内存地址V中的值与 阅读全文
posted @ 2025-04-10 14:33 kuki' 阅读(60) 评论(0) 推荐(0)
摘要:常见方案 悲观锁, 认为线程安全问题一定会发生, 因此操作数据库之前都需要先获取锁,确保线程串行执行。 常见的悲观锁有:synchronized、lock 乐观锁, 认为线程安全问题不一定发生, 因此不加锁, 只会在更新数据库的时候去判断有没有其它线程对数据进行修改, 如果没有修改则认为是安全的,直 阅读全文
posted @ 2025-04-10 12:56 kuki' 阅读(61) 评论(0) 推荐(0)
摘要:不考虑超卖问题的实现 查询优惠券 判断时间是否符合 判断库存够么 都对,则库存-1 创建订单保存到数据库 1. 高并发的场景下,单体下库存超卖问题 1.1 问题描述 线程1查询库存,发现库存充足,创建订单,然后准备对库存进行扣减, 但此时线程2和线程3也进行查询,同样发现库存充足, 然后线程1执行完 阅读全文
posted @ 2025-04-10 00:54 kuki' 阅读(66) 评论(0) 推荐(0)
摘要:分布式ID特性 全局唯一性:保证在整个分布式系统中唯一性,不会出现重复的ID。 高可用性:可以通过水平扩展、冗余备份或集群部署来确保。即使某个节点或组件发生故障,仍然能够正常。 安全性:分布式ID生成器独立于 业务逻辑的。设计为一个单独的组件或服务,可以被各种服务共享使用。 高性能:要求在很短的时间 阅读全文
posted @ 2025-04-09 19:28 kuki' 阅读(61) 评论(0) 推荐(0)
摘要:在MySQL中,表最多可以存储的记录数取决于多个因素,包括数据库版本、操作系统和硬件配置等。下面是一些常见的限制:(感觉没啥用) 行数限制: 在MySQL 5.7及之前的版本中,InnoDB和XtraDB存储引擎的行数限制为最大约为64亿(\(2^{32}-1\)) ,即4,294,967,295行 阅读全文
posted @ 2025-04-09 18:43 kuki' 阅读(197) 评论(0) 推荐(0)
摘要:自增ID存在的问题 当用户抢购时,就会生成订单并保存到tb_voucher_order这张表中,而订单表如果使用数据库自增ID就存在一些问题: id的规律性太明显,容易出现信息的泄露,被不怀好意的人伪造请求 受单表数据量的限制,MySQL中表能够存储的数据有限,会出现分库分表的情况,id不能够一直自 阅读全文
posted @ 2025-04-09 17:06 kuki' 阅读(34) 评论(0) 推荐(0)
摘要:什么是逻辑过期 所谓的逻辑过期,类似于逻辑删除,并不是真正意义上的过期, 而是新增一个字段,用来标记key的过期时间,这样能能够避免key过期而被自动删除,这样数据就永不过期了, 从根本上解决因为热点key过期导致的缓存击穿。一般搞活动时,比如抢优惠券,秒杀等场景,请求量比较大就可以使用逻辑过期,等 阅读全文
posted @ 2025-04-09 16:07 kuki' 阅读(82) 评论(0) 推荐(0)
摘要:代码举例 private boolean tryLock(String key) { Boolean flag = stringRedisTemplate.opsForValue().setIfAbsent(key, "1", 10, TimeUnit.SECONDS); // 避免返回值为null 阅读全文
posted @ 2025-04-09 15:15 kuki' 阅读(66) 评论(0) 推荐(0)
摘要:setIfAbsent Spring 文档 https://docs.spring.io/spring-data/redis/docs/current/api/org/springframework/data/redis/core/ValueOperations.html#setIfAbsent(K 阅读全文
posted @ 2025-04-09 14:58 kuki' 阅读(121) 评论(0) 推荐(0)
摘要:实现了一个基于 Redis 的分布式锁机制,包含获取锁和释放锁的逻辑。 1. 获取锁的逻辑: private boolean tryLock(String key) { Boolean flag = stringRedisTemplate.opsForValue().setIfAbsent(key, 阅读全文
posted @ 2025-04-09 14:46 kuki' 阅读(50) 评论(0) 推荐(0)
摘要:文档链接 https://baomidou.com/guides/data-interface/#get // 根据 ID 查询 T getById(Serializable id); 代码举例 shop = getById(id); 这行代码的作用是根据给定的 id,从数据库中查询对应的 Shop 阅读全文
posted @ 2025-04-09 14:30 kuki' 阅读(391) 评论(0) 推荐(0)
摘要:Spring文档 opsForValue public ValueOperations<K,V> opsForValue() Description copied from interface: RedisOperations 返回对简单值(或 Redis 术语中的字符串)执行的操作。 Return 阅读全文
posted @ 2025-04-09 13:33 kuki' 阅读(156) 评论(0) 推荐(0)
摘要:什么是缓存击穿 缓存击穿问题也叫热点Key问题, 就是一个被高并发访问并且缓存重建业务较复杂的key突然失效了, 无数的请求访问会在瞬间给数据库带来巨大的冲击。 解决方案 互斥锁(时间换空间) 优点:内存占用小,一致性高,实现简单 缺点:性能较低,容易出现死锁 逻辑过期(空间换时间) 优点:性能高 阅读全文
posted @ 2025-04-09 11:31 kuki' 阅读(131) 评论(0) 推荐(0)
摘要:什么是缓存雪崩? 缓存雪崩是指在同一时段大量的缓存key同时失效或者Redis服务宕机, 导致大量请求到达数据库,带来巨大压力。 解决方案 给不同的Key的TTL(过期时间)添加随机值 给缓存业务添加降级限流策略,(接口限流)比如快速失败机制,让请求尽可能打不到数据库上 给业务添加多级缓存 利用Re 阅读全文
posted @ 2025-04-09 11:11 kuki' 阅读(28) 评论(0) 推荐(0)
摘要:什么是缓存穿透? 缓存穿透是指客户端请求的数据在缓存中和数据库中都不存在, 这样缓存永远不会生效,这些请求都会打到数据库。 解决方案 缓存空字符串(即一个默认值) 优点:实现简单,维护方便 缺点:额外的内存消耗,可能造成短期的不一致 布隆过滤 优点:内存占用较少,没有多余key 缺点:实现复杂,存在 阅读全文
posted @ 2025-04-08 23:55 kuki' 阅读(54) 评论(0) 推荐(0)
摘要:文档链接:https://plus.hutool.cn/apidocs/cn/hutool/core/text/CharSequenceUtil.html#isNotBlank-java.lang.CharSequence- CharSequenceUtil public static boolea 阅读全文
posted @ 2025-04-08 23:41 kuki' 阅读(29) 评论(0) 推荐(0)
摘要:采用缓存主动更新来解决数据一致性问题,同时也选择使用双写方案的删除缓存模式(增加TTL超时剔除兜底),同时将缓存和数据库的操作放到同一个事务来保障操作的原子性。 需求 根据id查询店铺时,如果缓存未命中,则查询数据库,将数据库结果写入缓存,并设置超时时间。 根据id修改店铺时,先修改数据库,再删除缓 阅读全文
posted @ 2025-04-08 21:15 kuki' 阅读(105) 评论(0) 推荐(0)
摘要:加缓存的问题 缓存的使用降低了后端负载,提高了读写的效率,降低了响应的时间。 但缓存带来问题,比如:数据一致性问题 数据一致性的产生原因 缓存和数据库中的数据不同步 所以需要缓存更新策略。 缓存更新策略 主动更新(手动)。手动编码实现缓存更新,在修改数据库的同时更新缓存 双写方案(Cache Asi 阅读全文
posted @ 2025-04-08 20:44 kuki' 阅读(141) 评论(0) 推荐(0)
摘要:代码讲解 stringRedisTemplate.opsForList().leftPushAll(CACHE_SHOP_TYPE_KEY, shopTypes); 这行代码的作用是将shopTypes列表中的所有元素批量从左侧推入(即插入)到Redis中键名为CACHE_SHOP_TYPE_KEY 阅读全文
posted @ 2025-04-08 17:57 kuki' 阅读(120) 评论(0) 推荐(0)
摘要:Service Interface https://baomidou.com/guides/data-interface/#service-interface IService 是 MyBatis-Plus 提供的一个通用 Service 层接口,它封装了常见的 CRUD 操作,包括插入、删除、查询 阅读全文
posted @ 2025-04-08 17:49 kuki' 阅读(122) 评论(0) 推荐(0)
摘要:在Spring框架中,StringRedisTemplate是一个专门用于操作Redis字符串数据的模板类。它提供了多种方法来处理Redis中的数据结构,包括列表(List)、集合(Set)、哈希(Hash)等。使用了opsForList().range方法来获取Redis列表中的元素。 List< 阅读全文
posted @ 2025-04-08 17:22 kuki' 阅读(128) 评论(0) 推荐(0)
摘要:缓存问题与解决策略 缓存雪崩(Cache Avalanche): 缓存雪崩是指在同一时间大量缓存数据过期,导致大量请求直接访问数据库,可能导致数据库宕机。 解决方案: 设置不同的过期时间: 为缓存数据设置不同的过期时间,避免大量数据同时过期。​ 加锁或队列: 使用锁或队列控制缓存重建的进程,防止大量 阅读全文
posted @ 2025-04-08 14:34 kuki' 阅读(40) 评论(0) 推荐(0)
摘要:由于 UserHolder 的方法是静态的,您可以在任何地方直接通过类名调用这些方法,而无需创建 UserHolder 的实例。这种设计模式使得在整个应用程序中都可以方便地访问和管理用户信息。 UserHolder 是否是全局变量 UserHolder 本身是一个类,其中的静态变量(如上述示例中的 阅读全文
posted @ 2025-04-08 00:09 kuki' 阅读(58) 评论(0) 推荐(0)
摘要:解决 application.yaml中修改RabbitMQ相关 rabbitmq: host: localhost username: guest password: guest virtual-host: / port: 5672 说明: host要和浏览器中RabbitMQ管理页面一致 账户和 阅读全文
posted @ 2025-04-07 18:12 kuki' 阅读(109) 评论(0) 推荐(0)
摘要:下载 brew install rabbitmq 安装RabbitMQWeb管理界面 rabbitmq-plugins enable rabbitmq_management 启动rabbitmq brew services start rabbitmq 打开浏览器输入 http://localhos 阅读全文
posted @ 2025-04-07 18:08 kuki' 阅读(22) 评论(0) 推荐(0)
摘要:1. 解决 原因是你的Redis虽然正确启动了,但是你的Redis有密码,所以在Redisson实例化的时候需要配置,在黑马点评项目里的config/RedissonConfig.java中增加setPassword("密码")进行配置。 @Bean public RedissonClient re 阅读全文
posted @ 2025-04-07 16:47 kuki' 阅读(583) 评论(0) 推荐(0)
摘要:使用 brew 启动软件 brew services start redis 执行命令,启动服务 redis-server 阅读全文
posted @ 2025-04-07 16:18 kuki' 阅读(55) 评论(0) 推荐(0)
摘要:学习自 https://blog.csdn.net/m0_74570541/article/details/133352659 安装(homebrew) brew install nginx 启动nginx brew services start nginx // 重启的命令是: brew serv 阅读全文
posted @ 2025-04-07 16:11 kuki' 阅读(34) 评论(0) 推荐(0)
摘要:打开 IntelliJ IDEA,选择 Setting 打开设置对话框。 在设置对话框中,选择 Editor > Code Style > Java(或其他你正在使用的编程语言)。 在 Code Style 页面中,找到 Code Generation 部分。 在 Code Generation 部 阅读全文
posted @ 2025-04-07 12:03 kuki' 阅读(406) 评论(0) 推荐(0)
摘要:IDEA 全局查找快捷键: Shif+ Command + F 阅读全文
posted @ 2025-04-07 10:49 kuki' 阅读(25) 评论(0) 推荐(0)
摘要:节选自 https://blog.csdn.net/bestone0213/article/details/47424255 IoC的一个重点是在系统运行中,动态的向某个对象提供它所需要的其他对象。这一点是通过DI(Dependency Injection,依赖注入)来实现的。 理解:向某个对象提供 阅读全文
posted @ 2025-04-06 14:50 kuki' 阅读(19) 评论(0) 推荐(0)
摘要:RESTful是什么 阅读全文
posted @ 2025-04-06 14:11 kuki' 阅读(30) 评论(0) 推荐(0)
摘要:怎么理解Bean? Bean是指由Spring容器管理的对象,它的生命周期由容器控制。 它的生命周期由容器控制,包括 创建、 初始化、 使用和销毁。 通过三种方式声明:注解方式、XML配置、Java配置。 三种声明方式 使用 @Component、@Service、@Repository、@Cont 阅读全文
posted @ 2025-04-05 23:12 kuki' 阅读(200) 评论(0) 推荐(0)
摘要:黑马点评项目SQL导入报错 阅读全文
posted @ 2025-04-05 22:41 kuki' 阅读(335) 评论(0) 推荐(0)
摘要:需要考虑字段的基数(即字段中不同值的数量)和查询的选择性(即通过索引过滤掉无关数据的能力)。 性别字段: 通常只有 "男" 和 "女" 两种取值,基数非常低。由于值的重复率高,索引的选择性差,使用索引的效果有限,甚至可能导致查询优化器不使用索引。 出生年月字段: 理论上可以有较多不同的取值,基数相对 阅读全文
posted @ 2025-04-04 16:21 kuki' 阅读(42) 评论(0) 推荐(0)
摘要:在 MySQL 的 InnoDB 存储引擎中,执行 SELECT 语句时,默认情况下不会对表或行加锁。InnoDB 使用多版本并发控制(MVCC)机制,通过读取数据的快照来实现一致性非锁定读取,从而允许多个事务并发地读取数据而不会相互阻塞。 然而,在以下情况下,SELECT 语句会对数据行加锁: 显 阅读全文
posted @ 2025-04-04 16:16 kuki' 阅读(61) 评论(0) 推荐(0)
摘要:简单的读取操作: 对于只读操作,如果不需要修改数据,通常不需要开启事务。(不过,如果读取操作需要满足一定的隔离性要求,可能仍然需要在事务中执行。) 独立操作: 如果一个操作是完全独立的,并且它的成功或失败不影响其他数据的一致性,那么可以不必开启事务。例如,向日志表中插入一条日志记录。 性能考虑: 事 阅读全文
posted @ 2025-04-04 15:57 kuki' 阅读(43) 评论(0) 推荐(0)
摘要:基类的 protected 成员是包内可见的,并且对子类可见; 若子类与基类不在同一包中,那么在子类中,子类实例可以访问其从基类继承而来的protected方法,而不能访问基类实例的protected方法。 阅读全文
posted @ 2025-04-03 22:27 kuki' 阅读(14) 评论(0) 推荐(0)
摘要:super 关键字:我们可以通过 super 关键字来实现对父类成员的访问,用来引用当前对象的父类。 this 关键字:指向自己的引用,引用当前对象,即它所在的方法或构造函数所属的对象实例。 阅读全文
posted @ 2025-04-03 20:02 kuki' 阅读(20) 评论(0) 推荐(0)
摘要:声明抽象方法会造成以下两个结果: 如果一个类包含抽象方法,那么该类必须是抽象类。 任何子类必须重写父类的抽象方法,或者声明自身为抽象类。 阅读全文
posted @ 2025-04-03 16:32 kuki' 阅读(15) 评论(0) 推荐(0)
摘要:在 Java 中,抽象类不能直接实例化, 也就是说不能用 new 关键字创建抽象类的对象。 抽象类主要用于定义共通接口和部分实现, 具体的对象必须由其具体子类来创建, 抽象类的子类必须给出抽象类中的抽象方法的具体实现,除非该子类也是抽象类。 而这些子类必须实现抽象类中的所有抽象方法才能被实例化。 阅读全文
posted @ 2025-04-03 16:27 kuki' 阅读(52) 评论(0) 推荐(0)
摘要:Java基础(面向对象):什么是实例化?实例化是指创建类的对象(或实例)的过程。 通过实例化,可以根据类的定义, 在内存中分配空间, 并初始化该对象的属性和方法,使其可供程序使用 阅读全文
posted @ 2025-04-03 15:50 kuki' 阅读(58) 评论(0) 推荐(0)
摘要:抽象类不能直接实例化。 也就是说,不能使用 new 关键字来创建一个抽象类的对象。 抽象类通常用于定义一些共性行为或接口,让具体子类继承并实现其中的抽象方法,从而确保所有子类都符合该规范。 由于抽象类不能实例化对象,所以抽象类必须被继承 阅读全文
posted @ 2025-04-03 15:22 kuki' 阅读(39) 评论(0) 推荐(0)
摘要:抽象类实现接口时,不必实现接口中所有的方法,只要这个类本身被声明为抽象类即可。 未实现的方法会保留为抽象方法,最终需要由具体子类实现才能实例化对象。 Animal.java package interfaceAndAbstract; // 定义一个接口 public interface Animal 阅读全文
posted @ 2025-04-03 15:12 kuki' 阅读(17) 评论(0) 推荐(0)
摘要:HashMap 的 key 不重复性主要是通过两步来实现的: 通过 hashCode 确定存储位置: 当你使用 put 方法添加一个 key-value 对时, HashMap 会先调用 key 的 hashCode() 方法计算出一个哈希值, 并根据这个值确定该 key 应该存放在哪个桶中。 通过 阅读全文
posted @ 2025-04-03 12:31 kuki' 阅读(142) 评论(0) 推荐(0)
摘要:在 HashMap 中,key 是不允许重复的。 如果你使用一个已存在的 key 进行 put 操作,原来该 key 对应的 value 会被新值覆盖。 阅读全文
posted @ 2025-04-03 12:23 kuki' 阅读(37) 评论(0) 推荐(0)
摘要:当 hashCode 重复时,也就是发生哈希碰撞,HashSet(实际上是基于 HashMap 实现的)会采取以下措施来处理: 同一桶中存储多个对象: 当多个对象计算出相同的 hashCode 后,它们会被存放到同一个桶中。 使用 equals() 方法区分: 在同一桶中,添加新元素时,会依次使用 阅读全文
posted @ 2025-04-03 12:19 kuki' 阅读(55) 评论(0) 推荐(0)
摘要:是的,两个不同的对象在计算 hashCode 时有可能得到相同的值,这种情况称为“哈希碰撞”。 Java 的 hashCode 方法并没有保证不同对象一定返回不同的哈希码, 只保证如果两个对象通过 equals() 比较为相等,它们的 hashCode 必须相同。 因此,即使两个对象不相等,也可能产 阅读全文
posted @ 2025-04-03 11:22 kuki' 阅读(47) 评论(0) 推荐(0)
摘要:HashSet 底层是基于 HashMap 实现的。 在添加元素时,HashSet 会调用元素的 hashCode() 方法来计算其哈希值,并定位到对应的桶。 如果该桶中已经有一个或多个元素, 它会用 equals() 方法比较新元素与桶中已有元素是否相等。 如果相等,说明该元素已经存在,新的元素就 阅读全文
posted @ 2025-04-03 11:09 kuki' 阅读(43) 评论(0) 推荐(0)
摘要:Java集合: 罗列一下常见的数据结构有哪些?Java集合 阅读全文
posted @ 2025-04-02 20:45 kuki' 阅读(54) 评论(0) 推荐(0)
摘要:阿里云一面凉经阿里云一面面经重基础 阅读全文
posted @ 2025-04-02 11:47 kuki' 阅读(17) 评论(0) 推荐(0)