news 2026/6/23 19:15:56

我的创作纪念日

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
我的创作纪念日

机缘

我成为技术创作者的初心,起初只是把笔记拍照分享到团队群,没想到大家反馈特别热烈,有人说“原来这里要注意线程安全问题”,有人追问“如果遇到跨域场景该怎么调整”。看着这些问题,我突然意识到:自己踩过的坑、总结的经验,或许能成为别人前行的“铺路石”。于是我试着把笔记整理成结构化的文章,发布在技术社区上,这便是我创作之路的起点。比起单纯的学习记录,通过文章进行技术交流的价值感,让我坚定了持续输出的决心。


收获

创作带来的收获,远超出最初的预期,既有量化的成果,更有质的提升。在粉丝积累上,不乏同领域的开发工程师、高校教师和技术面试官,这种被专业群体认可的感觉格外踏实。
数据层面,最让我印象深刻的是一篇关于“AI工厂的概念溯源与研究背景”的文章

更宝贵的是人脉积累,通过创作我认识了十多位志同道合的同行,我们组建了技术研讨群,每周分享行业动态和技术难点。这种双向的技术交流,让我的专业视野开阔了许多。


日常

如今创作早已融入我的生活,成为工作与学习的“催化剂”而非“负担”。作为一名后端开发工程师,日常工作繁忙,但我发现创作与工作其实是相辅相成的——工作中遇到的典型问题,正是创作的绝佳素材;而创作时的深度梳理,又能反过来提升工作效率。


成就

回顾创作和工作经历,最让我骄傲的一段代码,“分布式库存防超卖”核心逻辑。这段代码解决了高并发场景下的库存一致性问题,

import redis
import logging
from sqlalchemy import create_engine, Column, Integer, BigInteger
from sqlalchemy.orm import sessionmaker
from sqlalchemy.ext.declarative import declarative_base
from datetime import timedelta

初始化日志配置

logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(name)

初始化Redis连接

redis_client = redis.Redis(
host=‘localhost’,
port=6379,
db=0,
decode_responses=True # 使返回结果为字符串,便于处理
)

初始化MySQL连接(SQLAlchemy ORM)

DATABASE_URL = “mysql+pymysql://user:password@localhost:3306/ecommerce”
engine = create_engine(DATABASE_URL)
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
Base = declarative_base()

商品库存模型(对应MySQL表)

class GoodsStock(Base):
tablename= “goods_stock”

id = Column(BigInteger, primary_key=True, index=True) goods_id = Column(BigInteger, unique=True, index=True, nullable=False) stock_num = Column(Integer, nullable=False, default=0) version = Column(Integer, nullable=False, default=1) # 乐观锁版本号

自定义异常类

class BusinessException(Exception):
pass

class OptimisticLockException(Exception):
pass

def deduct_stock(goods_id: int, buy_num: int) -> bool:
“”"
分布式库存扣减核心方法
基于Redis+MySQL实现,支持高并发防超卖
:param goods_id: 商品ID
:param buy_num: 购买数量
:return: 扣减结果
“”"
redis_key = f"stock:pre:{goods_id}"
db = SessionLocal()

try: # 1. Redis预扣减(原子操作,避免分布式锁开销) # incrby支持负数,等价于Redis的DECRBY命令 pre_deduct = redis_client.incrby(redis_key, -buy_num) # 预扣减失败(库存不足),直接返回 if pre_deduct is None or pre_deduct < 0: # 回滚Redis操作 redis_client.incrby(redis_key, buy_num) logger.info(f"商品{goods_id}库存不足,请求数量{buy_num}") return False # 2. MySQL实际扣减(乐观锁防止并发更新) # 开启事务(SQLAlchemy默认开启) stock = db.query(GoodsStock).filter(GoodsStock.goods_id == goods_id).first() if not stock or stock.stock_num < buy_num: raise BusinessException("库存不足,扣减失败") # 乐观锁核心:更新时校验版本号,确保数据未被其他线程修改 update_rows = db.query(GoodsStock).filter( GoodsStock.goods_id == goods_id, GoodsStock.version == stock.version # 版本号匹配才更新 ).update({ GoodsStock.stock_num: GoodsStock.stock_num - buy_num, GoodsStock.version: GoodsStock.version + 1 # 版本号自增 }, synchronize_session=False) if update_rows == 0: raise OptimisticLockException("并发更新冲突,请重试") # 提交事务 db.commit() # 3. 扣减成功,删除Redis预扣减标记 redis_client.delete(redis_key) # 4. 更新Redis缓存库存(供查询使用,设置30分钟过期) current_stock = stock.stock_num - buy_num redis_client.setex( f"stock:current:{goods_id}", timedelta(minutes=30), current_stock ) return True except Exception as e: # 异常回滚:恢复Redis预扣减库存 + 回滚数据库事务 redis_client.incrby(redis_key, buy_num) db.rollback() logger.error(f"库存扣减异常,商品{goods_id},异常信息{str(e)}") raise e finally: # 关闭数据库连接 db.close()

