<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[Android_chunhui的专栏]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/Android_chunhui</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; Android_chunhui]]></copyright><item><title><![CDATA[召回系统介绍]]></title><link>https://blog.youkuaiyun.com/Android_chunhui/article/details/144546793</link><guid>https://blog.youkuaiyun.com/Android_chunhui/article/details/144546793</guid><author>Android_chunhui</author><pubDate>Tue, 17 Dec 2024 23:58:21 +0800</pubDate><description><![CDATA[Lucene的倒排索引由 Term Index -> TermDictionary -> Posting List 三层组成，倒排检索实际上就是通过分词Term查询到倒排拉链，然后对所有拉链进行合并。Term-> Posting List，可以直接通过B+树来完成（对Term创建索引，叶子结点存储拉链的磁盘位置+长度），但是数据量较大时Term索引无法完整放在内存里，因此Lucene加了一个TermIndex，FST有限状态机转换器（类似Trie树），为了进一步压缩空间，Trie树里不存储所有Term，只包]]></description><category></category></item><item><title><![CDATA[LruCache（本地cache）生产环境中遇到的问题及改进]]></title><link>https://blog.youkuaiyun.com/Android_chunhui/article/details/144509528</link><guid>https://blog.youkuaiyun.com/Android_chunhui/article/details/144509528</guid><author>Android_chunhui</author><pubDate>Mon, 16 Dec 2024 15:23:09 +0800</pubDate><description><![CDATA[读cache时使用零拷贝机制，对缓存数据增加原子变量的引用计数，每次获取数据时引用计数+1，释放数据时-1，计数为0且达到过期时间时从cache中清除，防止内存泄漏。问题：并发读写的LruCache使用锁保护，单机qs过高时锁竞争严重，很多时间消耗在锁等待上，导致耗时增长。问题：单机qps增加时请求摘要后端，耗时也会增加，因为超过了后端处理能力（最大qps，存在任务堆积）。]]></description><category></category></item><item><title><![CDATA[向量检索原理]]></title><link>https://blog.youkuaiyun.com/Android_chunhui/article/details/144404574</link><guid>https://blog.youkuaiyun.com/Android_chunhui/article/details/144404574</guid><author>Android_chunhui</author><pubDate>Wed, 11 Dec 2024 16:44:47 +0800</pubDate><description><![CDATA[查询阶段：从指定起始点A开始，从相邻点（未访问过的）中选择m个距离查询向量Q最近的点加入到结果集中，所有相邻点加入候选队列，从候选中选择距离Q最近的点B，继续选择它最近m个相邻点，如果新发现的相邻点距离比原有结果集的更小，替换结果集中的点，重复上述过程，直到候选集中点都被访问过。距离计算方式有对称距离计算SDC和非对称距离计算ADC，q(x), q(y)是向量x，y编码后的向量，对称距离计算：离线计算出样本库中所有编码向量的距离表，实际计算x，y距离时直接查表即可，速度非常快但是放大了误差。]]></description><category></category></item><item><title><![CDATA[银行数字转文字]]></title><link>https://blog.youkuaiyun.com/Android_chunhui/article/details/144383814</link><guid>https://blog.youkuaiyun.com/Android_chunhui/article/details/144383814</guid><author>Android_chunhui</author><pubDate>Tue, 10 Dec 2024 21:10:53 +0800</pubDate><description><![CDATA[/一十二亿零四百五十万零一百零九亿一千二百零四万五千零一。//一十二亿三千四百五十六万七千八百零九。//一十二亿三千四百五十六万零九十。//一十二亿零四百五十万零一百零九。]]></description><category></category></item><item><title><![CDATA[系统设计 总结]]></title><link>https://blog.youkuaiyun.com/Android_chunhui/article/details/144105795</link><guid>https://blog.youkuaiyun.com/Android_chunhui/article/details/144105795</guid><author>Android_chunhui</author><pubDate>Thu, 28 Nov 2024 11:11:47 +0800</pubDate><description><![CDATA[缓存穿透：数据既不在缓存，也不在数据库中。一般由于业务误操作删除了缓存和数据库中数据，或者非法数据，比如恶意攻击。雪崩：大量缓存数据同时过期，或缓存服务器故障，会有大量请求同时打到数据库。击穿：属于雪崩的一种，热点数据过期或者系统资源限制被淘汰掉（lru）。]]></description><category></category></item><item><title><![CDATA[【双buffer无锁设计】]]></title><link>https://blog.youkuaiyun.com/Android_chunhui/article/details/143857197</link><guid>https://blog.youkuaiyun.com/Android_chunhui/article/details/143857197</guid><author>Android_chunhui</author><pubDate>Mon, 18 Nov 2024 15:25:52 +0800</pubDate><description><![CDATA[使用两个指针，一个指针指向当前使用的数据版本，所有读线程通过该指针读取数据，另一个是备份指针，写线程通过该指针写入，当写操作完成后对两个指针进行切换，完成数据更新。直接切换会导致读线程获取到的数据失效，甚至可能访问的无效内存导致出core，因此通过智能指针封装这两个指针，当读指针的引用计数为1没有读线程使用时切换两个指针。对于同一请求会话里中途会不会出现指针切换导致前后数据不一致，可以将数据指针（智能指针）存放在Context对象里，从Context中取用数据。【双buffer无锁设计】]]></description><category></category></item><item><title><![CDATA[性能优化篇]]></title><link>https://blog.youkuaiyun.com/Android_chunhui/article/details/139750380</link><guid>https://blog.youkuaiyun.com/Android_chunhui/article/details/139750380</guid><author>Android_chunhui</author><pubDate>Mon, 17 Jun 2024 17:42:27 +0800</pubDate><description><![CDATA[因为 ProtoBuf 采用的是 Arena 内存分配器策略，有些场景会比 C++的 Class 内存管理复杂，当有大量内存分配和释放的时候会比 Class 的性能差很多。而且 Protobuf 会不断分配和回收小内存对象，持续地分配和删除小内存对象导致产生内存碎片，降低程序的内存使用率，尤其是当协议中包含 string 类型的时候，性能差距可能有几倍。内存碎片：频繁分配和释放不同大小的对象，可能导致内存碎片，降低内存的使用效率。]]></description><category></category></item><item><title><![CDATA[lucene原理]]></title><link>https://blog.youkuaiyun.com/Android_chunhui/article/details/139720266</link><guid>https://blog.youkuaiyun.com/Android_chunhui/article/details/139720266</guid><author>Android_chunhui</author><pubDate>Sun, 16 Jun 2024 23:20:53 +0800</pubDate><description><![CDATA[一个索引中包含多个段，段与段之间相互独立。由于Lucene进行关键词检索时需要加载索引段进行下一步搜索，如果索引段较多会增加较大的I/O开销，减慢检索速度，因此写入时会通过段合并策略对不同的段进行合并。：保存了不同前缀对应的相应的Term及相应的倒排表信息，倒排表通过跳表实现快速查找，通过跳表能够跳过一些元素的方式对多条件查询交集、并集、差集之类的集合运算也提高了性能。：用于保存倒排索引Term的前缀，来快速定位.tim文件中属于这个Field的Term的位置，即上图中的aab、abd、bdc。]]></description><category></category></item><item><title><![CDATA[ubuntu22 GTX1050TI / 1060安装驱动 cuda]]></title><link>https://blog.youkuaiyun.com/Android_chunhui/article/details/139046725</link><guid>https://blog.youkuaiyun.com/Android_chunhui/article/details/139046725</guid><author>Android_chunhui</author><pubDate>Sun, 19 May 2024 18:58:29 +0800</pubDate><description><![CDATA[使用nvidia-smi命令查看安装结果。]]></description><category></category></item><item><title><![CDATA[区间相关]]></title><link>https://blog.youkuaiyun.com/Android_chunhui/article/details/137747084</link><guid>https://blog.youkuaiyun.com/Android_chunhui/article/details/137747084</guid><author>Android_chunhui</author><pubDate>Sun, 14 Apr 2024 16:06:33 +0800</pubDate><description><![CDATA[其实是要求横纵边都有交集， 横轴交际就是阴影宽，纵轴交际就是阴影高，所以。判断两区间是否有交集？]]></description><category></category></item><item><title><![CDATA[最小栈、最小队列]]></title><link>https://blog.youkuaiyun.com/Android_chunhui/article/details/137406085</link><guid>https://blog.youkuaiyun.com/Android_chunhui/article/details/137406085</guid><author>Android_chunhui</author><pubDate>Fri, 05 Apr 2024 18:39:27 +0800</pubDate><description><![CDATA[定义一种栈或队列，提供push、pop、getMin三种操作，要求平均复杂度O(1)。]]></description><category></category></item><item><title><![CDATA[螺丝螺母比较]]></title><link>https://blog.youkuaiyun.com/Android_chunhui/article/details/132610415</link><guid>https://blog.youkuaiyun.com/Android_chunhui/article/details/132610415</guid><author>Android_chunhui</author><pubDate>Thu, 31 Aug 2023 19:53:35 +0800</pubDate><description><![CDATA[【代码】螺丝螺母比较。]]></description><category></category></item><item><title><![CDATA[cacheline一致性、内存序、volatile]]></title><link>https://blog.youkuaiyun.com/Android_chunhui/article/details/131187493</link><guid>https://blog.youkuaiyun.com/Android_chunhui/article/details/131187493</guid><author>Android_chunhui</author><pubDate>Tue, 13 Jun 2023 15:33:39 +0800</pubDate><description><![CDATA[CPU cache有三级，其中L1、L2是每个core私有的，L3是公共的，cacheline是CPU cache中最小的缓存单位，CPU访问主存中某个数据时会将cache line大小的数据全部读入cache中，目前主流CPU的cacheline大小是64B，比如访问一个long数组，cpu每次会将8个值一起读到cache中，利用这个特性我们可以快速遍历连续内存的数据，比如数组；但是对于非连续性内存比如链表，每次都要从主存中读取数据。]]></description><category></category></item><item><title><![CDATA[RPC原理与实现]]></title><link>https://blog.youkuaiyun.com/Android_chunhui/article/details/130918162</link><guid>https://blog.youkuaiyun.com/Android_chunhui/article/details/130918162</guid><author>Android_chunhui</author><pubDate>Sun, 28 May 2023 23:13:31 +0800</pubDate><description><![CDATA[rpc叫做远程过程调用，是指一台机器上的服务通过通信协议调用网络中另一台机器上的程序，并拿到结果。]]></description><category></category></item><item><title><![CDATA[Redis相关知识]]></title><link>https://blog.youkuaiyun.com/Android_chunhui/article/details/130612334</link><guid>https://blog.youkuaiyun.com/Android_chunhui/article/details/130612334</guid><author>Android_chunhui</author><pubDate>Thu, 11 May 2023 23:35:51 +0800</pubDate><description><![CDATA[redis是kv存储系统，key为字符串类型，值为redis对象。由5种常用数据类型：String，List，Hash，Set，ZSet。底层没有直接使用C字符串，而是使用简单动态字符串实现。区别：（1）是二进制安全的，不会遇到'\0'而终止，可以存储图像和序列化对象；（2）结构中有表示长度的字段，获取字符串长度时间复杂度时O(1)；（3）空间不足时会自动扩容，大小小于1M时每次扩容一倍空间，大小大于等于1M时，每次扩容1M。]]></description><category></category></item><item><title><![CDATA[Kafka相关知识]]></title><link>https://blog.youkuaiyun.com/Android_chunhui/article/details/130527513</link><guid>https://blog.youkuaiyun.com/Android_chunhui/article/details/130527513</guid><author>Android_chunhui</author><pubDate>Sat, 06 May 2023 20:09:39 +0800</pubDate><description><![CDATA[将每个Topic划分为多个分区Partition，每个分区时一组有序的消息日志，分区内每条消息都会关联一个连续的数字ID即offset，生产的一条消息只会送到一个分区上。topic是逻辑概念Partition是物理概念对用户透明，生产者只需要关心消息投递到哪个topic上消费者只需要关心在哪个topic行订阅数据。为了提高每个分区的可用性，分区也存在多个副本。图中相同颜色的分区互为副本。kafka存在两种模式：pull和pull模式。]]></description><category></category></item><item><title><![CDATA[分布式相关知识]]></title><link>https://blog.youkuaiyun.com/Android_chunhui/article/details/130503687</link><guid>https://blog.youkuaiyun.com/Android_chunhui/article/details/130503687</guid><author>Android_chunhui</author><pubDate>Fri, 05 May 2023 12:13:19 +0800</pubDate><description><![CDATA[分布式环境中的锁，当多个客户端进程访问同一资源时进行并发安全的保护。]]></description><category></category></item><item><title><![CDATA[操作系统 知识点]]></title><link>https://blog.youkuaiyun.com/Android_chunhui/article/details/130360830</link><guid>https://blog.youkuaiyun.com/Android_chunhui/article/details/130360830</guid><author>Android_chunhui</author><pubDate>Wed, 03 May 2023 18:32:08 +0800</pubDate><description><![CDATA[对于32位系统虚拟内存空间有4G，其中系统内存占高位地址的1G，进程内存最多占用3G，进程内部从低位到高位依次是.data段，.bss段，堆，mmap，栈。linux系统下默认栈空间大小为10M，也就是系统最多分配300个线程（3G/10M）。线程切换时机：时间片用完；线程阻塞（如等待IO时间、sleep）线程切换后被移入就绪队列。]]></description><category></category></item><item><title><![CDATA[二分查找原理及使用场景]]></title><link>https://blog.youkuaiyun.com/Android_chunhui/article/details/130104074</link><guid>https://blog.youkuaiyun.com/Android_chunhui/article/details/130104074</guid><author>Android_chunhui</author><pubDate>Wed, 12 Apr 2023 14:46:14 +0800</pubDate><description><![CDATA[建议使用左闭右开区间[l, r)查找。二分查找的最后，索引l，r会落到右区间第一个元素位置。因此但凡是能够见数组分成左右两个区间的都能应用二分查找法。]]></description><category></category></item><item><title><![CDATA[无锁容器 c++]]></title><link>https://blog.youkuaiyun.com/Android_chunhui/article/details/129873866</link><guid>https://blog.youkuaiyun.com/Android_chunhui/article/details/129873866</guid><author>Android_chunhui</author><pubDate>Fri, 31 Mar 2023 10:25:49 +0800</pubDate><description><![CDATA[当生产者消费者数目较多时，用锁实现的线程安全容器锁竞争激烈，上下文切换严重带来较大的性能开销。无所容器实现的关键是为容器的每个槽位设置状态，拿到期望状态的线程通过CAS将状态修改，其他线程因拿不到期望状态二锁死在循环里。]]></description><category></category></item></channel></rss>