Archive


Category: 程序人生

  • 回顾分布式锁

    Distributed Lock by redis 一、为什么需要分布式锁? 在分布式系统中,当多个进程/服务需要共享同一资源时,本地锁无法跨进程生效。分布式锁通过一个全局可见的"锁资源"实现互斥访问,保证同一时刻只有一个客户端能操作共享资源。 二、Redis实现分布式锁的核心方法 1. 基本加锁操作 使用SET命令的原子性参数实现: SET lock_key unique_value EX 30 NX NX:仅当键不存在时设置成功(实现互斥) EX 30:设置30秒自动过期(防止死锁) unique_value:唯一标识(如UUID),用于安全释放锁 2. 释放锁的正确姿势 通过Lua脚本保证原子性验证和删除: if redis.call("GET", KEYS[1]) == ARGV[1] then return redis.call("DEL", KEYS[1]) else return 0 end 避免误删其他客户端的锁(例如:客户端A的锁过期后,B获取锁,此时A误删B的锁)。 三、高级特性与问题解决 1. 锁续期(看门狗机制) 问题:任务执行时间超过锁过期时间,导致锁提前释放。 解决:Redisson等客户端通过后台线程定期续期(如每10秒续期一次)。 2. 可重入锁实现 原理:记录持有锁的客户端和重入次数。 示例: local counter = redis.call(“HGET”, KEYS[1], ARGV[1]) if counter then […]

  • 构造个人知识库来提高学习能力

    明确学习目标 先确定要了解的具体软件项目以及相关的领域方向,例如是做电商类项目,那就要聚焦电商系统的架构、功能模块等知识;若是移动端开发领域,就锁定对应的移动端技术知识等。 收集基础信息 向大语言模型输入项目或领域的关键名称,让它介绍基本概念、常见用途、发展历程等,像询问“请介绍下电商项目中订单管理模块的主要功能”,把得到的信息整理记录。 请它推荐相关的经典开源项目、常用技术框架以及学习资料,如书籍、优质博客等,再把这些资源收集起来。 梳理知识架构 以软件项目为例,按照项目从需求分析、设计、编码到测试等流程梳理知识;对于领域知识,则可以按照技术分类等搭建框架,如移动端开发可分安卓、iOS不同板块来梳理,然后把收集到的对应知识填充进去。 制作思维导图,让各部分知识的层级、关联更明晰直观。 深入提问拓展 针对梳理好的知识里不太明白的点,继续问大语言模型,比如某个技术框架在实际项目中如何优化性能,不同模块间怎样高效交互等,进一步完善知识库内容。 持续更新迭代 软件开发领域不断有新技术、新需求出现,定期通过大语言模型了解相关动态,把新知识补充进知识库,确保自己的知识储备能与时俱进。

  • What’s LLM

    生成式 AI 对于内容创作者来说, 既是机遇, 也是挑战。 LLM(Large Langage Model) 大语言模型之火愈演愈㤠。 国外的 ChatGPT, 国内的 Kimi 几乎成了与搜索引擎一样必不可少的工具。 AI 不但能理解我们的问题, 理解大篇幅的文本, 还能长篇累牍的生成大块文章, 还能生成图像, 视频, 音频, 这一天来得好快。 现在我写文章, 每当词穷之际, 就会求助于 LLM, 写程序, 忘了函数用法, 也不再查手册, 而去问 LLM, 但是它们是怎么做到的呢。 通过文本生成 token 想想婴儿是怎么学语言的吧, 词汇是基础 , token 就是 LLM 的词汇, BPE(Byte Paire Encoding) 算法广泛用于 LLM , 从给定的数据集中生成 token 通过 token 进行预测 以这句练打字常用的句子为例 the quick […]

  • boost asio note 2 – asynchronous agent

    An asynchronous agent is a sequential composition of asynchronous operations. Every asynchronous operation is considered to run as a part of an asynchronous agent, even if that agent contains only that single operation. An asynchronous agent is an entity that may perform work concurrently with other agents. Asynchronous agents are to asynchronous operations as threads […]

  • 前端工具链

    脚手架工具 生成模板代码,例如 yeoman 依赖管理工具 管理依赖代码,例如 bower 构建工具 预处理代码,例如 gulp

  • 10 Tips for Working at Home Like a Pro BY HELEN GALL

    top 10 tips to help keep you productive and sane. Set a schedule and stick to it. This will help you maintain work-life balance; otherwise, you might find that you’re suddenly working longer hours than usual. Create a daily routine. Get ready for work the same way you do when you’re going to the office, […]

  • Google Congestion control 的实现分析之一

    Overview 影响因素有 Packet loss, RTT 和 OWDV(One Way Delay Varion) 基于丢包的控制器:以丢包率, RTT 和 REMB 消息来估算一个目标发送码率 基于延迟的控制器:以包的到达信息,或者在接收方,或者在发送方接收反馈,估算一个最大的码率,然后传送给基于丢包的控制器 基于丢包的估算是保底的,丢包率大于 10% 就往下降码率,小于 2% 就往上升码率 基于延迟的控制器一开始用的是 Kalman filter, 后来改为 Trendline filter , 便于预测网络变化的趋势 Trendline filter 的输入参数有 Main interface method parameter description OnNetworkAvailability NetworkAvailability 当网络连接有效或无效时 OnNetworkRouteChange NetworkRouteChange 当网络地址更改时 OnProcessInterval ProcessInterval 定时回调,以检查网络 OnRemoteBitrateReport RemoteBitrateReport 当收到 REMB RTCP 消息时回调 OnRoundTripTimeUpdate RoundTripTimeUpdate 当 […]

  • The Three Rules of TDD

    Robert C. Martin (“Uncle Bob”) provides a concise set of rules for practicing TDD. Write production code only to pass a failing unit test. Write no more of a unit test than sufficient to fail (compilation failures are failures). Write no more production code than necessary to pass the one failing unit test. Rule #1 […]

  • 用 Ninja and GN 来加速 C++构建

    Ninja Ninja 原意是忍者的意思,它是一个专注于速度的小型构建工具。它是一个构建系统。 它将文件的相互依赖关系(通常是源代码和输出可执行文件)作为输入,并快速编排构建它们。 运行Ninja,默认情况下,它会在当前目录中查找名为 build.ninja 的文件并构建所有过时的目标。 您可以指定要构建的目标(文件)作为命令行参数。 还有一个特殊的语法 target^ 用于将目标指定为某个规则的第一个输出,其中包含您在命令行中输入的源(如果存在)。 例如,如果您将目标指定为 foo.c^,那么 foo.o 将被构建(假设您的构建文件中有这些目标)。 一般情况下,我们不需要手写 ninja 文件,通过 gn 或 cmake 来描述项目结构和依赖关系,再通过它们来生成 build.ninja 文件 详见Ninja 手册 – https://ninja-build.org/manual.html, Example byteorder.c #include <stdio.h> int main(int argc, char **argv) { union { short s; char c[sizeof(short)]; }un; un.s = 0x0102; if (sizeof(short) == 2) { if (un.c[0] […]

  • 模仿阿西莫夫的程序三大法则

    艾萨克·阿西莫夫(Isaac Asimov)在他的科幻小说《我,机器人》中提出的机器人学三大法则: 机器人不得伤害人类,或因不作为使人类受到伤害。 除非违背第一定律,机器人必须服从人类的命令。 除非违背第一及第二定律,机器人必须保护自己。 布鲁克林法学院的教授 Frank Pasquale《新机器人法则:在人工智能时代捍卫人类专业技能》(New Laws of Robotics: Defending Human Expertise In the Age of AI)中提出,在阿西莫夫原有的三条法则基础上应该增加四条新的法则,具体内容如下: 数字技术应该 “辅助专业人士,而不是取代他们” 人工智能和机器人系统 “不应该假冒人类”。 应防止人工智能加剧 “零和竞赛(内卷)”。 机器人和人工智能系统必须强制 “表明其创造者、控制者和所有者的身份”。 作为一个程序员,我们也可制定类似的潜规则,例如 程序员工作法则 程序必须能够正确可靠地运行。 除非违背第一定律,程序必须具有可维护性。 除非违背第一及第二定律,程序必须具有高性能和高可用性。