自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(11921)
  • 资源 (3)
  • 收藏
  • 关注

原创 自动获取与释放资源

"""建立数据库连接"""print(f"连接到数据库:self . connection = None self . is_connected = False def acquire_acquire(self) : """建立数据库连接""" print(f"连接到数据库: {self . db_name } ") # 模拟建立连接 self . connection = f"Connection to {

2025-12-23 08:15:28 301

原创 限时重试锁获取

这段代码是一个 Python 方法,名为 ,它属于一个类(虽然类定义没有给出)。这个方法的目的是尝试获取一个锁(可能是分布式锁,如 etcd 锁),但与普通的 方法不同,它会在超时时间内不断重试,直到成功获取锁或超时。方法定义和参数:这是一个实例方法,接受一个可选参数 ,用于指定超时时间。超时时间设置:这行代码设置了超时时间。优先级如下:如果调用方法时传入了 ,则使用传入的值。如果没有传入 ,则使用实例的 。如果 也没有设置,则使用 (这是一个常量,假设在其他地方定义)。如果

2025-12-23 08:15:24 254

原创 Etcd分布式锁释放逻辑

方法作用:释放 etcd 分布式锁,清理关联资源。参数tries(可选),表示释放锁的尝试次数,仅用于日志记录,不影响逻辑。self.lock_name = lock_name # 锁名称self.etcd_client = etcd_client # etcd客户端self._acquired = False # 锁持有状态self.lease = None # 租约对象"""判断是否持有锁""""""获取锁(关联租约)"""# 创建租约(30秒过期)# 尝试获取锁。

2025-12-23 08:15:21 454

原创 分布式锁获取

紧急订单需要更短的等待时间try:# 指定5秒超时,优先于实例的timeoutelse:# 5秒内未获取锁,快速失败# 处理etcd连接异常超时机制优先级:方法参数 > 实例属性 > 全局常量异常统一处理:所有异常都被转换为详细的日志记录:记录获取锁的各个阶段状态必须手动释放:获取锁后必须在finally块中释放非阻塞尝试:通过设置很短的timeout可以实现"尝试获取,不等待"

2025-12-23 08:15:17 240

原创 Etcd锁初始化

是在子类中调用父类的构造函数,确保父类的属性(如namettl)被正确初始化,子类再扩展自己的属性(如timeoutreason这是面向对象编程中继承机制的核心用法之一。

2025-12-23 08:15:13 305

原创 增强型Etcd分布式锁实现

这段代码实现了一个基于etcd3分布式锁的增强版锁类EtcdLock,继承自增强分布式锁的日志可观测性(记录锁的获取/释放/异常);支持超时控制和渐进式重试(每秒尝试获取锁,直到超时);提供两种使用方式:上下文管理器(with语句)和装饰器(函数调用);保证锁的最终释放(即使函数执行异常)。特性说明分布式锁基于 etcd 实现,保证多进程/多机器间的互斥渐进式重试每秒尝试获取锁,而非一次性等待超时,提升并发效率日志可观测性记录锁的获取/释放/超时/异常,便于排查问题安全释放。

2025-12-23 08:15:10 714

原创 重试次数追踪器

定义了一个名为RetryState的类,用于追踪重试状态。回调机制RetryState实例作为回调函数传递给重试装饰器状态追踪:每次重试时,重试库会自动传递当前的对象信息提取:从获取当前尝试次数应用场景记录重试日志监控重试次数收集失败统计实现复杂的重试逻辑这种模式使得重试逻辑与业务逻辑分离,便于维护和测试。

2025-12-23 08:15:07 270

原创 etcd 自动刷新令牌客户端

让你“无感”使用带认证的 etcd:token 过期 → 自动刷新 → 重试一次,业务代码完全不用改;再配合前面那套 key 前缀规范,就把“分布式锁 / 动态配置 / 服务注册”三件事全管了。

2025-12-23 08:15:04 743

原创 Django环境初始化脚本 django_setup 作用解析

你的脚本中调用了这些命令依赖 Django 环境(比如数据库连接、应用注册);初始化后,才能找到并执行这些自定义命令(比如sqlupdate可能是项目自定义的的核心是导入并执行自定义的 Django 环境初始化逻辑识别项目的配置;加载 Django 核心组件(ORM、管理命令、配置系统等);无缝使用 Django 的所有功能,避免“配置未初始化”“模块找不到”等错误。是 Django 项目的“环境启动器”,import它就是为当前脚本“开机”。

2025-12-21 08:38:15 749

原创 多Site适配SQL版本控制(Liquibase)

作为SQL版本控制工具,核心目的是解决多站点(multi-site)场景下SQL脚本的标准化执行、版本追溯和一致性管理问题。Liquibase是一款数据库版本控制工具,能追踪SQL脚本的执行状态、避免重复执行、支持多环境统一部署,而本次说明是针对ECM系统适配Liquibase的定制化规范。字段(VARCHAR(50),非空)。,实现一套脚本适配多site。:为所有site的用户表新增。:删除所有site的订单表(当执行site1的脚本时,当执行site2的脚本时,ECM 7.0版本后引入。

2025-12-21 08:38:12 656

原创 Liquibase一键删除字段全部外键

AND REFERENCED_TABLE_NAME IS NOT NULL – 只保留外键(不是普通索引)AND TABLE_SCHEMA = (SELECT DATABASE()) – 只针对当前库。WHERE TABLE_NAME = ‘order’ – 要删的表。AND COLUMN_NAME = ‘customer_id’ – 要删的字段。下面逐行拆开说明(假设 site =

2025-12-21 08:38:10 253

原创 空锁上下文管理器实现

定义类,继承自Python 2/3兼容的object(Python 3中可省略,默认继承object设计目标:模拟“锁”的行为,但无实际加锁/解锁逻辑(用于不需要真正锁的场景,比如单线程环境)。方法/特性EmptyLocker行为真实锁(如threading.Lock)行为固定返回True返回锁的实际状态(True/False)__enter__返回self,无操作加锁,返回锁实例__exit__pass(无操作)解锁lock()返回self,无操作加锁(阻塞/非阻塞)__call__

2025-12-21 08:38:07 818

原创 文档系统的分布式锁管理器

层次分明:不同资源类型有专门的锁管理器顺序一致:明确规定了获取锁的顺序粒度适当:从细粒度(单个文档)到粗粒度(整个存储)职责分离:文档、引用、文件存储各自独立锁定这种设计可以在保证数据一致性的同时,最大化系统的并发处理能力。

2025-12-21 08:38:03 372

原创 工厂方法:一行代码给锁起名字

下面逐行拆解,并给出完整可运行的示例,让你看到它到底做了什么、为什么要这样写、以及调用者怎么用。下面这段代码是一个典型的“链式调用 / 工厂方法”实现:它把当前对象(下面这个类唯一的作用就是“保存默认配置”并提供一个。原样传进构造函数,保证新实例拥有同样的“配置”。构造函数的参数,而是事后追加的“额外”属性。赋给新实例,最后把新实例返回给调用者。把配置好的实例返回,实现链式或一次性定制。四、再举一个在 Web 框架里的真实场景。)的若干属性“复制”到一个新创建的。二、再给一个“配置模板”类。

2025-12-21 08:38:00 168

原创 资源配置初始化

_init__:Python 中类的构造方法,当创建类的实例时自动调用,用于初始化实例的属性。self:必须作为第一个参数,指向当前类的实例对象,通过self可以给实例绑定属性。参数说明:prefix必选参数,无默认值,创建实例时必须传入。ttl=None可选参数,默认值为None(表示“无值/未设置”)。可选参数,默认值为None。为了让你更易理解,我们先补全类的完整定义,再通过多个场景举例说明。"""资源配置类:用于管理资源的前缀、生存时间(ttl)、超时时间(timeout)"""

2025-12-21 08:37:58 564

原创 分布式 - 基于etcd的多实例协同

name = None # 锁的标识名称ttl = None # 锁的生存时间(默认)timeout = None # 获取锁的超时时间(默认)self.prefix = prefix # 锁的前缀,用于分类self.ttl = ttl # 实例级别的默认TTLself.timeout = timeout # 实例级别的默认超时# 创建邮件发送锁管理器ttl=300, # 5分钟TTLtimeout=30 # 等待30秒获取锁# 方法1:通过withName预先配置。

2025-12-21 08:37:55 286

原创 存设置到etcd

keys:接收任意数量的位置参数,这些参数是字符串,表示要从 Django 的settings模块中读取的设置名。**others:接收任意数量的关键字参数,表示要手动指定的设置项及其值。将 Django 的设置项(或你手动指定的值)序列化后存入 etcd,便于分布式系统中共享配置。

2025-12-21 08:37:52 830

原创 带超时控制的分布式锁装饰器

功能定位:这是一个带超时控制的分布式锁装饰器,用于保护并发执行的临界区代码;核心逻辑超时优先级:实例timeout> 全局> 默认300秒;单次获取锁超时1秒,总超时由控制;无论业务成功/失败,锁都会被释放;tenacity的作用:这里未用其重试能力(),仅用其超时控制和状态回调能力;适用场景:ETCD/ZooKeeper等分布式锁场景,需要控制获取锁的总超时时间,避免无限阻塞。

2025-12-21 08:37:49 353

原创 Liquibase动态删除表外键依赖

这段脚本不直接指定外键名,而是通过查询系统表,动态生成删除语句。它查找所有引用了“${site}表名称”表中“字段名称”字段的外键,然后一次性删除它们。这避免了因外键名未知或在不同环境(开发、测试、生产)中名称不同而导致的问题。

2025-12-15 11:39:06 520

原创 动态删除表外键依赖

这段脚本不直接指定外键名,而是通过查询系统表,动态生成删除语句。它查找所有引用了“${site}表名称”表中“字段名称”字段的外键,然后一次性删除它们。这避免了因外键名未知或在不同环境(开发、测试、生产)中名称不同而导致的问题。

2025-12-15 11:31:19 895

原创 Liquibase脚本通过唯一标识一次变更

这段 Liquibase 脚本通过“author:id”唯一标识一次变更,用占位符${site}实现多租户表名前缀,附带显式回滚语句,既可以update创建表,也能rollback安全撤销,是数据库版本管理的典型模式。

2025-12-15 11:21:57 898

原创 一个changeset可以包含一条或多条SQL语句

changeset 是最小执行单元:可装 1 条或多条 SQL,执行时原子性,成功则在 databasechangelog 留 1 条记录,失败则无;databasechangelog 是“账本”:每条记录对应一个成功的 changeset,记录变更的全量信息,是 Liquibase 实现版本控制、重复执行防护的核心;灵活选择单/多条 SQL:核心是平衡“原子性”和“可追踪性”,按业务逻辑分组变更。

2025-12-15 11:08:17 767

原创 changeset中关于author字段的命名并未强制规定

在 Liquibase 的 changeset 中,关于author字段的命名,你提到的两种说法(“优先写变更说明” vs “使用人名”)其实源于不同团队的最佳实践偏好,但Liquibase官方文档本身并未强制规定必须用哪一种。关键在于。下面我为你详细解释两种方式的优缺点,并给出结论和建议。

2025-12-15 10:48:37 650

原创 Liquibase管控数据库变更

authorid:确保变更唯一,避免重复执行;:记录已执行的变更,是 Liquibase 实现「幂等执行」的核心;灵活配置参数(rollback等):适配不同变更场景(如修改、回滚)。通过这套机制,团队可以统一管理数据库变更,避免「手动改库导致环境不一致」「变更记录丢失」等问题。

2025-12-15 10:31:19 767

原创 Liquibase变更集(changeset)唯一性规则

这一对字符串的组合;其余所有内容(labels、context、comment、SQL 正文、rollback 等)都只是“附加信息”,它们可以随便改,也不会触发“重复变更集”错误。– 数据库里已经存在 (ID=1, AUTHOR=li.ming, FILENAME=xxx) 这条记录 → Liquibase 直接跳过,不会报错,也不会重新建表。– 只要这三列合起来在整张表里已经存在,Liquibase 就认为“这条变更集我已经跑过了”,不会再跑第二次。– 如果这次运行时传的是。是的,你的理解完全正确。

2025-12-15 10:24:17 338

原创 数据库版本控制与自动化迁移

这是一个的基本语法,它用于数据库版本控制和变更管理。下面我将为你逐部分详细解释,并举例说明。

2025-12-15 10:00:06 402

原创 PyCharm Markdown文件预览设置教程

若想修改预览的字体、样式等,可在语言与框架 | Markdown中配置Custom CSSLoad from:指定自定义CSS文件的路径,用于覆盖默认样式。CSS rules:直接输入CSS规则,例如,可快速调整预览的字体大小、颜色等。需要我为你整理一份PyCharm Markdown常用快捷键清单,方便你快速编辑md文件吗?

2025-12-15 09:32:59 360

原创 Liquibase 文件头校验

person 表不会被创建,DATABASECHANGELOG 里也找不到这条记录,但控制台不会抛任何“SQL 语法错误”,因为 Liquibase 直接把整文件当普通注释忽略了。——文件头一旦写错,后面所有“指令”都变成“注释”。因此文档里才会强调“必填不能修改”,否则变更集永远得不到执行与追踪。”这一行并不是写给数据库看的,而是写给 Liquibase 自己看的“文件类型声明”。下面给出一个最小可运行示例,演示“有无这一行”带来的差异———— 如果把 ① 改成下面任意一种“常见手误” ——

2025-12-15 09:27:49 178

原创 原子更新最大值

特性Lua 脚本Python 脚本原子性✅ Redis 保证❌ 需要额外机制并发安全✅ 天然支持❌ 需锁或事务性能✅ 一次网络往返❌ 多次往返复杂度✅ 简单❌ 容易出错用 Lua 脚本是为了在 Redis 单线程模型下,保证“读取-判断-写入”这个逻辑的原子性,避免并发竞争。如果你还有兴趣,我可以给你看看怎么用Redis事务(MULTI/EXEC)实现类似逻辑,以及它和 Lua 的对比。

2025-12-14 07:34:22 115

原创 Redis原子保底更新

这段代码实现了一个Redis原子操作:确保指定Redis键(key)对应的数值不小于给定值(value)。如果当前Redis中该键的数值小于目标值,则将其更新为目标值;最终返回该键的最新值。核心特点:通过Lua脚本实现Redis操作的原子性(避免多线程/多进程并发修改时的竞态条件),外层封装Python函数方便调用。endredis.call(‘命令’, 参数):Lua脚本中调用Redis命令的方式。KEYS[1]:Redis Lua脚本的键参数列表,对应Python调用时传入的第一个键参数(即。

2025-12-14 07:34:20 486

原创 种子记录并发安全初始化

这是一个用于创建种子(seed)参考记录的函数,它通过多次尝试(最多4次)来确保在数据库中创建一个唯一的种子记录。主要用于处理并发情况下可能出现的重复创建问题。幂等性:确保种子记录只创建一次容错性:通过最多4次尝试处理并发冲突可追溯性:详细的日志记录唯一性保证:依赖数据库的唯一约束确保数据一致性range(4)的选择是在成功概率和资源消耗之间的一个合理折中。

2025-12-14 07:34:17 282

原创 序号种子校准

在 Reference 表中为每一种 item_type 维护一条“种子”记录(item_uuid=“seed”),这条记录本身不对应真实业务数据,只是用来“占住” ref_seq 的最大值,保证后续真正的新记录可以顺序地拿到更大的 ref_seq。否则说明种子已经“失效”,于是把种子记录的 ref_seq 更新成“当前最大值+1”,以便重新占住坑位。把同一 item_type 且 ref_seq>0 的记录按 ref_seq 倒序排,取第一条(即当前 ref_seq 最大的那条)。

2025-12-14 07:34:14 423

原创 种子引用有效性保障

'''item_type(引用类型)。核心职责:检查该类型的种子引用是否存在,不存在则创建;若存在但“无效”(ref_seq未指向“下一个可用序号”),则修正。逻辑闭环:覆盖“不存在创建、存在校验、无效修正”全场景。并发兼容:重试机制应对并发创建冲突。日志完善:关键操作都有日志,便于问题排查。

2025-12-14 07:34:11 727

原创 引用ID标准化校验

这个函数是一个数据完整性校验和修复工具每个有效的引用对象都有ref_idref_id的长度控制在合理范围内(小于36字符)标准的UUID(36字符)应该被保留(虽然当前代码有逻辑问题)只有符合条件的对象才会被处理这样的函数在数据库维护、数据迁移、系统升级等场景中非常有用,可以确保数据的一致性和规范性。

2025-12-14 07:34:08 243

原创 站点引用前缀生成器

在当前站点上下文中,生成一个唯一的引用前缀字符串,格式为,用于区分多站点环境中的资源。如果你能告诉我你用的是什么框架(比如 Django、Flask、FastAPI),我可以给你更具体的解释和替代实现。

2025-12-14 07:34:06 259

原创 加载并校验参考ID格式配置

总结:这段代码是“配置加载+校验”的典型写法,核心目的是确保关键配置文件可用,为后续业务逻辑(如生成符合规则的参考ID)提供可靠的配置数据。(比如文件不存在、路径错误、文件为空),断言触发,程序崩溃并抛出指定错误信息;相比JSON/INI,YAML支持注释、层级结构更清晰,适合存储复杂的配置规则(如示例中的ID格式规则)。,并通过断言确保配置文件加载成功(非空),避免后续代码因配置缺失导致异常。语句的作用——提前暴露配置缺失问题,避免后续代码(如生成ID)因读取。文件,将解析后的配置数据赋值给。

2025-12-14 07:34:03 869

原创 Etcd锁死锁检测器

by pathself.reqs:按请求ID(uniqueId)组织的锁信息字典self.locks:按锁路径组织的当前持有锁的字典。

2025-12-14 07:34:01 335

原创 日志字段速拆类

理解了“位置赋值 + 二次 split”这两个小技巧,再遇到类似“固定格式日志解析”需求,就能 5 分钟写出同样紧凑的代码。下面逐行拆开讲,并给出一个完整可运行的例子,手把手演示它到底怎么把一条原始日志变成 Python 对象。“把一条已经 split 好的日志,用 3 行代码再拆成 6 个有用字段,挂到对象上。下面这段代码是一个典型的“从一行固定格式的日志里提取字段”的 Python 类。如果 reason 本身就只有一个单词会怎样?为什么用“位置赋值”而不用下标?二、一个端到端的完整例子。

2025-12-14 07:33:58 393

原创 类型支持检测

下面这段代码本身功能很清晰,但命名、可读性和可维护性还有提升空间。

2025-12-13 22:53:18 166

原创 带退避重试的引用创建器

至此,原 14 行“裸重试”代码升级为可观测、可配置、可维护的单个函数。下面给出完整的命名、封装、日志与优化方案,并附带可直接替换的代码。封装后的最终代码(含日志 & 优化)

2025-12-13 22:53:16 196

score.csv (score.csv)

load data local inpath '/export/servers/hivedatas/score.csv' into table score2 partition(year='2018',

2020-02-29

student.csv

load data local inpath '/export/servers/hivedatas/student.csv' into table student;

2020-02-29

teacher.csv

load data local inpath '/export/servers/hivedatas/student.csv' overwrite into table student;

2020-02-29

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除