<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[vmaps的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/vmaps</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; vmaps]]></copyright><item><title><![CDATA[mybatis 拦截器 执行流程]]></title><link>https://blog.youkuaiyun.com/vmaps/article/details/139629472</link><guid>https://blog.youkuaiyun.com/vmaps/article/details/139629472</guid><author>vmaps</author><pubDate>Wed, 12 Jun 2024 16:03:47 +0800</pubDate><description><![CDATA[在 MyBatis 中，当执行一个 SQL 语句时，会涉及到一系列的组件和接口来协同完成这个任务。你提到的Executor和是这些组件中的核心部分。]]></description><category></category></item><item><title><![CDATA[Kafka 顺序写，随机写，原理对比]]></title><link>https://blog.youkuaiyun.com/vmaps/article/details/137904579</link><guid>https://blog.youkuaiyun.com/vmaps/article/details/137904579</guid><author>vmaps</author><pubDate>Thu, 18 Apr 2024 09:23:43 +0800</pubDate><description><![CDATA[当数据写入时，Kafka会先将数据写入内存缓冲区，当缓冲区满后，再将数据一次性地、顺序地写入到磁盘中，并生成新的日志段。这种顺序写的方式省去了大量的磁头寻址时间，因为磁头只需要随着磁盘顺序旋转即可，从而大大提高了写入效率。在随机写的过程中，磁头需要频繁地移动以定位到正确的写入位置，这会增加磁头寻址时间和磁盘臂移动时间，从而降低了写入效率。综上所述，Kafka通过采用顺序写的方式，实现了高效的数据写入和读取，从而满足了分布式系统中数据采集、日志处理、实时计算等场景的需求。]]></description><category></category></item><item><title><![CDATA[Redis的复制机制 强一致性如何保证]]></title><link>https://blog.youkuaiyun.com/vmaps/article/details/137904421</link><guid>https://blog.youkuaiyun.com/vmaps/article/details/137904421</guid><author>vmaps</author><pubDate>Thu, 18 Apr 2024 09:20:46 +0800</pubDate><description><![CDATA[Redis的复制是异步的，这意味着在数据从主节点复制到从节点的过程中，可能会存在一定的延迟。因此，在读取从节点时，可能会读取到稍微滞后的数据，这就导致了最终一致性（eventual consistency）而非强一致性。需要注意的是，强一致性通常需要在分布式系统中付出较高的代价，包括性能损失和复杂性增加。如果你确实需要强一致性保证，可能需要考虑使用其他更适合强一致性的数据存储系统，或者结合其他技术（如分布式锁、两阶段提交等）来实现强一致性。但请注意，这些方法通常会带来更多的复杂性和性能开销。]]></description><category></category></item><item><title><![CDATA[zk 在 stw阶段 会不会心跳释放]]></title><link>https://blog.youkuaiyun.com/vmaps/article/details/137904379</link><guid>https://blog.youkuaiyun.com/vmaps/article/details/137904379</guid><author>vmaps</author><pubDate>Thu, 18 Apr 2024 09:20:07 +0800</pubDate><description><![CDATA[ZooKeeper的核心机制之一就是心跳机制，通过心跳机制，ZooKeeper能够及时检测分布式系统中的节点是否存活，以此为基础保证分布式协调服务的可用性。但请注意，ZooKeeper的具体行为和STW阶段的具体实现可能会有所不同，因此最好查阅相关的ZooKeeper文档或源代码，以了解在STW阶段ZooKeeper的心跳机制是如何工作的。ZooKeeper（ZK）在STW（Stop-The-World）阶段是否会心跳释放，这取决于ZooKeeper的具体实现和配置，以及STW阶段的具体行为。]]></description><category></category></item><item><title><![CDATA[hbase 组件原理关系]]></title><link>https://blog.youkuaiyun.com/vmaps/article/details/137613901</link><guid>https://blog.youkuaiyun.com/vmaps/article/details/137613901</guid><author>vmaps</author><pubDate>Wed, 10 Apr 2024 22:31:19 +0800</pubDate><description><![CDATA[当MemStore中的数据达到一定的阈值时，它会触发一个flush操作，将数据刷写到磁盘上的StoreFile中。Region Server、Region、Store以及StoreFile是HBase架构中的关键组件，它们在数据的存储、读取和管理中扮演着重要角色。综上所述，Region Server、Region、Store以及StoreFile/HFile在HBase中形成了一个完整的数据存储和访问体系，它们共同协作以实现高效、可扩展和容错的数据存储服务。]]></description><category></category></item><item><title><![CDATA[java 多线程死锁]]></title><link>https://blog.youkuaiyun.com/vmaps/article/details/136719967</link><guid>https://blog.youkuaiyun.com/vmaps/article/details/136719967</guid><author>vmaps</author><pubDate>Thu, 14 Mar 2024 19:40:39 +0800</pubDate><description><![CDATA[在Java中，多线程死锁是一个常见的问题，它发生在两个或更多的线程无限期地等待一个资源，而这个资源被另一个线程持有，后者又在等待第一个线程释放它所需要的资源。这种情况下，所有涉及的线程都将永远无法继续执行。最后，编写代码时始终要考虑到并发性和线程安全性，并在可能的情况下进行充分的测试，以确保你的代码不会引发死锁或其他并发问题。，它们可以帮助你更好地控制锁的获取和释放，从而避免死锁。关键字更灵活的锁机制，包括。]]></description><category></category></item><item><title><![CDATA[数据库死锁]]></title><link>https://blog.youkuaiyun.com/vmaps/article/details/136719929</link><guid>https://blog.youkuaiyun.com/vmaps/article/details/136719929</guid><author>vmaps</author><pubDate>Thu, 14 Mar 2024 19:38:41 +0800</pubDate><description><![CDATA[总的来说，处理数据库死锁需要综合考虑数据库的设计、查询语句的优化、事务的管理等多个方面。在实际应用中，应该根据具体情况选择合适的解决方案，以确保数据库的正常运行和高效性能。数据库死锁是指两个或多个事务在执行过程中，因争夺资源而造成的一种互相等待的现象，若无外力作用，它们都将无法向前推进。数据库死锁会导致数据库的性能下降，甚至无法正常工作。]]></description><category></category></item><item><title><![CDATA[Java cas 重试流程]]></title><link>https://blog.youkuaiyun.com/vmaps/article/details/136719784</link><guid>https://blog.youkuaiyun.com/vmaps/article/details/136719784</guid><author>vmaps</author><pubDate>Thu, 14 Mar 2024 19:32:16 +0800</pubDate><description><![CDATA[当多个线程尝试同时更新同一个变量的值时，CAS操作可能会失败，因为其他线程可能已经在它之前修改了该变量的值。需要注意的是，虽然CAS操作的重试流程可以提供一种无锁的方式来处理并发更新，但在高并发环境下，频繁的失败重试可能会导致性能下降。：如果达到最大重试次数CAS操作仍未成功，线程可能需要采取其他措施，如记录日志、抛出异常或进行回退操作等，具体取决于应用程序的逻辑和需求。：如果CAS操作失败（即内存位置的当前值与预期值不同），说明有其他线程已经修改了该变量的值，此时CAS操作会返回失败。]]></description><category></category></item><item><title><![CDATA[Java反射技术与JDK动态代理]]></title><link>https://blog.youkuaiyun.com/vmaps/article/details/136719707</link><guid>https://blog.youkuaiyun.com/vmaps/article/details/136719707</guid><author>vmaps</author><pubDate>Thu, 14 Mar 2024 19:28:56 +0800</pubDate><description><![CDATA[Java反射技术允许程序在运行时通过Reflection APIs获取任意一个已知名称的class的内部信息，包括其修饰符（如public、static等）、超类（如Object）、实现的接口（如Cloneable），以及字段和方法的所有信息。总结来说，Java反射技术和JDK动态代理都是Java编程中强大的工具，它们提供了在运行时动态地操作类和对象的能力，使得Java程序更加灵活和可扩展。反射技术允许程序获取和操作类的内部信息，而JDK动态代理则可以在不修改目标代码的情况下为目标对象添加新的功能。]]></description><category></category></item><item><title><![CDATA[Cglib 与 ASM字节码]]></title><link>https://blog.youkuaiyun.com/vmaps/article/details/136719675</link><guid>https://blog.youkuaiyun.com/vmaps/article/details/136719675</guid><author>vmaps</author><pubDate>Thu, 14 Mar 2024 19:27:30 +0800</pubDate><description><![CDATA[当Cglib需要创建一个代理对象时，它会利用ASM来动态生成这个代理类的字节码，然后加载到Java虚拟机中。需要注意的是，虽然Cglib和ASM提供了强大的功能，但它们也增加了系统的复杂性。因此，在使用这些库时，需要确保对其原理和使用方法有足够的了解，以避免潜在的问题和错误。：ASM提供了丰富的API来创建、修改和分析字节码，这使得Cglib能够生成复杂的代理逻辑，满足各种复杂的业务需求。：由于Cglib底层使用了ASM，开发者在使用Cglib时无需关心底层的字节码操作细节，只需关注业务逻辑的实现即可。]]></description><category></category></item><item><title><![CDATA[Spring aop运行时织入优势原理]]></title><link>https://blog.youkuaiyun.com/vmaps/article/details/136719367</link><guid>https://blog.youkuaiyun.com/vmaps/article/details/136719367</guid><author>vmaps</author><pubDate>Thu, 14 Mar 2024 19:12:08 +0800</pubDate><description><![CDATA[综上所述，Spring AOP运行时织入的优势原理主要体现在其动态性、灵活性、解耦能力、性能开销可控、易用性、集成性以及跨平台性等方面。这些优势使得Spring AOP成为企业应用中实现面向切面编程的首选方案之一。]]></description><category></category></item><item><title><![CDATA[java string 在堆内存 存放位置]]></title><link>https://blog.youkuaiyun.com/vmaps/article/details/136547798</link><guid>https://blog.youkuaiyun.com/vmaps/article/details/136547798</guid><author>vmaps</author><pubDate>Thu, 07 Mar 2024 22:22:29 +0800</pubDate><description><![CDATA[需要注意的是，字符串常量池中的字符串对象并不是直接存储在堆内存中的对象，而是存储在常量池中的引用或指向堆中字符串对象的指针。关键字创建的字符串对象直接存储在堆内存中，而字符串常量池中的字符串引用或指针则与Java虚拟机的实现和版本有关，但通常也位于堆空间的某个部分。另一方面，字符串常量池（String Constant Pool）的存放位置在不同版本的Java虚拟机中有所不同，但总的来说，它并不直接位于堆内存或方法区的某个特定区域，而是与Java虚拟机的实现和版本有关。关键字创建的字符串对象。]]></description><category></category></item><item><title><![CDATA[reids bitmap 底层 使用string 原理]]></title><link>https://blog.youkuaiyun.com/vmaps/article/details/136547382</link><guid>https://blog.youkuaiyun.com/vmaps/article/details/136547382</guid><author>vmaps</author><pubDate>Thu, 07 Mar 2024 22:04:13 +0800</pubDate><description><![CDATA[Redis的Bitmap实际上并不是直接使用字符串（string）作为其底层数据结构。Bitmap是Redis提供的一种位图数据结构，它基于字符串实现，但使用了一种更高效的内存表示方法。需要注意的是，虽然Bitmap底层是基于字符串实现的，但Redis提供了专门的命令来操作Bitmap，使得用户无需关心其底层的实现细节。这些命令使得Bitmap的使用变得非常简单和直观。总之，Redis的Bitmap是一种基于字符串实现的高效位图数据结构，它利用位操作来提供高效的内存使用和灵活的操作方式。]]></description><category></category></item><item><title><![CDATA[java 策略模式方法 调用 模板父类方法]]></title><link>https://blog.youkuaiyun.com/vmaps/article/details/136547081</link><guid>https://blog.youkuaiyun.com/vmaps/article/details/136547081</guid><author>vmaps</author><pubDate>Thu, 07 Mar 2024 21:49:22 +0800</pubDate><description><![CDATA[然而，如果你希望在策略模式的方法中调用某个模板父类的方法，你需要确保这个模板父类的方法对策略对象是可访问的。这通常意味着模板父类方法和策略对象应该处于同一个上下文中，或者模板父类的方法应该是公共的（public）或受保护的（protected），以便策略对象可以访问它。策略模式与模板方法模式在结构上是不同的，策略模式关注的是算法的可替换性，而模板方法模式关注的是在父类中定义一个操作的算法框架，允许子类在不改变算法结构的情况下重定义某些特定步骤。通常，策略对象是完全独立的，它们不依赖于模板父类。]]></description><category></category></item><item><title><![CDATA[kafka 再平衡机制 与解决方案]]></title><link>https://blog.youkuaiyun.com/vmaps/article/details/136526811</link><guid>https://blog.youkuaiyun.com/vmaps/article/details/136526811</guid><author>vmaps</author><pubDate>Thu, 07 Mar 2024 10:35:16 +0800</pubDate><description><![CDATA[当消费者组内成员发生变更（如增加或减少消费者）、主题的分区数发生改变（目前Kafka只支持分区增加）或订阅的主题发生变化（例如，消费者使用正则表达式订阅主题，恰好增加的主题就是订阅的主题）时，就会触发再平衡机制。优化消费者组的配置：合理设置消费者组的参数，如session.timeout.ms和heartbeat.interval.ms，以避免因网络波动或消费者处理速度过慢导致的消费者被误判为宕机，从而触发不必要的再平衡。减少主题和分区的变更：尽量避免频繁的主题和分区变更操作，以减少触发再平衡的次数。]]></description><category></category></item><item><title><![CDATA[hbase的写入瓶颈原理分析 与引入消息队列的解决方案]]></title><link>https://blog.youkuaiyun.com/vmaps/article/details/136526757</link><guid>https://blog.youkuaiyun.com/vmaps/article/details/136526757</guid><author>vmaps</author><pubDate>Thu, 07 Mar 2024 10:33:52 +0800</pubDate><description><![CDATA[需要注意的是，引入消息队列虽然可以解决HBase的写入瓶颈问题，但也会增加系统的复杂性和维护成本。因此，在选择是否使用消息队列时，需要综合考虑系统的实际需求、性能要求以及维护成本等因素。HBase是一个分布式、面向列的NoSQL数据库，设计用于存储和检索大量的非结构化数据。为了解决HBase的写入瓶颈问题，可以考虑引入消息队列作为中间层，实现数据的异步写入。]]></description><category></category></item><item><title><![CDATA[hdfs 写入读取原理]]></title><link>https://blog.youkuaiyun.com/vmaps/article/details/136486825</link><guid>https://blog.youkuaiyun.com/vmaps/article/details/136486825</guid><author>vmaps</author><pubDate>Thu, 07 Mar 2024 10:26:03 +0800</pubDate><description><![CDATA[HDFS（Hadoop Distributed File System）是Hadoop生态系统中的分布式文件系统，用于存储和处理大规模数据。在HDFS中，数据被分成固定大小的块（block），这些块被复制到多个DataNode（数据节点）上以实现数据的冗余和容错。下面将分别介绍HDFS的写入和读取原理。需要注意的是，HDFS的写入和读取过程都是分布式的，涉及多个节点之间的协作和通信。同时，由于HDFS是为大规模数据处理而设计的，因此在读写过程中会进行很多优化和容错处理，以保证数据的可靠性和性能。]]></description><category></category></item><item><title><![CDATA[java 写时复制]]></title><link>https://blog.youkuaiyun.com/vmaps/article/details/136520316</link><guid>https://blog.youkuaiyun.com/vmaps/article/details/136520316</guid><author>vmaps</author><pubDate>Thu, 07 Mar 2024 10:25:35 +0800</pubDate><description><![CDATA[需要注意的是，写时复制策略并不是在所有情况下都是最佳的选择。虽然它可以提供线程安全，但每次修改操作都需要复制整个数据结构，这可能会导致大量的内存使用和可能的性能问题。因此，在选择是否使用写时复制策略时，需要根据你的具体需求和资源情况进行权衡。这种策略在数据被修改时才进行复制，在这之前，只是为读取操作提供相同的引用。使用了写时复制策略，所以原始线程（主线程）中的列表并不会被修改。当我们在新线程中修改列表时，Java会创建一个新的列表副本，并在其中进行修改。因此，原始线程中的列表仍然保持不变。]]></description><category></category></item><item><title><![CDATA[java go python 对比]]></title><link>https://blog.youkuaiyun.com/vmaps/article/details/136486781</link><guid>https://blog.youkuaiyun.com/vmaps/article/details/136486781</guid><author>vmaps</author><pubDate>Thu, 07 Mar 2024 10:25:15 +0800</pubDate><description><![CDATA[Java、Go和Python是三种不同的编程语言，它们在编译和执行方式上有着显著的区别。这些区别影响了它们的运行效率以及生态系统。综上所述，Java、Go和Python在编译与执行方式、效率以及生态系统方面各有优势。选择哪种语言取决于具体的应用场景和需求。]]></description><category></category></item><item><title><![CDATA[olap 为什么 qps 不高]]></title><link>https://blog.youkuaiyun.com/vmaps/article/details/136486221</link><guid>https://blog.youkuaiyun.com/vmaps/article/details/136486221</guid><author>vmaps</author><pubDate>Thu, 07 Mar 2024 10:24:57 +0800</pubDate><description><![CDATA[OLAP系统通常处理大量数据，并且以灵活、快速的方式进行复杂的查询操作。对于OLAP系统来说，其查询往往更为复杂，可能涉及到多表连接、聚合计算等，这些操作需要更多的计算资源和时间。此外，OLAP系统通常还会进行数据的预处理，如物化视图、索引等，以提高查询效率。因此，虽然OLAP系统可能不如OLTP系统具有高的QPS，但它们通过提供强大的分析能力和直观的数据展示，为决策支持提供了重要价值。QPS主要是一个衡量系统性能的指标，特别是在需要高吞吐量的在线交易处理（OLTP）系统中，如金融交易、电子商务等。]]></description><category></category></item></channel></rss>