<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[L_Mr_ll的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/L_Mr_ll</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; L_Mr_ll]]></copyright><item><title><![CDATA[redis缓存和数据库数据保持一致]]></title><link>https://blog.youkuaiyun.com/L_Mr_ll/article/details/163068335</link><guid>https://blog.youkuaiyun.com/L_Mr_ll/article/details/163068335</guid><author>L_Mr_ll</author><pubDate>Tue, 21 Jul 2026 10:58:08 +0800</pubDate><description><![CDATA[一般我们在更新数据库数据时，需要同步redis中缓存的数据，所以存在不同的方案，这里我简单分为2个大类进行总结，每个大类下又有不同的方案。注意：无论是先更新数据库还是后更新数据库，有的会把更新缓存(不是删除)也作为一种解决方案，但生产中真正使用时，都是删除缓存。一般情况下，redis是作为缓存，当数据库中有数据修改时，要做到缓存和修改后的数据保持一致。请求1清除缓存——>请求2读请求，没有缓存，读DB并写入redis——>请求1更新数据库。，而且可能产生并发问题。(操作缓存时，写操作加锁，读操作不加锁)]]></description><category></category></item><item><title><![CDATA[Jdk HashMap1.7头插法扩容死循环]]></title><link>https://blog.youkuaiyun.com/L_Mr_ll/article/details/161854783</link><guid>https://blog.youkuaiyun.com/L_Mr_ll/article/details/161854783</guid><author>L_Mr_ll</author><pubDate>Sun, 21 Jun 2026 15:27:23 +0800</pubDate><description><![CDATA[HashMap的死循环只发生在JDK1.7版本中头插法+链表+多线程并发+扩容，累加到一起就会形成死循环多线程下：建议采用ConcurrentHashMap替代JDK1.8，HashMap改用尾插法，解决了链表死循环问题，但是可能会数据覆盖(丢失)]]></description><category></category></item><item><title><![CDATA[java——接口——非抽象方法]]></title><link>https://blog.youkuaiyun.com/L_Mr_ll/article/details/160216077</link><guid>https://blog.youkuaiyun.com/L_Mr_ll/article/details/160216077</guid><author>L_Mr_ll</author><pubDate>Thu, 16 Apr 2026 14:37:53 +0800</pubDate><description><![CDATA[特性接口抽象类继承关系可以implements多个接口只能extends一个类成员变量只能是常量可以有各种类型的成员变量构造方法❌ 没有✅ 有代码块❌ 没有✅ 可以有静态块、实例块方法修饰符默认 public可以是任意访问修饰符this/super❌ 不能使用✅ 可以使用设计理念定义"能做什么"（能力）定义"是什么"（本质）普通类实现接口：必须实现所有抽象方法，否则编译报错抽象类实现接口：可以只实现部分方法Java 8 default 方法：让接口可以提供默认实现，增强向后兼容性。]]></description><category></category></item><item><title><![CDATA[分库分表自增主键方式]]></title><link>https://blog.youkuaiyun.com/L_Mr_ll/article/details/155444041</link><guid>https://blog.youkuaiyun.com/L_Mr_ll/article/details/155444041</guid><author>L_Mr_ll</author><pubDate>Sun, 18 Jan 2026 23:14:39 +0800</pubDate><description><![CDATA[在分布式系统的架构设计中，分库分表是一个无法回避的话题。当数据量达到一定规模，单库单表已经无法承载业务压力时，我们就需要考虑将数据分散到多个数据库和多个表中。然而，这种分散带来了一个新的挑战：如何在分库分表的场景下生成全局唯一且有序的主键首先排除表的自增主键，具体原因：表都依赖各自的自增机制生成主键，那么不同表可能会生成相同的ID。比如两张表各自插入第一条记录时，生成的ID都是1，这就导致了主键冲突。]]></description><category></category></item><item><title><![CDATA[Mysql架构学习]]></title><link>https://blog.youkuaiyun.com/L_Mr_ll/article/details/152128487</link><guid>https://blog.youkuaiyun.com/L_Mr_ll/article/details/152128487</guid><author>L_Mr_ll</author><pubDate>Sat, 27 Sep 2025 01:29:19 +0800</pubDate><description><![CDATA[因此，之后备份日志的时候，存起来的 binlog 里面就没有这条语句。然后你会发现，如果需要用这个 binlog 来恢复临时库的话，由于这个语句的 binlog 丢失，这个临时库就会少了这一次更新，恢复出来的这一行 c 的值就是 0，与原库的值不同。所以，在之后用 binlog 来恢复的时候就多了一个事务出来，恢复出来的这一行 c 的值就是 1，与原库的值不同。InnoDB 的 redo log 是固定大小的，比如可以配置为一组 4 个文件，每个文件的大小是1GB，那么总共就可以记录 4GB 的操作。]]></description><category></category></item><item><title><![CDATA[上游MQ两个链路消费，链路之间有延迟产生的业务问题]]></title><link>https://blog.youkuaiyun.com/L_Mr_ll/article/details/149096275</link><guid>https://blog.youkuaiyun.com/L_Mr_ll/article/details/149096275</guid><author>L_Mr_ll</author><pubDate>Mon, 07 Jul 2025 16:16:02 +0800</pubDate><description><![CDATA[我这个业务，链路2的数据没必要实时，是可以接受延迟的，且和链路1的数据大概只有10s的延迟，所以我就直接把。学生链路查询老师信息，这个是业务新增的逻辑，之前是没有的，但加上后发现了一个问题：学生信息进来后，查询老师的信息，但老师的信息可能在链路1还没插入(有延迟)，导致这个学生信息被丢弃了（本不该丢弃的）；用方法2只是短暂的解决办法，且只能避免百分之99的问题(如果链路1的MQ消息积压了处理不过来，那还是会产生链路2本不该丢弃的数据被丢弃掉)；其实正常的逻辑应该是一条链路，先插入老师信息，再插入学生信息；]]></description><category></category></item><item><title><![CDATA[eventBus发布订阅]]></title><link>https://blog.youkuaiyun.com/L_Mr_ll/article/details/148471444</link><guid>https://blog.youkuaiyun.com/L_Mr_ll/article/details/148471444</guid><author>L_Mr_ll</author><pubDate>Mon, 09 Jun 2025 11:29:11 +0800</pubDate><description><![CDATA[EventBus发布订阅]]></description><category></category></item><item><title><![CDATA[判断图片url损坏无法展示工具类]]></title><link>https://blog.youkuaiyun.com/L_Mr_ll/article/details/147602392</link><guid>https://blog.youkuaiyun.com/L_Mr_ll/article/details/147602392</guid><author>L_Mr_ll</author><pubDate>Tue, 29 Apr 2025 10:08:33 +0800</pubDate><description><![CDATA[最近负责的项目是图片相关的，我们的图片都是存到S3上，但可能S3上把数据删除了，导致图片无法正常展示，所以要判断图片如果不能正常展示就做其他处理（]]></description><category></category></item><item><title><![CDATA[mysql同一张表中数据一样的问题和解决]]></title><link>https://blog.youkuaiyun.com/L_Mr_ll/article/details/144616123</link><guid>https://blog.youkuaiyun.com/L_Mr_ll/article/details/144616123</guid><author>L_Mr_ll</author><pubDate>Fri, 20 Dec 2024 18:41:12 +0800</pubDate><description><![CDATA[问题二：由于建表时，没有设置唯一索引，导致同一张表中有相同字段的两个数据，因为这个insert/update这个数据的触发是消费MQ消息，结果排查了半天，同一个时间点，发了两个相同的MQ消息，结果线程1消费数据1时，select消息没有结果，然后组装数据准备执行insert；线程2消费数据2时，select消息是在线程1insert前，也没查出来结果，又执行了insert；由于表未设置唯一索引，所以就有了两个相同数据，最后修改insert语句加上。其实问题有两个，但第一个是由于粗心导致的，会简单提及下。]]></description><category></category></item><item><title><![CDATA[记一次单独请求Controller走代码流程成功但MQ触发失败场景]]></title><link>https://blog.youkuaiyun.com/L_Mr_ll/article/details/144246871</link><guid>https://blog.youkuaiyun.com/L_Mr_ll/article/details/144246871</guid><author>L_Mr_ll</author><pubDate>Wed, 04 Dec 2024 18:47:56 +0800</pubDate><description><![CDATA[已知枚举值是接口B所在的服务B提供的，在服务A引入了服务B的jar包，且服务B也已上线(服务B的枚举值肯定是最新的)；场景说明：在某个业务中，新增了一种数据，所以新加了一个枚举值，我将封装好的参数调用其他服务接口时，服务上线时，总是报这个枚举值错误的报错；这就很费解了，参数一样，代码一样，一个是MQ触发，一个Controller触发，却是不同的结果；去找的枚举值，走老逻辑的代码肯定返回值为null，导致调用服务B的接口B时，这个枚举值传的就是null值，所以服务B的接口B校验失败抛错；]]></description><category></category></item><item><title><![CDATA[No typehandler found for property XXX]]></title><link>https://blog.youkuaiyun.com/L_Mr_ll/article/details/141467432</link><guid>https://blog.youkuaiyun.com/L_Mr_ll/article/details/141467432</guid><author>L_Mr_ll</author><pubDate>Fri, 23 Aug 2024 15:42:30 +0800</pubDate><description><![CDATA[报错createTime字段的typehandler对应不上，找了半天才发现是java代码实体类中createTime的类型写错了，本来这个字段是时间Date类型，但是实体上有lombok注解的@Data，可能给createTime写类型时敲的太快了，不小心给写成Data了，害我花了点时间，所以记录下。后面再遇到这个问题，就看报的哪个字段的错，直接去看那个字段的类型和mapper.xml中。前两天写Java代码，通过mybatis对数据库进行读写操作，但在项目启动时，报错。]]></description><category></category></item><item><title><![CDATA[Redis数据类型]]></title><link>https://blog.youkuaiyun.com/L_Mr_ll/article/details/140867251</link><guid>https://blog.youkuaiyun.com/L_Mr_ll/article/details/140867251</guid><author>L_Mr_ll</author><pubDate>Sun, 11 Aug 2024 23:38:33 +0800</pubDate><description><![CDATA[作用介绍：用于统计一个集合中不重复的元素个数。典型应用场景例如根据用户访问记录统计网站的UV。作用介绍：Redis版的MQ – 阻塞队列 + pub/sub；了解即可，企业应用比较少。个人感觉，可以理解为一个key中有多个KV(基于地理空间的一种数据类型。]]></description><category></category></item><item><title><![CDATA[Sentinel控制台菜单]]></title><link>https://blog.youkuaiyun.com/L_Mr_ll/article/details/140648921</link><guid>https://blog.youkuaiyun.com/L_Mr_ll/article/details/140648921</guid><author>L_Mr_ll</author><pubDate>Wed, 31 Jul 2024 01:18:16 +0800</pubDate><description><![CDATA[通过"冷启动"，让通过的流量缓慢增加，在一定时间内逐渐增加到阈值上限，给冷系统一个预热的时间，避免冷系统被压垮。独立模式（Alone），即作为独立的 token server 进程启动，独立部署，隔离性好，但是需要额外的部署操作(需要额外部署一个其他服务)。热点即经常访问的数据。通过接口访问，实时监控页面可以看到，刚开始的阈值是3/3=1，大于1的请求直接失败了，后面在5秒内逐渐把阈值升到3。，同一秒超过3的访问会放到队列中，放到下一秒执行，但不会一直在队列中等待，如果等待时间超过了超时时间，就不执行了。]]></description><category></category></item><item><title><![CDATA[Sentinel使用]]></title><link>https://blog.youkuaiyun.com/L_Mr_ll/article/details/140451965</link><guid>https://blog.youkuaiyun.com/L_Mr_ll/article/details/140451965</guid><author>L_Mr_ll</author><pubDate>Tue, 23 Jul 2024 00:04:11 +0800</pubDate><description><![CDATA[随着微服务的流行，服务和服务之间的稳定性变得越来越重要。Sentinel 是面向分布式、多语言异构化服务架构的流量治理组件，主要以流量为切入点，从流量路由、流量控制、流量整形、熔断降级、系统自适应过载保护、热点流量防护等多个维度来帮助开发者保障微服务的稳定性。官网地址。]]></description><category></category></item><item><title><![CDATA[Mysql遇到的一些奇怪问题记录]]></title><link>https://blog.youkuaiyun.com/L_Mr_ll/article/details/139112226</link><guid>https://blog.youkuaiyun.com/L_Mr_ll/article/details/139112226</guid><author>L_Mr_ll</author><pubDate>Sun, 26 May 2024 23:27:13 +0800</pubDate><description><![CDATA[但后续又延伸出另一个问题：Mysql表中teacherId是设置的唯一索引，但由于是一直消费MQ，MQ消息中是studentId，会反查teacherId，所以多个消息可能对应的是同一个teacherId，但代码都懂得，多线程执行的，所以插入时，偶然在代码中报了。事务注解，但后来一想，多线程情况下，这也解决不了问题，但此业务又不是很重要，没必要用到分布式锁，所以后面从sql入手，使用。的错误，由于文章时后面写的，具体报错没报存也懒的百度了，虽然是偶发事件，但还是得解决，本来想的是在代码中把。]]></description><category></category></item><item><title><![CDATA[java枚举中写抽象方法]]></title><link>https://blog.youkuaiyun.com/L_Mr_ll/article/details/133785798</link><guid>https://blog.youkuaiyun.com/L_Mr_ll/article/details/133785798</guid><author>L_Mr_ll</author><pubDate>Thu, 12 Oct 2023 11:07:33 +0800</pubDate><description><![CDATA[，然后又定义了一个抽象方法，具体作用是要返回student实体的每个相对应的属性value，所以在NAME、AGE。中要实现这个抽象方法并写具体的业务逻辑，具体使用时就是传入一个student对象，然后枚举中每个value中重写的抽象方法都走一遍。之前写java枚举时，都是中规中矩的写，从来没见过在枚举中写抽象方法的，但最近换了新公司，接手了新项目，发现枚举中竟然写了抽象方法，由于之前没接触过这种写法，所以这里记录下。，由于我这是第一次接触这种写法，所以可能每个人的理解有所不同，如果说错了还请指出。]]></description><category></category></item><item><title><![CDATA[Mybatis的mapper.xml批量插入、修改sql]]></title><link>https://blog.youkuaiyun.com/L_Mr_ll/article/details/132859527</link><guid>https://blog.youkuaiyun.com/L_Mr_ll/article/details/132859527</guid><author>L_Mr_ll</author><pubDate>Wed, 13 Sep 2023 17:52:09 +0800</pubDate><description><![CDATA[帮忙生成了一个批量修改的sql，后续我忘记是不是手动给标签手动加的这个属性，结果报错了，排查了半天这个sql哪里错了，最后还是放到数据库执行了一下看到了错误原因，当时我还让温馨一样帮忙检查了下我修改后的sql，结果还说没sql没问题，只是可能在拼接时报错。要修改的表字段B = case when 表字段 = 实体数据字段 then 实体数据字段 when 表字段 = 实体数据字段 then 实体数据字段 when …end  where 条件。]]></description><category></category></item><item><title><![CDATA[JsonInclude注解]]></title><link>https://blog.youkuaiyun.com/L_Mr_ll/article/details/132571799</link><guid>https://blog.youkuaiyun.com/L_Mr_ll/article/details/132571799</guid><author>L_Mr_ll</author><pubDate>Tue, 29 Aug 2023 23:17:48 +0800</pubDate><description><![CDATA[Java对象中使用JsonInclude注解来标记需要包含在JSON字符串中的属性，为实体类在接口序列化返回值时增加规则的注解。]]></description><category></category></item><item><title><![CDATA[java8 Optional用法]]></title><link>https://blog.youkuaiyun.com/L_Mr_ll/article/details/132570531</link><guid>https://blog.youkuaiyun.com/L_Mr_ll/article/details/132570531</guid><author>L_Mr_ll</author><pubDate>Tue, 29 Aug 2023 22:22:59 +0800</pubDate><description><![CDATA[java.util.Optional 是java8中引进的一个新的类，它可以对可能缺失的值进行建模，而不是直接将null赋值给变量。主要是用来避免空指针异常的提示用户要注意该对象有可能为null简化if else代码。]]></description><category></category></item><item><title><![CDATA[spark.read.json对schema的排序]]></title><link>https://blog.youkuaiyun.com/L_Mr_ll/article/details/128629138</link><guid>https://blog.youkuaiyun.com/L_Mr_ll/article/details/128629138</guid><author>L_Mr_ll</author><pubDate>Tue, 10 Jan 2023 14:27:56 +0800</pubDate><description><![CDATA[spark.read.json对schema的字典排序]]></description><category></category></item></channel></rss>