<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[weixin_65790121的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/weixin_65790121</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; weixin_65790121]]></copyright><item><title><![CDATA[JAVA四种引用类型]]></title><link>https://blog.youkuaiyun.com/weixin_65790121/article/details/154520646</link><guid>https://blog.youkuaiyun.com/weixin_65790121/article/details/154520646</guid><author>weixin_65790121</author><pubDate>Fri, 07 Nov 2025 09:22:15 +0800</pubDate><description><![CDATA[【代码】JAVA四种引用类型。]]></description><category></category></item><item><title><![CDATA[mybatis分页的注意事项]]></title><link>https://blog.youkuaiyun.com/weixin_65790121/article/details/153745686</link><guid>https://blog.youkuaiyun.com/weixin_65790121/article/details/153745686</guid><author>weixin_65790121</author><pubDate>Wed, 22 Oct 2025 20:41:48 +0800</pubDate><description><![CDATA[使用mybatis进行分页时要注意如果sql中使用left join ，countsql可能会把left join过滤到。解决方法很简单，在where 条件中加入left join中表中的字段，如。]]></description><category></category></item><item><title><![CDATA[MVCC总结]]></title><link>https://blog.youkuaiyun.com/weixin_65790121/article/details/150024477</link><guid>https://blog.youkuaiyun.com/weixin_65790121/article/details/150024477</guid><author>weixin_65790121</author><pubDate>Thu, 07 Aug 2025 22:33:45 +0800</pubDate><description><![CDATA[MVCC（多版本并发控制，Multiversion Concurrency Control）是一种用于数据库中处理并发访问的机制。MVCC的核心思想是通过维护数据的多个版本来实现。当事务对数据进行更新或删除时，并不会直接修改原始数据，而是生成新版本，并保留旧版本（借助 undo log 实现）。每个事务在开始时都会获取一个（如 MySQL InnoDB 的），读操作根据这个ID判断哪些版本是可见的，从而选择一个”进行读取，避免了加锁等待。读提交和可重复读是通过。]]></description><category></category></item><item><title><![CDATA[快速选择算法]]></title><link>https://blog.youkuaiyun.com/weixin_65790121/article/details/149947120</link><guid>https://blog.youkuaiyun.com/weixin_65790121/article/details/149947120</guid><author>weixin_65790121</author><pubDate>Tue, 05 Aug 2025 22:06:37 +0800</pubDate><description><![CDATA[思路：选取一个基准元素，将数组划分为比基准小和比基准大的两部分，然后判断基准的位置是否是目标位置 k，若是则返回，否则递归在对应一侧继续查找。思路：基于快速排序的分区思想，每次随机选择一个基准值将数组划分为小于等于基准和大于等于基准的两部分，基准最终落下的位置。，则在右半部分，递归查找右边，由于每轮只递归处理一个子区间，平均时间复杂度为 O(n)。一直用力扣刷题，不会用idea写二叉树输入，丢人了，问能不能换一道，换了道题。适合题型：求数组第k大的数，求数组第k小的数。消息队列具体执行流程。]]></description><category></category></item><item><title><![CDATA[滑动窗口解题思路]]></title><link>https://blog.youkuaiyun.com/weixin_65790121/article/details/149907164</link><guid>https://blog.youkuaiyun.com/weixin_65790121/article/details/149907164</guid><author>weixin_65790121</author><pubDate>Mon, 04 Aug 2025 15:47:35 +0800</pubDate><description><![CDATA[当窗口内的元素不满足条件时右移右边界来扩大窗口，满足条件时右移左边界来缩小窗口，从而在遍历过程中高效地探索所有可能的解。滑动窗口的思路是维护一个可变大小的窗口（通常用双指针表示），通过调整窗口的左右边界来寻找满足特定条件的子数组或子串。3.不满足条件扩大右边界，满足缩小左边界。2.Arrays.equals()不熟悉。1.定义l,r指针（通常定义为0）2.while(r < 边界)1.没有使用数组代替哈希表。]]></description><category></category></item><item><title><![CDATA[力扣146.LRU缓存]]></title><link>https://blog.youkuaiyun.com/weixin_65790121/article/details/149773440</link><guid>https://blog.youkuaiyun.com/weixin_65790121/article/details/149773440</guid><author>weixin_65790121</author><pubDate>Wed, 30 Jul 2025 14:58:04 +0800</pubDate><description><![CDATA[遂看题解，思路是Hashmap+双向链表。map存的是<key,node>结构，Node 设计成同时存 key 和 value。通过设计和维护一个双向链表，实现get和put操作都是O(1)，总体代码看起来不难，但是一上手写，就出现了很多问题。刚开始思路用hashmap+队列来做，没有注意到O(1)要求，而queue.remove时间复杂度是O（n)，也是直接超时.先写的head.next = node，直接就破坏了链表的结构。需要设计俩个哑节点，不然需要频繁的判断边界条件。请你设计并实现一个满足。]]></description><category></category></item><item><title><![CDATA[ConcurrentHashMap如何保证并发安全？]]></title><link>https://blog.youkuaiyun.com/weixin_65790121/article/details/149714534</link><guid>https://blog.youkuaiyun.com/weixin_65790121/article/details/149714534</guid><author>weixin_65790121</author><pubDate>Mon, 28 Jul 2025 14:00:01 +0800</pubDate><description><![CDATA[在JDK1.7采用分段锁设计，即将哈希映射分为多个段，每个段都有自己的锁，采用的是ReentrantLock。在JDK1.8以后放弃了分段锁的设计，采用CAS+synchronized实现。写入步骤，判断写入的槽位是不是为空，如果为空，用CAS更新槽位的节点，如果不为空则会采用synchronized同步锁。ConcurrentHashMap和HashMap对比。]]></description><category></category></item><item><title><![CDATA[CAS,AQS]]></title><link>https://blog.youkuaiyun.com/weixin_65790121/article/details/149690482</link><guid>https://blog.youkuaiyun.com/weixin_65790121/article/details/149690482</guid><author>weixin_65790121</author><pubDate>Sun, 27 Jul 2025 21:07:39 +0800</pubDate><description><![CDATA[AQS是多线程同步器，是JUC包下的一个抽象类，ThreadPoolExecutor,CountDownLatch, ReentrantLock, Semaphore,都是基于AQS去实现的AQS原理在AQS中，维护了一个信号量state和一个线程组成的双向链表队列。其中，这个线程队列，就是用来给线程排队的，state用来控制线程排队或者放行的。在不同的场景下有不同的意义。不同场景含义不同：ReentrantLock：表示锁的重入次数。CountDownLatch：表示计数器剩余数量。]]></description><category></category></item><item><title><![CDATA[ThreadLocal总结]]></title><link>https://blog.youkuaiyun.com/weixin_65790121/article/details/149689907</link><guid>https://blog.youkuaiyun.com/weixin_65790121/article/details/149689907</guid><author>weixin_65790121</author><pubDate>Sun, 27 Jul 2025 14:44:09 +0800</pubDate><description><![CDATA[为每个线程提供一个独立的变量副本，实现线程隔离。每个线程（Thread对象）内部有一个，用来存储当前线程对应的 ThreadLocal 键值对。key：类型；（弱引用），指向当前调用的。value：通过存进去的数据。]]></description><category></category></item><item><title><![CDATA[常见设计模式 单例，工厂，代理，策略，适配器]]></title><link>https://blog.youkuaiyun.com/weixin_65790121/article/details/149672673</link><guid>https://blog.youkuaiyun.com/weixin_65790121/article/details/149672673</guid><author>weixin_65790121</author><pubDate>Sat, 26 Jul 2025 23:28:09 +0800</pubDate><description><![CDATA[1确保一个类只有一个实例2构造方法必须是private3 提供一个静态方法获取唯一实例实例在类加载时就创建实例在第一次调用时创建默认实现，使用双重检查锁定。需要加volatile防止指令重排序因为不是原子操作分为三步：分配内存初始化对象将对象引用赋给Spring 容器中的 Bean 默认是单例。]]></description><category></category></item><item><title><![CDATA[使用布隆过滤器解决缓存穿透]]></title><link>https://blog.youkuaiyun.com/weixin_65790121/article/details/149670091</link><guid>https://blog.youkuaiyun.com/weixin_65790121/article/details/149670091</guid><author>weixin_65790121</author><pubDate>Sat, 26 Jul 2025 18:32:55 +0800</pubDate><description><![CDATA[当我们把数据存到缓存时，同时将数据插入到布隆过滤器，布隆过滤器会通过多个hash函数，将数据映射成（哈希值）索引，把位数组对应的值设为1。当查数据时对查询数据进行相同的映射操作，得到索引，检查位数字对应是否为1，如果全为1，则放行，正常通过数据库和缓存查询，如果有一个为0，则表示数据库和缓存到没有，不放行。当受到恶意攻击时，可能会对数据库造成很大的压力，常见的解决方案就是可以缓存空值。除了缓存空值，还可以使用布隆过滤器。）的存在，所以放行的数据不一定能在数据库中查到，不放行的数据则一定查不到。]]></description><category></category></item><item><title><![CDATA[Spring Security实战指南：基于RBAC模型实现动态权限管理]]></title><link>https://blog.youkuaiyun.com/weixin_65790121/article/details/149635218</link><guid>https://blog.youkuaiyun.com/weixin_65790121/article/details/149635218</guid><author>weixin_65790121</author><pubDate>Fri, 25 Jul 2025 21:53:17 +0800</pubDate><description><![CDATA[Spring Security是一个基于Spring框架的安全性解决方案，它为应用程序提供了完整的安全管理功能，包括认证、授权、攻击防范和会话管理等方面。Spring Security 的核心作用是为 Spring 应用提供认证、授权和安全防护，确保只有合法用户能访问受保护资源，并防止常见安全攻击（如 CSRF、会话固定等），从而保障应用的安全性与数据的访问控制。用户登录校验验证码是否正确通过spring security框架验证用户是否存在，密码是否正确查询用户所拥有的权限列表。]]></description><category></category></item><item><title><![CDATA[高并发场景下如何保障缓存与数据库一致性？一文讲透]]></title><link>https://blog.youkuaiyun.com/weixin_65790121/article/details/149607573</link><guid>https://blog.youkuaiyun.com/weixin_65790121/article/details/149607573</guid><author>weixin_65790121</author><pubDate>Thu, 24 Jul 2025 17:25:00 +0800</pubDate><description><![CDATA[先删除缓存再更新数据库，延迟一段时间，再次删除缓存。延迟时间必须大于数据库事务提交时间 + 可能的网络延迟，这个时间无法准确预估，所以还是会有可能造成redis 和 mysql 数据缓存不一致性问题。要保证redis和mysql的数据一致性问题，首先想到的就是在对数据库增删改的时候删除缓存。所有的读请求访问的都是旧数据，但是最终更新数据库完成之后，会删掉缓存，所以能保证。，有一个读请求来了，那么缓存的还是旧数据，后续的读操就都是旧数据，不能保证。但是如果删除缓存操作失败了，就不能保证最终一致性。]]></description><category></category></item><item><title><![CDATA[MyBatis＜collection＞的多层嵌套]]></title><link>https://blog.youkuaiyun.com/weixin_65790121/article/details/149478763</link><guid>https://blog.youkuaiyun.com/weixin_65790121/article/details/149478763</guid><author>weixin_65790121</author><pubDate>Sun, 20 Jul 2025 10:09:04 +0800</pubDate><description><![CDATA[摘要：MyBatis中的&lt;collection&gt;标签用于映射Java对象中的集合属性，如List、Set或数组。在多层嵌套结构中（如树形关系），可通过嵌套&lt;collection&gt;实现复杂对象映射。示例展示了Floor类包含Room集合，Room又包含Bed集合的三层嵌套结构，对应的XML配置使用&lt;collection&gt;标签逐层映射，最终形成完整的对象关系映射。]]></description><category></category></item><item><title><![CDATA[通过AOP+自定义注解实现日志记录功能]]></title><link>https://blog.youkuaiyun.com/weixin_65790121/article/details/149462691</link><guid>https://blog.youkuaiyun.com/weixin_65790121/article/details/149462691</guid><author>weixin_65790121</author><pubDate>Sat, 19 Jul 2025 20:15:18 +0800</pubDate><description><![CDATA[Target({ ElementType.PARAMETER, ElementType.METHOD })//表示只能用在方法或者方法的参数上@Retention(RetentionPolicy.RUNTIME)//注解保留在运行时，可以通过反射读取@Documented//注解信息会出现在 Javadoc 中/*** 模块*//*** 功能*//*** 操作人类别*//*** 是否保存请求的参数*//*** 是否保存响应的参数*//**]]></description><category></category></item><item><title><![CDATA[git常用命令]]></title><link>https://blog.youkuaiyun.com/weixin_65790121/article/details/149366702</link><guid>https://blog.youkuaiyun.com/weixin_65790121/article/details/149366702</guid><author>weixin_65790121</author><pubDate>Tue, 15 Jul 2025 21:31:02 +0800</pubDate><description><![CDATA[]]></description><category></category></item></channel></rss>