def get_real_stock(goods_id: int) -> int:
“”"
库存查询兜底方法(缓存穿透防护)
:param goods_id: 商品ID
:return: 真实库存
“”"
cache_key = f"stock:current:{goods_id}"
# 1. 先查缓存
cache_stock = redis_client.get(cache_key)
if cache_stock is not None:
return int(cache_stock)

# 2. 缓存未命中,查数据库并回写缓存 db = SessionLocal() try: stock = db.query(GoodsStock).filter(GoodsStock.goods_id == goods_id).first() real_stock = stock.stock_num if stock else 0 # 设置缓存(30分钟过期) redis_client.setex(cache_key, timedelta(minutes=30), real_stock) return real_stock finally: db.close()

憧憬

在职业规划上,我希望未来3年能成长为“技术专家+优质创作者”的复合型人才。工作中深耕分布式系统和高并发架构领域,争取成为团队的技术骨干;创作上则希望打破“单点技术分享”的局限,打造更体系化的内容。

Tips

  1. 您发布的文章将会展示至 里程碑专区 ,您也可以在 专区 内查看其他创作者的纪念日文章
  2. 优质的纪念文章将会获得神秘打赏哦
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/23 16:31:21

差模干扰(Differential Mode Interference, DMI)与共模干扰(Common Mode Interference, CMI)全面解析

作为硬件工程师,在电路设计、调试(尤其是接口通信、电源系统)中必然会遇到干扰问题,其中差模干扰和共模干扰是最核心、最常见的两类干扰。本文将从 “基础定义→物理原理→产生机制→抑制方法→工程实践→衍生拓展” 展开,形成完整的知识体系,助力实际项目落地。 一、核…

作者头像 李华
网站建设 2026/6/23 14:40:52

Kotaemon PPT内容抽取:演示文稿知识化方案

Kotaemon PPT内容抽取&#xff1a;演示文稿知识化方案 在金融、咨询或医疗企业的日常运作中&#xff0c;会议室里的每一份PPT都可能藏着关键决策依据。但这些信息一旦被归档&#xff0c;往往就沉睡在共享盘的角落&#xff0c;直到某位员工偶然翻到才重见天日。这种“知识活不过…

作者头像 李华
网站建设 2026/6/23 19:53:01

Ventoy 全能启动盘制作指南:告别繁琐,拥抱高效

你是否曾经为了安装不同操作系统而反复格式化U盘&#xff1f;是否遇到过ISO文件大于4GB无法复制到FAT32分区的烦恼&#xff1f;现在&#xff0c;Ventoy为你带来了革命性的启动盘解决方案&#xff01;这款开源工具彻底改变了传统启动盘的制作方式&#xff0c;让你能够轻松管理多…

作者头像 李华
网站建设 2026/6/23 9:13:25

期末复习-改错题

文章目录 程序改错题(20分)项目结构改错题01改错题02改错题03改错题04改错题05改错题06 程序改错题(20分) 项目结构 改错题01 修改前 package ProgramDesign;public class T1{private int age;private static String name;private T1() { //构造方法}void T1(int ag…

作者头像 李华
网站建设 2026/6/23 3:26:03

小红书私域引流天花板:专属卡片 + 多号聚合,安全又高效

“刚涨的千粉账号突然被限流”“用小号私信发微信&#xff0c;转眼就收到违规警告”“手里管着5个号&#xff0c;切换设备切到手指发酸&#xff0c;消息还总漏回错回”……别慌&#xff01;小红书聚合管理系统&#xff0c;把“合规引流”和“多号一屏管”两大核心痛点一锅端&am…

作者头像 李华
网站建设 2026/6/23 22:21:21

机器学习(深度学习)与教育类比

从机器训练深度学习的角度来看&#xff0c;美国的教育类似于弱监督训练&#xff0c;而中国的教育类似于前期强监督&#xff0c;后期弱监督&#xff0c;父母在这个过程中扮演预训练模型。 比喻解析 1. 美国教育 ≈ 弱监督学习 核心逻辑&#xff1a;弱监督学习利用大量不完全、不…

作者头像 李华