<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[QQwli的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/QQwli</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; QQwli]]></copyright><item><title><![CDATA[生成 98 个 100 以内不重复的随机数？]]></title><link>https://blog.youkuaiyun.com/QQwli/article/details/145711426</link><guid>https://blog.youkuaiyun.com/QQwli/article/details/145711426</guid><author>QQwli</author><pubDate>Tue, 18 Feb 2025 17:50:46 +0800</pubDate><description><![CDATA[当需要生成 98 个 100 以内不重复的随机数时，若仍采用之前逐个生成并检查是否重复的方法，在接近生成足够数量的随机数时，可能会因为剩余可选择的数字越来越少而导致生成效率变低。更高效的做法是先生成 0 到 99 的所有数字，然后将这些数字打乱顺序，最后从中选取前 98 个数字。使用 Java 的 Set 集合来保证元素的唯一性，在生成随机数时不断检查是否重复直到生成 98 个不重复的随机数。以下是具体代码实现。]]></description><category></category></item><item><title><![CDATA[缓存策略&通用分布式缓存解决方案]]></title><link>https://blog.youkuaiyun.com/QQwli/article/details/145370132</link><guid>https://blog.youkuaiyun.com/QQwli/article/details/145370132</guid><author>QQwli</author><pubDate>Sun, 26 Jan 2025 17:30:51 +0800</pubDate><description><![CDATA[Cache Aside（旁路缓存）策略是一种在应用程序中协调缓存与数据库交互的常用策略，是使用最多策略。]]></description><category></category></item><item><title><![CDATA[分布式事务解决方案及幂等性解决方案]]></title><link>https://blog.youkuaiyun.com/QQwli/article/details/145202463</link><guid>https://blog.youkuaiyun.com/QQwli/article/details/145202463</guid><author>QQwli</author><pubDate>Fri, 17 Jan 2025 11:06:25 +0800</pubDate><description><![CDATA[借助消息中间件（如：RabbitMQ、RocketMQ等）来传递消息，协调各个参与分布式事务的服务之间的业务操作，通过消息的发送、接收、确认以及异常处理等一系列机制，确保在复杂的分布式环境下，业务流程能预期完成。实现整体的数据一致性。]]></description><category></category></item><item><title><![CDATA[java最优建树算法]]></title><link>https://blog.youkuaiyun.com/QQwli/article/details/133750820</link><guid>https://blog.youkuaiyun.com/QQwli/article/details/133750820</guid><author>QQwli</author><pubDate>Tue, 10 Oct 2023 17:00:48 +0800</pubDate><description><![CDATA[java快速构建树形结构]]></description><category></category></item><item><title><![CDATA[华为OD机试（B卷）]]></title><link>https://blog.youkuaiyun.com/QQwli/article/details/131541629</link><guid>https://blog.youkuaiyun.com/QQwli/article/details/131541629</guid><author>QQwli</author><pubDate>Tue, 04 Jul 2023 20:01:46 +0800</pubDate><description><![CDATA[有幸接到了华为OD的机试邀请，三道算法题。比较幸运的是，最后一题，也相对来说不算太难，没有抽到动态规划，还是花了大约90分钟，三道题都通过了，最终拿到了满分；第一题第二题都相对来说比较基础，由于平时也没有刷题的习惯，用自己的常规思路都能解决；第三题，也算中规中矩，直接构建对象，递归就解决了。]]></description><category></category></item><item><title><![CDATA[Redis 原理]]></title><link>https://blog.youkuaiyun.com/QQwli/article/details/131350427</link><guid>https://blog.youkuaiyun.com/QQwli/article/details/131350427</guid><author>QQwli</author><pubDate>Fri, 23 Jun 2023 14:30:03 +0800</pubDate><description><![CDATA[SDS具备自动扩容能力，如果要在原字符串基础上追加字符串，首先会申请内存空间，如果新字符串小于1M，则新空间为扩展后字符串的两倍+1；如果添加的元素超过了存储范围，intSet会自动升级编码格式，找到合适大小，并按照新的编码方式及元素个数扩容数组，倒序依次将数组中的数据拷贝到扩容后的正确位置，并将待添加的数据放入数组末尾。与HashMap思想类似。因为intSet采用数组，内存空间是连续的，在数据量较大的时候，是不方便的，查找效率也会下降，所以适合在数据量较小时使用。具备类型升级机制，可以节省内存空间；]]></description><category></category></item><item><title><![CDATA[Redis 分布式缓存]]></title><link>https://blog.youkuaiyun.com/QQwli/article/details/131335218</link><guid>https://blog.youkuaiyun.com/QQwli/article/details/131335218</guid><author>QQwli</author><pubDate>Wed, 21 Jun 2023 22:59:19 +0800</pubDate><description><![CDATA[AOF文件会比RDB文件大，而且AOF中会记录对同一个key的多次写操作，但是只有最后一次的才有意义，通过执行。单点的Redis的并发能力是有上限的，要进一步提高Redis的并发能力，就需要搭建主从集群，实现读写分离；，简单来说就是把内存中的所有数据都记录到磁盘上，当Redis实时故障重启后，从磁盘读取快照文件，恢复数据。命令，可以让AOF文件执行重写功能，用最少得命令达到相同的效果。Redis也会在触发阈值时自动去重写AOF文件，阈值也可以在。AOF默认是关闭的，AOF的命令记录频率也可以通过修改。]]></description><category></category></item><item><title><![CDATA[Redis 分布式锁实现]]></title><link>https://blog.youkuaiyun.com/QQwli/article/details/131277225</link><guid>https://blog.youkuaiyun.com/QQwli/article/details/131277225</guid><author>QQwli</author><pubDate>Sun, 18 Jun 2023 22:43:59 +0800</pubDate><description><![CDATA[判断成功之后，产生了阻塞（如：Full GC时），导致多线程安全问题，解决方法可以使用 Lua 脚本，保证以上操作的原子性。Redis提供了 Lua 脚本功能，在脚本中编写多条命令，确保多条命令执行时的原子性。Redisson是一个在 Redis 基础实现分布式工具的集合，包括分布式锁。unlock 中判断锁标识的操作和释放锁的操作不是原子操作，如果。分布式锁：满足分布式系统或集群模式下多进程可见并且互斥的锁。确保只能有一个线程获取锁，确保添加锁和添加过期时间的原子性。超时释放：获取锁时添加一个超时时间。]]></description><category></category></item><item><title><![CDATA[SpringMVC 底层实现及执行流程详解]]></title><link>https://blog.youkuaiyun.com/QQwli/article/details/131261576</link><guid>https://blog.youkuaiyun.com/QQwli/article/details/131261576</guid><author>QQwli</author><pubDate>Sat, 17 Jun 2023 16:13:57 +0800</pubDate><description><![CDATA[自定义注解编写参数解析器//是否支持某个参数 @Override public boolean supportsParameter(MethodParameter parameter) {= null;]]></description><category></category></item><item><title><![CDATA[SpringBoot 自动配置原理详解]]></title><link>https://blog.youkuaiyun.com/QQwli/article/details/131260793</link><guid>https://blog.youkuaiyun.com/QQwli/article/details/131260793</guid><author>QQwli</author><pubDate>Sat, 17 Jun 2023 15:18:22 +0800</pubDate><description><![CDATA[SpringBoot启动会先加载第三方的配置类，然后加载本项目的配置类这样并不合理，加载顺序应该先加载本项目的，然后再加载第三方的才合理，这时，只需要将 ImportSelector 接口改为 DeferredImportSelector 接口即可；上述实现的 ImportSelector 接口，如果第三方的配置类和本项目的配置类重名，配置类会被覆盖，SpringBoot启动会先加载第三方的配置类，然后加载本项目的配置类，所以最后加载的是本项目的配置类；需要注意的是，如果配置类是内部类，需要用。]]></description><category></category></item><item><title><![CDATA[SpringBoot 启动过程详解]]></title><link>https://blog.youkuaiyun.com/QQwli/article/details/131236646</link><guid>https://blog.youkuaiyun.com/QQwli/article/details/131236646</guid><author>QQwli</author><pubDate>Thu, 15 Jun 2023 22:16:34 +0800</pubDate><description><![CDATA[SpringBoot 主要分为两大步：1、执行SpringApplication 构造；2、执行 run() 方法。主要分为 12 个步骤和 7 大事件。]]></description><category></category></item><item><title><![CDATA[Dubbo 高级特性]]></title><link>https://blog.youkuaiyun.com/QQwli/article/details/131024763</link><guid>https://blog.youkuaiyun.com/QQwli/article/details/131024763</guid><author>QQwli</author><pubDate>Sat, 03 Jun 2023 19:32:55 +0800</pubDate><description><![CDATA[mock=force:return null 表示消费方对该服务的方法调用都直接返回 null 值，不发起远程调用，用来屏蔽不重要服务不可用时对调用方的影响。Failover Cluster：失败重试，默认值，当出现失败，重试其它服务器，默认重试 2 次，使用 retries 配置，一般用于读操作。可以，因为dubbo服务消费者在第一次调用时，会将服务提供方的地址缓存到本地，以后在调用的时候则不需要访问注册中心。超时时间，可以配置在生产方或消费方，建议配置在生产方，因为上产方对接口的响应时间更熟悉。]]></description><category></category></item><item><title><![CDATA[MySQL InnoDB引擎]]></title><link>https://blog.youkuaiyun.com/QQwli/article/details/130796522</link><guid>https://blog.youkuaiyun.com/QQwli/article/details/130796522</guid><author>QQwli</author><pubDate>Sun, 21 May 2023 20:51:04 +0800</pubDate><description><![CDATA[undo log和redo log 记录物理日志不一样，他是逻辑日志，可以认为当delete一条记录时，undo log中会记录一条对应的insert记录，反之亦然，当update一条记录时，他就会记录一条对应相反的update记录，当执行rollback时，就可以从undo log中的逻辑记录读取到相应的内容，进行回滚。Master Thread：核心后台线程，负责调度其它线程，还负责将缓冲池中的数据异步刷新到磁盘中，保持数据的一致性，还包含脏页的刷新、合并插入缓存、undo页的回收。]]></description><category></category></item><item><title><![CDATA[MySQL 锁]]></title><link>https://blog.youkuaiyun.com/QQwli/article/details/130787740</link><guid>https://blog.youkuaiyun.com/QQwli/article/details/130787740</guid><author>QQwli</author><pubDate>Sun, 21 May 2023 00:21:35 +0800</pubDate><description><![CDATA[分类全局锁：锁定数据库中所有的表表级锁：每次操作锁住整张表行级锁：每次操作锁住对应的行。]]></description><category></category></item><item><title><![CDATA[MySQL SQL优化]]></title><link>https://blog.youkuaiyun.com/QQwli/article/details/130673938</link><guid>https://blog.youkuaiyun.com/QQwli/article/details/130673938</guid><author>QQwli</author><pubDate>Sun, 14 May 2023 21:26:47 +0800</pubDate><description><![CDATA[count(主键)：InnoDB引擎会比遍历整张表，把每一行的主键id值都取出来，返回给服务层，服务层拿到主键后，直接按行进行累加。页可以为空，也可以填充一半，也可以填充100%，InnoDB规定每页至少存储2行数据，所以每个页包含了2-N行数据，根据主键排序。count()是一个聚合函数，对于返回的结果集，一行行的判断，如果count函数的参数不是null，累计值加一，最后返回。count(1)：InnoDB引擎遍历整张表，但不取值，服务层对返回的每一行，放一个数字 “1” 进去，直接进行累加。]]></description><category></category></item><item><title><![CDATA[MySQL索引]]></title><link>https://blog.youkuaiyun.com/QQwli/article/details/130673852</link><guid>https://blog.youkuaiyun.com/QQwli/article/details/130673852</guid><author>QQwli</author><pubDate>Sun, 14 May 2023 21:25:59 +0800</pubDate><description><![CDATA[介绍：索引（index）是帮助mysql高效获取数据的数据结构（有序）。在数据之外，数据库系统还维护着满足特定查找算法的数据结构，这些数据结构一模中方式引用指向数据，这样就可以在这些数据结构上实现高级查询算法。索引优缺点优：提高检索效率，降低数据库IO成本，通过索引列对数据进行排序，降低数据排序成本，降低cpu消耗缺：索引需要占空间；索引降低了查询速度，同时降低了表的更新速度，如：insert、update、delete。]]></description><category></category></item><item><title><![CDATA[MySQL存储引擎]]></title><link>https://blog.youkuaiyun.com/QQwli/article/details/130673808</link><guid>https://blog.youkuaiyun.com/QQwli/article/details/130673808</guid><author>QQwli</author><pubDate>Sun, 14 May 2023 21:19:45 +0800</pubDate><description><![CDATA[存储引擎就是存储数据、建立索引、更新、查询数据等技术的实现方式。存储引擎是基于表的，而不是基于库的，所以存储引擎也被称为表类型。Memory引擎的表数据存储在内存中，由于受到硬件问题，或断点问题的影响，只能将这些表作为临时表或缓存使用。文件：xxx.idb 代表的是表名，InnoDB引擎的每一张表都会对应这样一个。高可靠、高性能的通用存储引擎，MySQL5.5之后默认使用InnoDB。foreign key约束，保证数据的完整性、正确性。可以注意到索引是属于存储引擎层的。连接层、服务层、引擎层、存储层。]]></description><category></category></item><item><title><![CDATA[MySQL基础]]></title><link>https://blog.youkuaiyun.com/QQwli/article/details/130650917</link><guid>https://blog.youkuaiyun.com/QQwli/article/details/130650917</guid><author>QQwli</author><pubDate>Fri, 12 May 2023 22:06:40 +0800</pubDate><description><![CDATA[连接查询：内连接：相当于A∩B外连接：左外连接：查询左表所有数据，以及两张表交集部分右外连接：查询右表所有数据，以及两张表交集部分自连接：当前表与自身的连接查询，自连接必须使用表别名子查询。]]></description><category></category></item><item><title><![CDATA[RabbitMQ 发布确认高级]]></title><link>https://blog.youkuaiyun.com/QQwli/article/details/128172792</link><guid>https://blog.youkuaiyun.com/QQwli/article/details/128172792</guid><author>QQwli</author><pubDate>Sun, 04 Dec 2022 15:04:23 +0800</pubDate><description><![CDATA[由于不明原因导致rabbitmq重启，在rabbitmq重启期间生产者消息投递失败，导致消息丢失，需要手动处理和恢复。生产者发送消息到交换机，交换机收到消息后，会触发确认后的回调方法。

none：默认值，禁用发布确认
correlated：发布消息到交换机后触发回调方法
simple：有两种效果：第一种效果与correlated一样；其二，单个确认，在发布消息成功后使用rabbitTemplate,调用waitForConfirms或 waitForConfirmsOrDie方法等待broker节点返回发]]></description><category></category></item><item><title><![CDATA[RabbitMQ 延迟队列]]></title><link>https://blog.youkuaiyun.com/QQwli/article/details/128067307</link><guid>https://blog.youkuaiyun.com/QQwli/article/details/128067307</guid><author>QQwli</author><pubDate>Sun, 27 Nov 2022 17:54:51 +0800</pubDate><description><![CDATA[延时队列,队列内部是有序的，最重要的特性就体现在它的延时属性上，延时队列中的元素是希望在指定时间到了以后或之前取出和处理，简单来说，延时队列就是用来存放需要在指定时间被处理的元素的队列。]]></description><category></category></item></channel></rss>