<?xml version="1.0" encoding="utf-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0"><channel><title>星光下的赶路人</title><link>https://forstyle.cc/zblog/</link><description></description><item><title>Django + Doris CRC32 分表实战：问题汇总与解决方案</title><link>https://forstyle.cc/zblog/post/115.html</link><description>&lt;blockquote&gt;
&lt;p&gt;一次从零到一的 Django 分表实践，记录踩过的所有坑&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;h2-u524Du8A00&quot;&gt;&lt;a name=&quot;前言&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;前言&lt;/h2&gt;&lt;p&gt;最近在做一个零售户管理系统，需要处理十亿级的数据。考虑到 Doris 的强大分析能力，使用 Doris 作为数据库，并基于 CRC32 算法实现自动分表。过程并不顺利，遇到了各种各样的问题。记录这些问题及解决方案，希望能帮助到有类似需求的开发者。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://forstyle.cc/zblog/zb_users/upload/2026/05/202605061637497499847.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h3 id=&quot;h3--1-doris-&quot;&gt;&lt;a name=&quot;问题1：Doris 数据库连接失败&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;问题1：Doris 数据库连接失败&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;错误信息：&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;django.db.utils.OperationalError: (2003, &amp;quot;Can&amp;#39;t connect to MySQL server on &amp;#39;xxx&amp;#39;&amp;quot;)&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;问题原因：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Doris 使用 MySQL 协议，但端口不是默认的 3306&lt;/li&gt;&lt;li&gt;防火墙未开放 Doris 端口&lt;/li&gt;&lt;li&gt;未安装 PyMySQL 驱动&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;解决方案：&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;# settings.py
DATABASES = {
    &amp;#39;doris&amp;#39;: {
        &amp;#39;ENGINE&amp;#39;: &amp;#39;django.db.backends.mysql&amp;#39;,
        &amp;#39;NAME&amp;#39;: &amp;#39;your_database&amp;#39;,
        &amp;#39;USER&amp;#39;: &amp;#39;your_user&amp;#39;,
        &amp;#39;PASSWORD&amp;#39;: &amp;#39;your_password&amp;#39;,
        &amp;#39;HOST&amp;#39;: &amp;#39;your_doris_host&amp;#39;,
        &amp;#39;PORT&amp;#39;: &amp;#39;9030&amp;#39;,  # Doris 默认 MySQL 协议端口
        &amp;#39;OPTIONS&amp;#39;: {
            &amp;#39;init_command&amp;#39;: &amp;quot;SET sql_mode=&amp;#39;STRICT_TRANS_TABLES&amp;#39;&amp;quot;,
            &amp;#39;charset&amp;#39;: &amp;#39;utf8mb4&amp;#39;,
        },
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;关键点：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Doris 的 MySQL 协议端口通常是 9030（不是 3306）&lt;/li&gt;&lt;li&gt;需要安装 &lt;code&gt;pymysql&lt;/code&gt;：&lt;code&gt;pip install pymysql&lt;/code&gt;&lt;/li&gt;&lt;li&gt;在 &lt;code&gt;__init__.py&lt;/code&gt; 中添加：&lt;code&gt;import pymysql; pymysql.install_as_MySQLdb()&lt;/code&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id=&quot;h3--2-nameerror-name-baselicense-is-not-defined&quot;&gt;&lt;a name=&quot;问题2：NameError: name ‘BaseLicense’ is not defined&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;问题2：NameError: name ‘BaseLicense’ is not defined&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;错误信息：&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;NameError: name &amp;#39;BaseLicense&amp;#39; is not defined&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;问题原因：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;在 &lt;code&gt;router.py&lt;/code&gt; 中使用了 &lt;code&gt;BaseLicense&lt;/code&gt; 但没有导入或定义&lt;/li&gt;&lt;li&gt;模型定义顺序导致引用问题&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;解决方案：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;方案一：在 router.py 中定义（简单但不推荐）&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;# router.py
class BaseLicense(models.Model):
    class Meta:
        abstract = True&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;方案二：分离模型和路由逻辑（推荐）&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;# models.py
class BaseLicense(models.Model):
    # 字段定义...
    class Meta:
        abstract = True

# router.py
from .models import BaseLicense  # 正确导入&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;最佳实践：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;将所有模型定义在 &lt;code&gt;models.py&lt;/code&gt; 中&lt;/li&gt;&lt;li&gt;路由逻辑单独放在 &lt;code&gt;router.py&lt;/code&gt; 或 &lt;code&gt;shard_router.py&lt;/code&gt;&lt;/li&gt;&lt;li&gt;使用明确的导入路径&lt;/li&gt;&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id=&quot;h3--3-no-such-table-t_license_8&quot;&gt;&lt;a name=&quot;问题3：no such table: t_license_8&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;问题3：no such table: t_license_8&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;错误信息：&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;django.db.utils.OperationalError: no such table: t_license_8&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;问题原因：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Django 默认使用 &lt;code&gt;default&lt;/code&gt; 数据库连接&lt;/li&gt;&lt;li&gt;&lt;code&gt;default&lt;/code&gt; 配置的是 SQLite，但实际表在 Doris 中&lt;/li&gt;&lt;li&gt;未指定使用 Doris 数据库&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;解决方案：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;方案一：每次查询指定数据库（简单直接）&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;result = model.objects.using(&amp;#39;doris&amp;#39;).get(lic_no=lic_no)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;方案二：配置数据库路由器（优雅）&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;# db_router.py
class DorisRouter:
    def db_for_read(self, model, **hints):
        if model.__name__.startswith(&amp;#39;License_&amp;#39;):
            return &amp;#39;doris&amp;#39;
        return None

# settings.py
DATABASE_ROUTERS = [&amp;#39;your_app.db_router.DorisRouter&amp;#39;]&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;知识点：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;using()&lt;/code&gt; 方法用于指定数据库&lt;/li&gt;&lt;li&gt;数据库路由器可以实现自动化路由&lt;/li&gt;&lt;li&gt;记得在 settings 中注册路由器&lt;/li&gt;&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id=&quot;h3--4-unknown-column-id-in-t_license_8-&quot;&gt;&lt;a name=&quot;问题4：Unknown column ‘id’ in ‘t_license_8’&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;问题4：Unknown column ‘id’ in ‘t_license_8’&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;错误信息：&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;django.db.utils.OperationalError: (1054, &amp;quot;errCode = 2, detailMessage = Unknown column &amp;#39;id&amp;#39; in &amp;#39;t_license_8&amp;#39;&amp;quot;)&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;问题原因：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Django 模型默认会自动添加一个名为 &lt;code&gt;id&lt;/code&gt; 的自增主键字段&lt;/li&gt;&lt;li&gt;Doris 表使用 &lt;code&gt;retailer_uuid&lt;/code&gt; 作为主键，没有 &lt;code&gt;id&lt;/code&gt; 字段&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;解决方案：&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;class BaseLicense(models.Model):
    # ✅ 必须明确指定主键字段
    retailer_uuid = models.CharField(
        max_length=96, 
        primary_key=True,  # 关键：指定为主键
        verbose_name=&amp;#39;零售户UUID&amp;#39;
    )
    lic_no = models.CharField(max_length=60, null=True)
    # ... 其他字段

    class Meta:
        abstract = True
        managed = False  # 禁止 Django 管理表结构&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;关键点：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;必须用 &lt;code&gt;primary_key=True&lt;/code&gt; 标记主键字段&lt;/li&gt;&lt;li&gt;设置 &lt;code&gt;managed = False&lt;/code&gt; 避免 Django 尝试创建/修改表&lt;/li&gt;&lt;li&gt;&lt;code&gt;abstract = True&lt;/code&gt; 让基类不创建实际表&lt;/li&gt;&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id=&quot;h3--5-object-of-type-license_t_license_8-is-not-json-serializable&quot;&gt;&lt;a name=&quot;问题5：Object of type License_t_license_8 is not JSON serializable&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;问题5：Object of type License_t_license_8 is not JSON serializable&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;错误信息：&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;TypeError: Object of type License_t_license_8 is not JSON serializable&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;问题原因：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Django ORM 返回的是模型对象，不是字典&lt;/li&gt;&lt;li&gt;JSON 序列化器无法处理 Django 模型实例&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;解决方案对比：&lt;/strong&gt;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;方案&lt;/th&gt;
&lt;th&gt;代码&lt;/th&gt;
&lt;th&gt;优点&lt;/th&gt;
&lt;th&gt;缺点&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;使用 values()&lt;/td&gt;
&lt;td&gt;&lt;code&gt;model.objects.filter().values().first()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;直接返回字典，性能好&lt;/td&gt;
&lt;td&gt;返回的是字典，不是模型实例&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;使用 model_to_dict&lt;/td&gt;
&lt;td&gt;&lt;code&gt;model_to_dict(obj)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;可转换已有模型实例&lt;/td&gt;
&lt;td&gt;需要先获取实例&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;手动构建字典&lt;/td&gt;
&lt;td&gt;&lt;code&gt;{&amp;#39;field&amp;#39;: obj.field}&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;完全可控&lt;/td&gt;
&lt;td&gt;代码冗长&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;使用 Django 序列化器&lt;/td&gt;
&lt;td&gt;&lt;code&gt;serializers.serialize(&amp;#39;json&amp;#39;, queryset)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;功能完整&lt;/td&gt;
&lt;td&gt;返回格式特殊&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;推荐方案：&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;# 方案一：直接使用 values()（推荐）
@router.get(&amp;quot;/license&amp;quot;)
def get_license(request, lic_no: str):
    model = get_model_for_license(lic_no)
    result = model.objects.using(&amp;#39;doris&amp;#39;).filter(
        lic_no=lic_no
    ).values().first()  # 直接返回字典
    return result

# 方案二：使用 model_to_dict
from django.forms.models import model_to_dict

@router.get(&amp;quot;/license&amp;quot;)
def get_license(request, lic_no: str):
    model = get_model_for_license(lic_no)
    obj = model.objects.using(&amp;#39;doris&amp;#39;).get(lic_no=lic_no)
    return model_to_dict(obj)  # 转换为字典&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
</description><pubDate>Wed, 06 May 2026 16:32:46 +0800</pubDate></item><item><title>一键删除**所有**Anaconda虚拟环境（安全、干净、彻底）</title><link>https://forstyle.cc/zblog/post/114.html</link><description>&lt;p&gt;&lt;strong&gt;最安全、最简单、直接清空所有环境&lt;/strong&gt;的方法，不用一个个删，也不会弄坏你的 base 环境。&lt;br&gt;&lt;img src=&quot;https://forstyle.cc/zblog/zb_users/upload/2026/04/202604271659364097709.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;h2--&quot;&gt;&lt;a name=&quot;核心命令（直接复制运行）&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;核心命令（直接复制运行）&lt;/h2&gt;&lt;p&gt;先打开 &lt;strong&gt;Anaconda Prompt&lt;/strong&gt;（Windows）或 &lt;strong&gt;终端&lt;/strong&gt;（Mac/Linux），执行：&lt;/p&gt;
&lt;h3 id=&quot;h3-1-&quot;&gt;&lt;a name=&quot;1. 查看所有环境（确认一下）&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;1. 查看所有环境（确认一下）&lt;/h3&gt;&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;conda env list&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;h3-2-&quot;&gt;&lt;a name=&quot;2. 批量删除所有自定义环境&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;2. 批量删除所有自定义环境&lt;/h3&gt;&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;for /f &amp;quot;skip=1 tokens=1&amp;quot; %i in (&amp;#39;conda env list ^| findstr /v &amp;quot;base&amp;quot;&amp;#39;) do conda remove -n %i --all -y&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;上面这行是 Windows 专用命令，直接复制粘贴运行即可。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;运行后它会&lt;strong&gt;自动逐个删除所有非 base 的环境&lt;/strong&gt;，全程不需要你手动确认。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;h2-mac-linux-&quot;&gt;&lt;a name=&quot;Mac / Linux 系统用这个命令&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;Mac / Linux 系统用这个命令&lt;/h2&gt;&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;conda env list | grep -v &amp;#39;base&amp;#39; | awk &amp;#39;{print $1}&amp;#39; | xargs -I {} conda remove -n {} --all -y&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;h2 id=&quot;h2-u91CDu8981u63D0u9192&quot;&gt;&lt;a name=&quot;重要提醒&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;重要提醒&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;不会删除 base 环境&lt;/strong&gt;（你的 Anaconda 本体不会坏）&lt;/li&gt;&lt;li&gt;&lt;strong&gt;不会删除 Anaconda 软件&lt;/strong&gt;&lt;/li&gt;&lt;li&gt;只删除你自己创建的所有虚拟环境&lt;/li&gt;&lt;li&gt;删完后执行 &lt;code&gt;conda env list&lt;/code&gt;，只会剩下 &lt;code&gt;base&lt;/code&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&quot;h2--&quot;&gt;&lt;a name=&quot;删完后彻底清理缓存（释放大量空间）&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;删完后彻底清理缓存（释放大量空间）&lt;/h2&gt;&lt;p&gt;环境删完后，再运行这个清理缓存，能多出几个G空间：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;conda clean -a -y&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;h3-u603Bu7ED3&quot;&gt;&lt;a name=&quot;总结&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;总结&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;Windows 用我给的 &lt;strong&gt;for /f&lt;/strong&gt; 命令一键清空所有环境&lt;/li&gt;&lt;li&gt;Mac/Linux 用对应的 bash 一键清空&lt;/li&gt;&lt;li&gt;最后用 &lt;code&gt;conda clean -a -y&lt;/code&gt; 彻底清理&lt;/li&gt;&lt;li&gt;全程安全、不会损坏 Anaconda&lt;/li&gt;&lt;/ol&gt;
</description><pubDate>Mon, 27 Apr 2026 16:52:44 +0800</pubDate></item><item><title>Django 操作 Redis 完整教程</title><link>https://forstyle.cc/zblog/post/113.html</link><description>&lt;p&gt;Redis 是一款高性能的内存数据库，Django 中常用来做&lt;strong&gt;缓存、会话存储、计数器、消息队列&lt;/strong&gt;等。下面我带你从&lt;strong&gt;安装配置 → 基础使用 → 高级操作&lt;/strong&gt;完整掌握 Django 操作 Redis 的方法。&lt;/p&gt;
&lt;h2 id=&quot;h2--&quot;&gt;&lt;a name=&quot;一、环境准备&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;一、环境准备&lt;/h2&gt;&lt;h3 id=&quot;h3-1-&quot;&gt;&lt;a name=&quot;1. 安装依赖包&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;1. 安装依赖包&lt;/h3&gt;&lt;p&gt;Django 操作 Redis 最常用的库是 &lt;code&gt;django-redis&lt;/code&gt;（官方推荐）：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;pip install django-redis redis&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;h3-2-redis&quot;&gt;&lt;a name=&quot;2. 本地/服务器启动 Redis&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;2. 本地/服务器启动 Redis&lt;/h3&gt;&lt;p&gt;确保你的设备已经安装并启动了 Redis 服务：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Windows：下载 Redis 安装包，启动 &lt;code&gt;redis-server.exe&lt;/code&gt;&lt;/li&gt;&lt;li&gt;Mac/Linux：&lt;code&gt;brew install redis&lt;/code&gt; 或 &lt;code&gt;apt install redis-server&lt;/code&gt;，执行 &lt;code&gt;redis-server&lt;/code&gt; 启动&lt;/li&gt;&lt;/ul&gt;
&lt;h2 id=&quot;h2--django-redis&quot;&gt;&lt;a name=&quot;二、Django 配置 Redis&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;二、Django 配置 Redis&lt;/h2&gt;&lt;p&gt;打开项目的 &lt;code&gt;settings.py&lt;/code&gt;，添加以下配置：&lt;/p&gt;
&lt;h3 id=&quot;h3-1-&quot;&gt;&lt;a name=&quot;1. 核心配置（最常用）&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;1. 核心配置（最常用）&lt;/h3&gt;&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;# settings.py

# 配置 Redis 为缓存后端
CACHES = {
    &amp;quot;default&amp;quot;: {
        &amp;quot;BACKEND&amp;quot;: &amp;quot;django_redis.cache.RedisCache&amp;quot;,
        # Redis 地址：格式 redis://:密码@主机:端口/数据库编号
        # 无密码：redis://127.0.0.1:6379/1
        &amp;quot;LOCATION&amp;quot;: &amp;quot;redis://127.0.0.1:6379/1&amp;quot;,
        &amp;quot;OPTIONS&amp;quot;: {
            &amp;quot;CLIENT_CLASS&amp;quot;: &amp;quot;django_redis.client.DefaultClient&amp;quot;,
            # 连接池配置（优化性能）
            &amp;quot;CONNECTION_POOL_KWARGS&amp;quot;: {&amp;quot;max_connections&amp;quot;: 100}
        }
    }
}

# 可选：将 Django 会话存储到 Redis
SESSION_ENGINE = &amp;quot;django.contrib.sessions.backends.cache&amp;quot;
SESSION_CACHE_ALIAS = &amp;quot;default&amp;quot;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;h2--&quot;&gt;&lt;a name=&quot;三、基础操作（缓存/键值对）&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;三、基础操作（缓存/键值对）&lt;/h2&gt;&lt;p&gt;&lt;code&gt;django-redis&lt;/code&gt; 封装了 Django 原生缓存 API，&lt;strong&gt;无需手动连接 Redis&lt;/strong&gt;，直接调用即可。&lt;/p&gt;
&lt;h3 id=&quot;h3-1-&quot;&gt;&lt;a name=&quot;1. 导入缓存对象&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;1. 导入缓存对象&lt;/h3&gt;&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;from django.core.cache import cache&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;h3-2-&quot;&gt;&lt;a name=&quot;2. 常用命令&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;2. 常用命令&lt;/h3&gt;&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;# 1. 设置缓存（key, value, 过期时间/秒）
cache.set(&amp;quot;username&amp;quot;, &amp;quot;zhangsan&amp;quot;, timeout=60)  # 60秒后过期
cache.set(&amp;quot;age&amp;quot;, 20)  # 不写timeout：永久有效

# 2. 获取缓存
name = cache.get(&amp;quot;username&amp;quot;)  # 存在返回值，不存在返回None
age = cache.get(&amp;quot;age&amp;quot;, 0)  # 不存在时返回默认值0

# 3. 删除缓存
cache.delete(&amp;quot;username&amp;quot;)  # 删除指定key
cache.clear()  # 清空当前数据库所有缓存（谨慎使用！）

# 4. 判断key是否存在
cache.has_key(&amp;quot;username&amp;quot;)

# 5. 自增/自减（适合做计数器、点赞数）
cache.set(&amp;quot;view_count&amp;quot;, 0)
cache.incr(&amp;quot;view_count&amp;quot;)  # +1 → 1
cache.incr(&amp;quot;view_count&amp;quot;, 5)  # +5 → 6
cache.decr(&amp;quot;view_count&amp;quot;)  # -1 → 5&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;h2--redis-&quot;&gt;&lt;a name=&quot;四、直接操作原生 Redis 命令（进阶）&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;四、直接操作原生 Redis 命令（进阶）&lt;/h2&gt;&lt;p&gt;Django 封装的 API 不够用时，可以&lt;strong&gt;获取原生 Redis 连接&lt;/strong&gt;，执行 Redis 所有原生命令（哈希、列表、集合等）。&lt;/p&gt;
&lt;h3 id=&quot;h3-1-redis-&quot;&gt;&lt;a name=&quot;1. 获取原生 Redis 客户端&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;1. 获取原生 Redis 客户端&lt;/h3&gt;&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;from django_redis import get_redis_connection

# 获取连接（使用settings.py中配置的default连接）
redis_conn = get_redis_connection(&amp;quot;default&amp;quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;h3-2-redis-&quot;&gt;&lt;a name=&quot;2. 原生 Redis 常用操作&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;2. 原生 Redis 常用操作&lt;/h3&gt;&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;# 字符串
redis_conn.set(&amp;quot;name&amp;quot;, &amp;quot;lisi&amp;quot;)
print(redis_conn.get(&amp;quot;name&amp;quot;).decode())  # 二进制转字符串

# 哈希（适合存储对象）
redis_conn.hset(&amp;quot;user:1&amp;quot;, &amp;quot;name&amp;quot;, &amp;quot;wangwu&amp;quot;)
redis_conn.hset(&amp;quot;user:1&amp;quot;, &amp;quot;age&amp;quot;, 25)
print(redis_conn.hgetall(&amp;quot;user:1&amp;quot;))  # 获取所有字段

# 列表
redis_conn.lpush(&amp;quot;task_list&amp;quot;, &amp;quot;任务1&amp;quot;)
redis_conn.rpush(&amp;quot;task_list&amp;quot;, &amp;quot;任务2&amp;quot;)
print(redis_conn.lrange(&amp;quot;task_list&amp;quot;, 0, -1))  # 获取所有元素

# 设置过期时间
redis_conn.expire(&amp;quot;user:1&amp;quot;, 300)  # 5分钟后过期

# 删除key
redis_conn.delete(&amp;quot;name&amp;quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;h2--django-redis&quot;&gt;&lt;a name=&quot;五、实战：Django 视图中使用 Redis&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;五、实战：Django 视图中使用 Redis&lt;/h2&gt;&lt;h3 id=&quot;h3--&quot;&gt;&lt;a name=&quot;示例：文章浏览量统计（防刷新）&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;示例：文章浏览量统计（防刷新）&lt;/h3&gt;&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;# views.py
from django.shortcuts import render
from django.core.cache import cache

def article_detail(request, article_id):
    # 浏览量key
    view_key = f&amp;quot;article:{article_id}:views&amp;quot;

    # 自增浏览量
    cache.incr(view_key)

    # 获取浏览量
    view_count = cache.get(view_key, 0)

    return render(request, &amp;quot;article.html&amp;quot;, {&amp;quot;views&amp;quot;: view_count})&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;h3--&quot;&gt;&lt;a name=&quot;示例：缓存热门数据（优化数据库查询）&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;示例：缓存热门数据（优化数据库查询）&lt;/h3&gt;&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;def hot_articles(request):
    # 先从缓存取
    hot_list = cache.get(&amp;quot;hot_article_list&amp;quot;)

    # 缓存不存在，查询数据库并写入缓存
    if not hot_list:
        hot_list = Article.objects.filter(is_hot=True)
        cache.set(&amp;quot;hot_article_list&amp;quot;, hot_list, timeout=60*10)  # 缓存10分钟

    return render(request, &amp;quot;hot.html&amp;quot;, {&amp;quot;articles&amp;quot;: hot_list})&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;h2--&quot;&gt;&lt;a name=&quot;六、常用场景总结&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;六、常用场景总结&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;缓存页面/数据&lt;/strong&gt;：减少数据库压力，提升响应速度&lt;/li&gt;&lt;li&gt;&lt;strong&gt;会话存储&lt;/strong&gt;：&lt;code&gt;SESSION_ENGINE&lt;/code&gt; 配置后，Django 会话自动存在 Redis&lt;/li&gt;&lt;li&gt;&lt;strong&gt;计数器&lt;/strong&gt;：点赞数、浏览量、签到统计（&lt;code&gt;incr&lt;/code&gt; 命令）&lt;/li&gt;&lt;li&gt;&lt;strong&gt;分布式锁&lt;/strong&gt;：解决高并发下的数据安全问题&lt;/li&gt;&lt;li&gt;&lt;strong&gt;消息队列&lt;/strong&gt;：配合 celery 做异步任务&lt;/li&gt;&lt;/ol&gt;
&lt;hr&gt;
&lt;h3 id=&quot;h3-u603Bu7ED3&quot;&gt;&lt;a name=&quot;总结&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;总结&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;安装：&lt;code&gt;pip install django-redis redis&lt;/code&gt;&lt;/li&gt;&lt;li&gt;配置：&lt;code&gt;settings.py&lt;/code&gt; 中配置 &lt;code&gt;CACHES&lt;/code&gt;&lt;/li&gt;&lt;li&gt;简单使用：&lt;code&gt;from django.core.cache import cache&lt;/code&gt; 调用封装方法&lt;/li&gt;&lt;li&gt;高级使用：&lt;code&gt;get_redis_connection()&lt;/code&gt; 获取原生连接，执行所有 Redis 命令&lt;/li&gt;&lt;li&gt;核心用途：缓存、计数器、会话、高并发优化&lt;/li&gt;&lt;/ol&gt;
</description><pubDate>Sat, 25 Apr 2026 09:21:59 +0800</pubDate></item><item><title>大数据处理技术方案拆分、异步、缓存、分批、冷热分离</title><link>https://forstyle.cc/zblog/post/112.html</link><description>&lt;p&gt;&lt;img src=&quot;https://forstyle.cc/zblog/zb_users/upload/2026/04/202604240956452546373.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;h2--&quot;&gt;&lt;a name=&quot;一、拆分技术（分库分表）：解决数据量膨胀瓶颈&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;一、拆分技术（分库分表）：解决数据量膨胀瓶颈&lt;/h2&gt;&lt;p&gt;核心目标：通过数据的垂直/水平拆分，突破单库单表性能上限，实现业务隔离与高效查询。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;按地市拆分（city_code）&lt;/strong&gt;&lt;ul&gt;
&lt;li&gt;逻辑：不同地市卷烟数据物理隔离，跨地市业务通过路由实现，查询天然不跨区。&lt;/li&gt;&lt;li&gt;优势：贴合烟草行业地市化运营特性，避免跨库关联，大幅提升单业务查询性能。&lt;/li&gt;&lt;/ul&gt;
&lt;/li&gt;&lt;li&gt;&lt;strong&gt;按时间拆分（周/日）&lt;/strong&gt;&lt;ul&gt;
&lt;li&gt;逻辑：订单数据按周/日粒度分表，环比同比类统计仅需查询对应周期数据。&lt;/li&gt;&lt;li&gt;优势：时间范围查询性能提升数倍，避免扫描全表数据。&lt;/li&gt;&lt;/ul&gt;
&lt;/li&gt;&lt;li&gt;&lt;strong&gt;哈希拆分（retailer_id）&lt;/strong&gt;&lt;ul&gt;
&lt;li&gt;逻辑：采用 &lt;code&gt;CRC32(retailer_id) % 64&lt;/code&gt; 哈希算法，实现零售户数据均匀分布到64个分表，全平台路由规则统一。&lt;/li&gt;&lt;li&gt;优势：避免数据倾斜，保障单零售户数据查询的高效性。&lt;/li&gt;&lt;/ul&gt;
&lt;/li&gt;&lt;li&gt;&lt;strong&gt;三层分表规则（地市 + 周 + 零售户哈希）&lt;/strong&gt;&lt;ul&gt;
&lt;li&gt;适用场景：订单表等高频写入、高频查询的核心业务表。&lt;/li&gt;&lt;li&gt;优势：兼顾业务隔离、时间查询与单主体数据查询的性能，是烟草订单场景的最佳实践。&lt;/li&gt;&lt;/ul&gt;
&lt;/li&gt;&lt;li&gt;&lt;strong&gt;多数据库兼容&lt;/strong&gt;&lt;ul&gt;
&lt;li&gt;支持MySQL、PostgreSQL、Doris、ADB等主流数据库，适配在线事务、离线分析等不同业务场景。&lt;/li&gt;&lt;/ul&gt;
&lt;/li&gt;&lt;/ol&gt;
&lt;hr&gt;
&lt;h2 id=&quot;h2--&quot;&gt;&lt;a name=&quot;二、异步处理：削峰填谷，提升系统吞吐量&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;二、异步处理：削峰填谷，提升系统吞吐量&lt;/h2&gt;&lt;p&gt;核心目标：将同步耗时操作转为异步处理，降低主链路响应时间，提升系统并发承载能力。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;消息队列MQ（Kafka/RocketMQ）&lt;/strong&gt;&lt;ul&gt;
&lt;li&gt;场景：订单削峰、业务解耦、订单入库异步化。&lt;/li&gt;&lt;li&gt;优势：抗住流量峰值，避免突发流量压垮数据库，同时实现业务模块解耦。&lt;/li&gt;&lt;/ul&gt;
&lt;/li&gt;&lt;li&gt;&lt;strong&gt;异步线程池（Java &lt;a href=&quot;https://github.com/Async&quot; title=&quot;&amp;#64;Async&quot; class=&quot;at-link&quot;&gt;@Async&lt;/a&gt; / Python ThreadPool）&lt;/strong&gt;&lt;ul&gt;
&lt;li&gt;场景：非核心业务逻辑异步执行，如日志记录、通知推送、非实时统计计算。&lt;/li&gt;&lt;li&gt;优势：主流程快速响应，后台线程池处理耗时任务，提升用户体验。&lt;/li&gt;&lt;/ul&gt;
&lt;/li&gt;&lt;li&gt;&lt;strong&gt;定时调度异步（DataWorks/XXL-Job）&lt;/strong&gt;&lt;ul&gt;
&lt;li&gt;场景：凌晨离线跑批，计算环比同比、日/周/月统计报表。&lt;/li&gt;&lt;li&gt;优势：避开业务高峰期，不影响日间业务性能，同时利用闲时资源完成大数据量计算。&lt;/li&gt;&lt;/ul&gt;
&lt;/li&gt;&lt;li&gt;&lt;strong&gt;CDC异步同步（Canal/Flink CDC）&lt;/strong&gt;&lt;ul&gt;
&lt;li&gt;场景：MySQL业务数据实时同步至Doris数仓，实现业务库与分析库的解耦。&lt;/li&gt;&lt;li&gt;优势：低延迟同步数据，业务库无额外压力，数仓可支撑复杂分析查询。&lt;/li&gt;&lt;/ul&gt;
&lt;/li&gt;&lt;li&gt;&lt;strong&gt;HTTP异步接口（DataWorks回调）&lt;/strong&gt;&lt;ul&gt;
&lt;li&gt;场景：DataWorks跑批完成后，异步调用业务系统接口推送计算结果。&lt;/li&gt;&lt;li&gt;优势：避免跑批任务阻塞，实现业务系统与调度平台的解耦。&lt;/li&gt;&lt;/ul&gt;
&lt;/li&gt;&lt;/ol&gt;
&lt;hr&gt;
&lt;h2 id=&quot;h2--&quot;&gt;&lt;a name=&quot;三、缓存技术：减少数据库访问，提升热点数据查询性能&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;三、缓存技术：减少数据库访问，提升热点数据查询性能&lt;/h2&gt;&lt;p&gt;核心目标：构建多级缓存体系，实现99%以上请求不直接访问数据库，降低数据库压力。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;本地缓存（Caffeine）&lt;/strong&gt;&lt;ul&gt;
&lt;li&gt;场景：存储字典数据、地市/卷烟白名单、配置信息等低频变更数据。&lt;/li&gt;&lt;li&gt;优势：读取速度极快，无网络开销，适合静态/半静态数据缓存。&lt;/li&gt;&lt;/ul&gt;
&lt;/li&gt;&lt;li&gt;&lt;strong&gt;分布式缓存（Redis）&lt;/strong&gt;&lt;ul&gt;
&lt;li&gt;场景：缓存零售户信息、订单详情、统计指标、热门商品数据。&lt;/li&gt;&lt;li&gt;优势：支持高并发读写，可设置过期时间，实现数据共享与一致性控制。&lt;/li&gt;&lt;/ul&gt;
&lt;/li&gt;&lt;li&gt;&lt;strong&gt;多级缓存架构（本地 → Redis → DB）&lt;/strong&gt;&lt;ul&gt;
&lt;li&gt;逻辑：优先读取本地缓存，未命中则读取Redis，仍未命中再查询数据库，同时回写缓存。&lt;/li&gt;&lt;li&gt;优势：多层级防护，大幅降低数据库访问压力，提升整体查询性能。&lt;/li&gt;&lt;/ul&gt;
&lt;/li&gt;&lt;li&gt;&lt;strong&gt;预计算缓存&lt;/strong&gt;&lt;ul&gt;
&lt;li&gt;场景：环比同比、同档位对标等复杂统计指标，提前计算并写入Redis。&lt;/li&gt;&lt;li&gt;优势：用户查询时直接读取缓存，响应时间从秒级降至毫秒级。&lt;/li&gt;&lt;/ul&gt;
&lt;/li&gt;&lt;li&gt;&lt;strong&gt;缓存安全策略&lt;/strong&gt;&lt;ul&gt;
&lt;li&gt;防穿透/击穿/雪崩：通过布隆过滤器、互斥锁、过期时间打散等机制保障缓存稳定性。&lt;/li&gt;&lt;li&gt;主动更新：定时刷新热点数据缓存，避免缓存与数据库数据不一致。&lt;/li&gt;&lt;/ul&gt;
&lt;/li&gt;&lt;/ol&gt;
&lt;hr&gt;
&lt;h2 id=&quot;h2--&quot;&gt;&lt;a name=&quot;四、分批处理：避免全表操作，降低单次任务资源消耗&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;四、分批处理：避免全表操作，降低单次任务资源消耗&lt;/h2&gt;&lt;p&gt;核心目标：将大数据量操作拆分为多批次执行，避免锁表、超时，保障业务稳定性。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;主键分批&lt;/strong&gt;&lt;ul&gt;
&lt;li&gt;实现：通过 &lt;code&gt;WHERE id BETWEEN 1 AND 1000&lt;/code&gt; 按主键范围拆分数据，逐批处理。&lt;/li&gt;&lt;li&gt;优势：避免全表扫描，降低单次查询的IO与内存消耗。&lt;/li&gt;&lt;/ul&gt;
&lt;/li&gt;&lt;li&gt;&lt;strong&gt;游标分批&lt;/strong&gt;&lt;ul&gt;
&lt;li&gt;实现：通过 &lt;code&gt;WHERE id &amp;gt; ? LIMIT 1000&lt;/code&gt; 实现深度分页，避免OFFSET偏移量导致的性能问题。&lt;/li&gt;&lt;li&gt;优势：解决大数据量分页查询卡顿问题，实现高效分页。&lt;/li&gt;&lt;/ul&gt;
&lt;/li&gt;&lt;li&gt;&lt;strong&gt;分区分批&lt;/strong&gt;&lt;ul&gt;
&lt;li&gt;实现：按地市/分区维度拆分数据，仅扫描目标分区数据。&lt;/li&gt;&lt;li&gt;优势：结合数据库分区特性，大幅减少扫描数据量，提升处理效率。&lt;/li&gt;&lt;/ul&gt;
&lt;/li&gt;&lt;li&gt;&lt;strong&gt;调度分片&lt;/strong&gt;&lt;ul&gt;
&lt;li&gt;实现：DataWorks任务分片并行执行，例如40万零售户数据多实例并行处理。&lt;/li&gt;&lt;li&gt;优势：利用分布式调度能力，将小时级任务压缩至分钟级完成。&lt;/li&gt;&lt;/ul&gt;
&lt;/li&gt;&lt;li&gt;&lt;strong&gt;批量SQL操作&lt;/strong&gt;&lt;ul&gt;
&lt;li&gt;实现：批量INSERT/UPDATE操作，采用小事务提交，避免大事务锁表。&lt;/li&gt;&lt;li&gt;优势：减少数据库连接次数，同时避免大事务导致的锁等待与回滚风险。&lt;/li&gt;&lt;/ul&gt;
&lt;/li&gt;&lt;/ol&gt;
&lt;hr&gt;
&lt;h2 id=&quot;h2--&quot;&gt;&lt;a name=&quot;五、冷热分离：优化存储成本，提升热数据性能&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;五、冷热分离：优化存储成本，提升热数据性能&lt;/h2&gt;&lt;p&gt;核心目标：将高频访问的热数据与低频访问的冷数据分离，实现性能与成本的平衡。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;热数据（SSD存储）&lt;/strong&gt;&lt;ul&gt;
&lt;li&gt;范围：近30天订单数据、高频读写业务数据。&lt;/li&gt;&lt;li&gt;优势：SSD高IO性能保障高频查询与写入的低延迟。&lt;/li&gt;&lt;/ul&gt;
&lt;/li&gt;&lt;li&gt;&lt;strong&gt;冷数据（OSS/归档存储）&lt;/strong&gt;&lt;ul&gt;
&lt;li&gt;范围：30天以上历史订单数据、归档业务数据。&lt;/li&gt;&lt;li&gt;优势：低成本存储，大幅降低整体存储成本。&lt;/li&gt;&lt;/ul&gt;
&lt;/li&gt;&lt;li&gt;&lt;strong&gt;自动TTL策略&lt;/strong&gt;&lt;ul&gt;
&lt;li&gt;实现：Doris/ADB按时间自动将热数据转为冷数据，业务无感知。&lt;/li&gt;&lt;li&gt;优势：无需人工干预，自动完成数据冷热流转，保障业务连续性。&lt;/li&gt;&lt;/ul&gt;
&lt;/li&gt;&lt;li&gt;&lt;strong&gt;分区迁移&lt;/strong&gt;&lt;ul&gt;
&lt;li&gt;实现：按周/月分区，将过期分区自动迁移至OSS归档存储。&lt;/li&gt;&lt;li&gt;优势：结合分区特性，实现批量数据迁移，降低运维成本。&lt;/li&gt;&lt;/ul&gt;
&lt;/li&gt;&lt;li&gt;&lt;strong&gt;统一查询入口&lt;/strong&gt;&lt;ul&gt;
&lt;li&gt;实现：业务SQL无需修改，引擎自动路由冷热数据。&lt;/li&gt;&lt;li&gt;优势：对业务透明，无需改造代码即可实现冷热数据统一查询。&lt;/li&gt;&lt;/ul&gt;
&lt;/li&gt;&lt;/ol&gt;
&lt;hr&gt;
&lt;h2 id=&quot;h2-u65B9u6848u603Bu7ED3u4E0Eu843Du5730u5EFAu8BAE&quot;&gt;&lt;a name=&quot;方案总结与落地建议&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;方案总结与落地建议&lt;/h2&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;text-align:left&quot;&gt;技术方向&lt;/th&gt;
&lt;th style=&quot;text-align:left&quot;&gt;核心解决问题&lt;/th&gt;
&lt;th style=&quot;text-align:left&quot;&gt;落地优先级&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td style=&quot;text-align:left&quot;&gt;分库分表&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;数据量膨胀导致的性能瓶颈&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;高（订单等核心业务表优先）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align:left&quot;&gt;异步处理&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;高并发流量冲击、主链路响应慢&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;高（订单入库、统计计算优先）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align:left&quot;&gt;多级缓存&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;数据库访问压力大、热点数据查询慢&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;高（统计指标、基础数据优先）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align:left&quot;&gt;分批处理&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;大数据量操作超时、锁表&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;中（跑批任务、批量更新优先）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align:left&quot;&gt;冷热分离&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;存储成本高、热数据性能下降&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;中（历史订单、归档数据优先）&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;落地时建议以&lt;strong&gt;核心业务场景（如订单处理、统计报表）&lt;/strong&gt;为切入点，先搭建缓存与异步处理体系，再逐步推进分库分表与冷热分离改造，同时配套监控与压测，保障每一步改造的稳定性。&lt;/p&gt;
</description><pubDate>Fri, 24 Apr 2026 09:55:52 +0800</pubDate></item><item><title>可用的github访问工具 Watt Toolkit</title><link>https://forstyle.cc/zblog/post/111.html</link><description>&lt;p&gt;&lt;strong&gt;Watt Toolkit&lt;/strong&gt;（原名 Steam++）是一款&lt;strong&gt;开源、跨平台的多功能游戏工具箱&lt;/strong&gt;，主要面向使用 &lt;strong&gt;Steam、Epic、Uplay 等游戏平台&lt;/strong&gt; 的玩家。它旨在优化游戏平台的使用体验，尤其针对国内用户常遇到的访问慢、加载卡顿、多账号切换繁琐等问题。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;h2--watt-toolkit-&quot;&gt;&lt;a name=&quot;一、Watt Toolkit 是什么？&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;一、Watt Toolkit 是什么？&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;定位&lt;/strong&gt;：本地运行的轻量级工具，不依赖远程服务器，也不转发全局流量。&lt;/li&gt;&lt;li&gt;&lt;strong&gt;核心机制&lt;/strong&gt;：通过&lt;strong&gt;本地反向代理 + 脚本注入&lt;/strong&gt;方式，优化特定网站（如 Steam 社区、创意工坊、商店等）的访问速度和稳定性。&lt;/li&gt;&lt;li&gt;&lt;strong&gt;安全性&lt;/strong&gt;：完全开源（&lt;a href=&quot;https://github.com/BeyondDimension/SteamTools&quot;&gt;GitHub 项目&lt;/a&gt;），不接触你的账号密码或游戏文件，无广告、无捆绑、免费使用。&lt;/li&gt;&lt;li&gt;&lt;strong&gt;跨平台支持&lt;/strong&gt;：Windows、macOS、Linux，以及 Android/iOS 移动端。&lt;/li&gt;&lt;/ul&gt;
&lt;h2 id=&quot;h2--img-src-https-forstyle-cc-zblog-zb_users-upload-2026-04-202604221336502002248-png-alt-&quot;&gt;&lt;a name=&quot;&lt;img src=&quot;https://forstyle.cc/zblog/zb_users/upload/2026/04/202604221336502002248.png&quot; alt=&quot;&quot;&gt;&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;&lt;img src=&quot;https://forstyle.cc/zblog/zb_users/upload/2026/04/202604221336502002248.png&quot; alt=&quot;&quot;&gt;&lt;/h2&gt;&lt;h2 id=&quot;h2--&quot;&gt;&lt;a name=&quot;二、主要功能与用途&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;二、主要功能与用途&lt;/h2&gt;&lt;h3 id=&quot;h3-1-strong-strong-&quot;&gt;&lt;a name=&quot;1. &lt;strong&gt;网络加速&lt;/strong&gt;&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;1. &lt;strong&gt;网络加速&lt;/strong&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;加速 Steam、Epic、Discord、Twitch 等平台相关服务。&lt;/li&gt;&lt;li&gt;支持脚本注入（类似浏览器插件），可自定义网页功能（如显示隐藏内容、批量操作等）。&lt;/li&gt;&lt;/ul&gt;
&lt;h3 id=&quot;h3-2-strong-strong-&quot;&gt;&lt;a name=&quot;2. &lt;strong&gt;多账号快速切换&lt;/strong&gt;&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;2. &lt;strong&gt;多账号快速切换&lt;/strong&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;自动读取本地已登录的 Steam/Epic/Uplay 账号。&lt;/li&gt;&lt;li&gt;一键切换，无需反复输入账号密码。&lt;/li&gt;&lt;/ul&gt;
&lt;h3 id=&quot;h3-3-strong-strong-&quot;&gt;&lt;a name=&quot;3. &lt;strong&gt;游戏库存管理&lt;/strong&gt;&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;3. &lt;strong&gt;游戏库存管理&lt;/strong&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;查看并编辑 Steam 游戏库（如修改游戏名称、封面）。&lt;/li&gt;&lt;li&gt;支持家庭共享库排序与禁用。&lt;/li&gt;&lt;/ul&gt;
&lt;h3 id=&quot;h3-4-strong-steam-guard-strong-&quot;&gt;&lt;a name=&quot;4. &lt;strong&gt;本地令牌（Steam Guard）管理&lt;/strong&gt;&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;4. &lt;strong&gt;本地令牌（Steam Guard）管理&lt;/strong&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;安全存储多个账号的两步验证令牌。&lt;/li&gt;&lt;li&gt;支持扫码导入、文件导入、云同步。&lt;/li&gt;&lt;li&gt;可在移动端确认交易或登录请求。&lt;/li&gt;&lt;/ul&gt;
&lt;h3 id=&quot;h3-5-strong-strong-&quot;&gt;&lt;a name=&quot;5. &lt;strong&gt;实用游戏工具&lt;/strong&gt;&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;5. &lt;strong&gt;实用游戏工具&lt;/strong&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;强制窗口无边框化。&lt;/li&gt;&lt;li&gt;Steam 下载完成自动关机。&lt;/li&gt;&lt;li&gt;存档备份、挂卡辅助等（部分功能需配合脚本）。&lt;/li&gt;&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&quot;h2--watt-toolkit-&quot;&gt;&lt;a name=&quot;三、如何使用 Watt Toolkit？&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;三、如何使用 Watt Toolkit？&lt;/h2&gt;&lt;h3 id=&quot;h3--&quot;&gt;&lt;a name=&quot;✅ 电脑端使用步骤：&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;✅ 电脑端使用步骤：&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;下载安装&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;官网或 GitHub 发布页下载：[&lt;a href=&quot;https://steampp.net/&quot;&gt;https://steampp.net/&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;支持 Windows/macOS/Linux。&lt;/li&gt;&lt;/ul&gt;
&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;启动软件&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;首次运行会进入“网络加速”界面。&lt;/li&gt;&lt;/ul&gt;
&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;启用加速&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;勾选需要加速的服务（如 Steam 商店、社区、创意工坊）。&lt;/li&gt;&lt;li&gt;点击【一键加速】，软件会自动配置本地代理（通常监听 &lt;code&gt;127.0.0.1:端口&lt;/code&gt;）。&lt;br&gt;&lt;img src=&quot;https://forstyle.cc/zblog/zb_users/upload/2026/04/202604221339019844730.png&quot; alt=&quot;&quot;&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;配置系统/浏览器代理（可选）&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;大多数情况下，Watt Toolkit 会自动设置系统代理。&lt;/li&gt;&lt;li&gt;也可手动在浏览器或 Steam 客户端中设置 HTTP 代理为 &lt;code&gt;127.0.0.1:对应端口&lt;/code&gt;。&lt;/li&gt;&lt;/ul&gt;
&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;使用其他功能&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;切换账号：点击【账号切换】→ 选择账号。&lt;/li&gt;&lt;li&gt;管理令牌：进入【本地令牌】→ 添加 Steam 账号（扫码或导入）。&lt;/li&gt;&lt;li&gt;安装脚本：在【网络加速】→【脚本配置】→【脚本工坊】中获取增强功能。&lt;/li&gt;&lt;/ul&gt;
&lt;/li&gt;&lt;/ol&gt;
&lt;h3 id=&quot;h3--android-ios-&quot;&gt;&lt;a name=&quot;📱 手机端使用（Android/iOS）：&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;📱 手机端使用（Android/iOS）：&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;主要用于 &lt;strong&gt;Steam 令牌管理&lt;/strong&gt; 和 &lt;strong&gt;移动端加速&lt;/strong&gt;。&lt;/li&gt;&lt;li&gt;安装后可通过扫码或文件导入 Steam 令牌。&lt;/li&gt;&lt;li&gt;启动加速后，配合手机网络使用（适合在外时快速登录或确认交易）。&lt;/li&gt;&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&quot;h2--&quot;&gt;&lt;a name=&quot;四、注意事项&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;四、注意事项&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;不修改游戏文件&lt;/strong&gt;，不影响反作弊系统（如 VAC、Easy Anti-Cheat）。&lt;/li&gt;&lt;li&gt;&lt;strong&gt;无需注册账号&lt;/strong&gt;，所有数据本地存储（可选加密）。&lt;/li&gt;&lt;li&gt;&lt;strong&gt;脚本功能需谨慎使用&lt;/strong&gt;，部分脚本可能违反平台规则（建议仅用于 UI 增强）。&lt;/li&gt;&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&quot;h2-u603Bu7ED3&quot;&gt;&lt;a name=&quot;总结&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;总结&lt;/h2&gt;&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Watt Toolkit = Steam 优化器 + 多账号管家 + 本地令牌 + 轻量代理工具&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;如果你是 Steam 玩家，经常遇到：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;创意工坊打不开&lt;/li&gt;&lt;li&gt;社区加载慢&lt;/li&gt;&lt;li&gt;有多个账号来回切换麻烦&lt;/li&gt;&lt;li&gt;想安全保管 Steam 令牌&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;那么 &lt;strong&gt;Watt Toolkit 是一个值得尝试的免费开源工具&lt;/strong&gt;，能显著提升游戏平台使用体验。&lt;/p&gt;
&lt;p&gt;如需最新版下载或详细教程，可访问官网：[&lt;a href=&quot;https://steampp.net/&quot;&gt;https://steampp.net/&lt;/a&gt;)&lt;/p&gt;
</description><pubDate>Wed, 22 Apr 2026 13:33:59 +0800</pubDate></item><item><title>大数据分表实操教程</title><link>https://forstyle.cc/zblog/post/110.html</link><description>&lt;p&gt;&lt;img src=&quot;https://forstyle.cc/zblog/zb_users/upload/2026/04/202604211323008148735.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;h2--&quot;&gt;&lt;a name=&quot;一、适用场景&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;一、适用场景&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;单表数据量&lt;strong&gt;超千万/过亿&lt;/strong&gt;，查询、更新、删除缓慢&lt;/li&gt;&lt;li&gt;按&lt;strong&gt;地市、周、店铺、商品&lt;/strong&gt;多维度聚合统计&lt;/li&gt;&lt;li&gt;多地市卷烟目录不同，需&lt;strong&gt;地市隔离&lt;/strong&gt;&lt;/li&gt;&lt;li&gt;需要&lt;strong&gt;环比、同比、同档位/同业态/同面积对标&lt;/strong&gt;&lt;/li&gt;&lt;li&gt;多语言/多库（Java、Python、MySQL、PG、Doris）统一路由&lt;/li&gt;&lt;li&gt;大批量增删改查，&lt;strong&gt;避免锁表、长事务、夯库&lt;/strong&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;hr&gt;
&lt;h1 id=&quot;h1--&quot;&gt;&lt;a name=&quot;二、分表核心原则（直接背）&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;二、分表核心原则（直接背）&lt;/h1&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;查询维度 = 分表维度&lt;/strong&gt;（按什么查，就按什么分）&lt;/li&gt;&lt;li&gt;&lt;strong&gt;统计必须预计算&lt;/strong&gt;，不实时扫明细&lt;/li&gt;&lt;li&gt;&lt;strong&gt;字符串ID统一用 CRC32 + 取模&lt;/strong&gt;，全平台结果一致&lt;/li&gt;&lt;li&gt;&lt;strong&gt;三层结构：地市 + 时间 + 哈希&lt;/strong&gt;，均衡又好查&lt;/li&gt;&lt;li&gt;&lt;strong&gt;只在业务库保留近期数据&lt;/strong&gt;，历史入Doris数仓&lt;/li&gt;&lt;/ol&gt;
&lt;hr&gt;
&lt;h1 id=&quot;h1--&quot;&gt;&lt;a name=&quot;三、统一哈希算法（全平台通用）&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;三、统一哈希算法（全平台通用）&lt;/h1&gt;&lt;h2 id=&quot;h2-u76EEu6807&quot;&gt;&lt;a name=&quot;目标&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;目标&lt;/h2&gt;&lt;p&gt;字符串 &lt;code&gt;retailer_id&lt;/code&gt; 在所有系统计算出&lt;strong&gt;相同表序号&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id=&quot;h2-u7EDFu4E00u516Cu5F0F&quot;&gt;&lt;a name=&quot;统一公式&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;统一公式&lt;/h2&gt;&lt;pre&gt;&lt;code&gt;哈希值 = CRC32(retailer_id)
表序号 = 哈希值 % 分表数量（推荐 32 / 64）&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&quot;h2-u5404u5E73u53F0u5B9Eu73B0&quot;&gt;&lt;a name=&quot;各平台实现&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;各平台实现&lt;/h2&gt;&lt;h3 id=&quot;h3-1-mysql&quot;&gt;&lt;a name=&quot;1）MySQL&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;1）MySQL&lt;/h3&gt;&lt;pre&gt;&lt;code class=&quot;language-sql&quot;&gt;MOD(CRC32(retailer_id), 64)&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;h3-2-postgresql-&quot;&gt;&lt;a name=&quot;2）PostgreSQL（先建函数）&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;2）PostgreSQL（先建函数）&lt;/h3&gt;&lt;pre&gt;&lt;code class=&quot;language-sql&quot;&gt;CREATE OR REPLACE FUNCTION crc32(text) RETURNS bigint AS $$
DECLARE
    crc bigint := 4294967295;
    bytes bytea;
    i integer;
    b integer;
    j integer;
BEGIN
    bytes := convert_to($1, &amp;#39;UTF8&amp;#39;);
    FOR i IN 0 .. octet_length(bytes)-1 LOOP
        b := get_byte(bytes, i);
        crc := crc # b;
        FOR j IN 0 ..7 LOOP
            IF (crc &amp;amp; 1) &amp;lt;&amp;gt; 0 THEN
                crc := (crc &amp;gt;&amp;gt;1) # 3988292384;
            ELSE
                crc := crc &amp;gt;&amp;gt;1;
            END IF;
        END LOOP;
    END LOOP;
    RETURN (crc # 4294967295) &amp;amp; 4294967295;
END;
$$ LANGUAGE plpgsql IMMUTABLE;&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-sql&quot;&gt;MOD(crc32(retailer_id), 64)&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;h3-3-doris&quot;&gt;&lt;a name=&quot;3）Doris&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;3）Doris&lt;/h3&gt;&lt;pre&gt;&lt;code class=&quot;language-sql&quot;&gt;MOD(CRC32(retailer_id), 64)&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;h3-4-java&quot;&gt;&lt;a name=&quot;4）Java&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;4）Java&lt;/h3&gt;&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;public static int tableIndex(String retailerId, int cnt) {
    CRC32 crc32 = new CRC32();
    crc32.update(retailerId.getBytes(StandardCharsets.UTF_8));
    return (int) (crc32.getValue() % cnt);
}&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;h3-5-python&quot;&gt;&lt;a name=&quot;5）Python&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;5）Python&lt;/h3&gt;&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;import zlib
def table_index(retailer_id, cnt):
    return zlib.crc32(retailer_id.encode()) % cnt&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;h1 id=&quot;h1--&quot;&gt;&lt;a name=&quot;四、最终分表方案（直接落地）&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;四、最终分表方案（直接落地）&lt;/h1&gt;&lt;h2 id=&quot;h2-1-&quot;&gt;&lt;a name=&quot;1. 订单主表分表&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;1. 订单主表分表&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;按：地市 + 店铺哈希&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;order_main_{city_code}_{00-63}
例：order_main_410100_12&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&quot;h2-2-&quot;&gt;&lt;a name=&quot;2. 订单详情表分表（核心）&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;2. 订单详情表分表（核心）&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;按：地市 + 自然周 + 店铺哈希&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;order_item_{city_code}_{order_week}_{00-31}
例：order_item_410100_2026W16_07&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;h3--&quot;&gt;&lt;a name=&quot;为什么这么分？&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;为什么这么分？&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;地市&lt;/strong&gt;：不同商品隔离，统计不跨地市&lt;/li&gt;&lt;li&gt;&lt;strong&gt;周&lt;/strong&gt;：环比同比只查相邻周，速度极快&lt;/li&gt;&lt;li&gt;&lt;strong&gt;哈希&lt;/strong&gt;：数据均匀，单表不大，不锁表&lt;/li&gt;&lt;/ul&gt;
&lt;hr&gt;
&lt;h1 id=&quot;h1--mysql-&quot;&gt;&lt;a name=&quot;五、MySQL 建表示例（可直接执行）&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;五、MySQL 建表示例（可直接执行）&lt;/h1&gt;&lt;h2 id=&quot;h2-u8BA2u5355u8BE6u60C5u5206u8868u6A21u677F&quot;&gt;&lt;a name=&quot;订单详情分表模板&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;订单详情分表模板&lt;/h2&gt;&lt;pre&gt;&lt;code class=&quot;language-sql&quot;&gt;CREATE TABLE order_item_410100_2026W16_00 (
    id bigint primary key auto_increment,
    city_code varchar(10),
    order_week char(6),
    retailer_id varchar(32),
    order_id varchar(32),
    product_id varchar(32),
    qty int,
    amt decimal(12,2),
    create_time datetime,
    index idx_retailer_week (retailer_id, order_week),
    index idx_product (product_id)
);&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;h1 id=&quot;h1--doris-&quot;&gt;&lt;a name=&quot;六、Doris 建表示例（数仓历史明细）&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;六、Doris 建表示例（数仓历史明细）&lt;/h1&gt;&lt;pre&gt;&lt;code class=&quot;language-sql&quot;&gt;CREATE TABLE order_item_doris (
    city_code     varchar(10),
    order_week    char(6),
    retailer_id   varchar(32),
    product_id    varchar(32),
    qty           int,
    amt           decimal(12,2)
)
ENGINE=OLAP
DUPLICATE KEY(city_code, order_week, retailer_id)
PARTITION BY RANGE(order_week) (
    FROM (&amp;quot;2025W01&amp;quot;) TO (&amp;quot;2027W01&amp;quot;) EVERY (&amp;quot;W1&amp;quot;)
)
DISTRIBUTED BY HASH(city_code, retailer_id) BUCKETS 32;&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;h1 id=&quot;h1--&quot;&gt;&lt;a name=&quot;七、指标层设计（环比同比必备）&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;七、指标层设计（环比同比必备）&lt;/h1&gt;&lt;h2 id=&quot;h2-1-&quot;&gt;&lt;a name=&quot;1）商品周汇总表&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;1）商品周汇总表&lt;/h2&gt;&lt;pre&gt;&lt;code class=&quot;language-sql&quot;&gt;retailer_week_stats (
    city_code,
    order_week,
    retailer_id,
    total_qty, total_amt, product_cnt
)&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;h2-2-&quot;&gt;&lt;a name=&quot;2）圈群单品周指标表（同档位/业态/面积对标）&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;2）圈群单品周指标表（同档位/业态/面积对标）&lt;/h2&gt;&lt;pre&gt;&lt;code class=&quot;language-sql&quot;&gt;group_product_week_stats (
    city_code,
    order_week,
    group_type  varchar(16),  -- 档位/业态/面积/区域/诚信小组
    group_code  varchar(32),
    product_id  varchar(32),
    avg_qty     decimal(10,2),
    avg_price   decimal(10,2),
    retail_cnt  int
)&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;h1 id=&quot;h1--&quot;&gt;&lt;a name=&quot;八、大批量操作规范（防卡死）&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;八、大批量操作规范（防卡死）&lt;/h1&gt;&lt;h2 id=&quot;h2-1-&quot;&gt;&lt;a name=&quot;1）大批量删除&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;1）大批量删除&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;禁止&lt;/strong&gt; &lt;code&gt;delete from t where ...&lt;/code&gt; 删百万级&lt;/li&gt;&lt;li&gt;改用 &lt;strong&gt;分批删除&lt;/strong&gt;（每次 1000~2000 行）&lt;/li&gt;&lt;li&gt;历史数据直接按&lt;strong&gt;周/地市&lt;/strong&gt;归档后 DROP 分区&lt;/li&gt;&lt;/ul&gt;
&lt;h2 id=&quot;h2-2-&quot;&gt;&lt;a name=&quot;2）大批量更新&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;2）大批量更新&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;拆小事务&lt;/li&gt;&lt;li&gt;非实时用 &lt;strong&gt;MQ异步&lt;/strong&gt;&lt;/li&gt;&lt;li&gt;关闭不必要索引&lt;/li&gt;&lt;/ul&gt;
&lt;h2 id=&quot;h2-3-&quot;&gt;&lt;a name=&quot;3）查询优化&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;3）查询优化&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;禁止 &lt;code&gt;select *&lt;/code&gt;、禁止深分页&lt;/li&gt;&lt;li&gt;高频指标放入 &lt;strong&gt;Redis&lt;/strong&gt;&lt;/li&gt;&lt;li&gt;统计走 &lt;strong&gt;Doris&lt;/strong&gt;，不打业务库&lt;/li&gt;&lt;/ul&gt;
&lt;hr&gt;
&lt;h1 id=&quot;h1--&quot;&gt;&lt;a name=&quot;九、整套流程总结&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;九、整套流程总结&lt;/h1&gt;&lt;ol&gt;
&lt;li&gt;字符串ID统一用 &lt;strong&gt;CRC32(retailer_id) % 64&lt;/strong&gt;&lt;/li&gt;&lt;li&gt;订单详情按 &lt;strong&gt;地市 + 周 + 哈希&lt;/strong&gt; 三层分表&lt;/li&gt;&lt;li&gt;MySQL 存近期数据，Doris 存全量历史&lt;/li&gt;&lt;li&gt;每周跑批生成 &lt;strong&gt;户汇总 + 圈群单品指标&lt;/strong&gt;&lt;/li&gt;&lt;li&gt;前端查指标表，&lt;strong&gt;毫秒级出环比/同比/对标&lt;/strong&gt;&lt;/li&gt;&lt;li&gt;增删改查全平台路由结果一致，不乱表&lt;/li&gt;&lt;/ol&gt;
</description><pubDate>Tue, 21 Apr 2026 11:45:21 +0800</pubDate></item><item><title>服务器未开放80和443端口情况下使用caddy开启https访问</title><link>https://forstyle.cc/zblog/post/109.html</link><description>&lt;p&gt;前提：服务器需要能访问外网，且有个能解析的域名，并且在阿里云RAM用户获取AccessKey 和 accesskeysecret&lt;/p&gt;
&lt;p&gt;下载源码xcaddy&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/caddyserver/xcaddy&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;github地址&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;解压并编译带dns插件的caddy包，我这里服务器是Ubuntu的，但是电脑是windows11的，所以需要交叉编译下&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://forstyle.cc/zblog/zb_users/upload/2026/01/20260119173006176881500698098.png&quot; /&gt;&lt;/p&gt;
&lt;p&gt;安装golang，网上很多，下载下来直接安装就可以&lt;/p&gt;
&lt;p&gt;查看版本，确认安装&lt;/p&gt;
&lt;pre class=&quot;language-markup&quot;&gt;&lt;code&gt;PS D:\code\xcaddy\cmd&amp;gt; go version
go version go1.25.6 windows/amd64&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;使用国内go代理&lt;/p&gt;
&lt;pre class=&quot;language-markup&quot;&gt;&lt;code&gt;setx GOPROXY https://goproxy.cn,direct
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;再打开命令行，安装xcaddy&lt;/p&gt;
&lt;pre class=&quot;language-markup&quot;&gt;&lt;code&gt;go clean -modcache
go install github.com/caddyserver/xcaddy/cmd/xcaddy@latest&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;https://forstyle.cc/zblog/zb_users/upload/2026/01/20260119173647176881540740377.png&quot; /&gt;&lt;/p&gt;
&lt;p&gt;直接打包windows版本&lt;/p&gt;
&lt;pre class=&quot;language-markup&quot;&gt;&lt;code&gt;xcaddy build --with github.com/caddy-dns/alidns&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;日志，第一次编译有点慢&lt;/p&gt;
&lt;pre class=&quot;language-markup&quot;&gt;&lt;code&gt;PS D:\code\xcaddy\cmd&amp;gt; xcaddy build --with github.com/caddy-dns/alidns
2026/01/19 15:28:30 [INFO] absolute output file path: D:\code\xcaddy\cmd\caddy.exe
2026/01/19 15:28:31 [INFO] Temporary folder: C:\Users\ADMINI~1\AppData\Local\Temp\buildenv_2026-01-19-1528.2530769539
2026/01/19 15:28:31 [INFO] Writing main module: C:\Users\ADMINI~1\AppData\Local\Temp\buildenv_2026-01-19-1528.2530769539\main.go
package main

import (
        caddycmd &quot;github.com/caddyserver/caddy/v2/cmd&quot;

        // plug in Caddy modules here
        _ &quot;github.com/caddyserver/caddy/v2/modules/standard&quot;
        _ &quot;github.com/caddy-dns/alidns&quot;
)

func main() {
        caddycmd.Main()
}
2026/01/19 15:28:31 [INFO] Initializing Go module
2026/01/19 15:28:31 [INFO] exec (timeout=0s): C:\Program Files\Go\bin\go.exe mod init caddy
go: creating new go.mod: module caddy
go: to add module requirements and sums:
        go mod tidy
2026/01/19 15:28:31 [INFO] Pinning versions
2026/01/19 15:28:31 [INFO] exec (timeout=0s): C:\Program Files\Go\bin\go.exe get -v github.com/caddyserver/caddy/v2
go: downloading github.com/caddyserver/caddy v1.0.5
go: downloading github.com/caddyserver/caddy/v2 v2.10.2
go: downloading github.com/caddyserver/certmagic v0.24.0
go: downloading github.com/cespare/xxhash/v2 v2.3.0
go: downloading github.com/google/uuid v1.6.0
go: downloading github.com/prometheus/client_golang v1.23.0
go: downloading github.com/quic-go/quic-go v0.54.0
go: downloading golang.org/x/sys v0.34.0
go: downloading go.uber.org/zap/exp v0.3.0
go: downloading go.uber.org/zap v1.27.0
go: downloading golang.org/x/term v0.33.0
go: downloading golang.org/x/time v0.12.0
go: downloading github.com/cespare/xxhash v1.1.0
go: downloading go.uber.org/multierr v1.11.0
go: downloading google.golang.org/protobuf v1.36.6
go: downloading github.com/beorn7/perks v1.0.1
go: downloading github.com/prometheus/procfs v0.16.1
go: downloading github.com/prometheus/client_model v0.6.2
go: downloading github.com/prometheus/common v0.65.0
go: downloading github.com/caddyserver/zerossl v0.1.3
go: downloading github.com/klauspost/cpuid/v2 v2.3.0
go: downloading github.com/libdns/libdns v1.1.0
go: downloading github.com/mholt/acmez/v3 v3.1.2
go: downloading github.com/miekg/dns v1.1.63
go: downloading github.com/zeebo/blake3 v0.2.4
go: downloading golang.org/x/crypto v0.40.0
go: downloading golang.org/x/net v0.42.0
go: downloading github.com/quic-go/qpack v0.5.1
go: downloading go.uber.org/mock v0.5.2
go: downloading github.com/francoispqt/gojay v1.2.13
go: downloading github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822
go: downloading golang.org/x/tools v0.34.0
go: downloading golang.org/x/mod v0.25.0
go: downloading golang.org/x/text v0.27.0
go: downloading golang.org/x/sync v0.16.0
go: added github.com/beorn7/perks v1.0.1
go: added github.com/caddyserver/caddy/v2 v2.10.2
go: added github.com/caddyserver/certmagic v0.24.0
go: added github.com/caddyserver/zerossl v0.1.3
go: added github.com/cespare/xxhash/v2 v2.3.0
go: added github.com/francoispqt/gojay v1.2.13
go: added github.com/google/uuid v1.6.0
go: added github.com/klauspost/cpuid/v2 v2.3.0
go: added github.com/libdns/libdns v1.1.0
go: added github.com/mholt/acmez/v3 v3.1.2
go: added github.com/miekg/dns v1.1.63
go: added github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822
go: added github.com/prometheus/client_golang v1.23.0
go: added github.com/prometheus/client_model v0.6.2
go: added github.com/prometheus/common v0.65.0
go: added github.com/prometheus/procfs v0.16.1
go: added github.com/quic-go/qpack v0.5.1
go: added github.com/quic-go/quic-go v0.54.0
go: added github.com/zeebo/blake3 v0.2.4
go: added go.uber.org/mock v0.5.2
go: added go.uber.org/multierr v1.11.0
go: added go.uber.org/zap v1.27.0
go: added go.uber.org/zap/exp v0.3.0
go: added golang.org/x/crypto v0.40.0
go: added golang.org/x/mod v0.25.0
go: added golang.org/x/net v0.42.0
go: added golang.org/x/sync v0.16.0
go: added golang.org/x/sys v0.34.0
go: added golang.org/x/term v0.33.0
go: added golang.org/x/text v0.27.0
go: added golang.org/x/time v0.12.0
go: added golang.org/x/tools v0.34.0
go: added google.golang.org/protobuf v1.36.6
2026/01/19 15:28:42 [INFO] exec (timeout=0s): C:\Program Files\Go\bin\go.exe get -v github.com/caddy-dns/alidns github.com/caddyserver/caddy/v2
go: downloading github.com/caddy-dns/alidns v1.0.26
go: downloading github.com/libdns/alidns v1.0.4-libdns.v1.beta1
go: added github.com/caddy-dns/alidns v1.0.26
go: added github.com/libdns/alidns v1.0.4-libdns.v1.beta1
2026/01/19 15:28:46 [INFO] exec (timeout=0s): C:\Program Files\Go\bin\go.exe get -v
go: downloading github.com/aryann/difflib v0.0.0-20210328193216-ff5ff6dc229b
go: downloading github.com/KimMachineGun/automemlimit v0.7.4
go: downloading github.com/dustin/go-humanize v1.0.1
go: downloading github.com/go-chi/chi/v5 v5.2.2
go: downloading github.com/smallstep/certificates v0.28.4
go: downloading github.com/spf13/pflag v1.0.7
go: downloading github.com/cloudflare/circl v1.6.1
go: downloading go.uber.org/automaxprocs v1.6.0
go: downloading github.com/smallstep/truststore v0.13.0
go: downloading gopkg.in/natefinch/lumberjack.v2 v2.2.1
protocol error: received DATA after END_STREAM
go: downloading go.step.sm/crypto v0.67.0
go: downloading golang.org/x/crypto/x509roots/fallback v0.0.0-20250305170421-49bf5b80c810
go: downloading github.com/smallstep/nosql v0.7.0
go: downloading github.com/tailscale/tscert v0.0.0-20240608151842-d3f834017e53
go: downloading github.com/google/cel-go v0.26.0
go: downloading github.com/klauspost/compress v1.18.0
go: downloading github.com/cpuguy83/go-md2man/v2 v2.0.7
go: downloading gopkg.in/yaml.v3 v3.0.1
go: downloading howett.net/plist v1.0.0
go: downloading github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58
go: downloading github.com/pires/go-proxyproto v0.8.1
go: downloading github.com/Masterminds/sprig/v3 v3.3.0
go: downloading github.com/yuin/goldmark v1.7.13
go: downloading github.com/alecthomas/chroma/v2 v2.20.0
go: downloading github.com/BurntSushi/toml v1.5.0
go: downloading github.com/yuin/goldmark-highlighting/v2 v2.0.0-20230729083705-37449abec8cc
go: downloading go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.61.0
go: downloading go.opentelemetry.io/contrib/propagators/autoprop v0.62.0
go: downloading go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.37.0
go: downloading go.opentelemetry.io/otel v1.37.0
go: downloading go.opentelemetry.io/otel/sdk v1.37.0
go: downloading go.opentelemetry.io/otel/trace v1.37.0
go: downloading github.com/coreos/go-oidc/v3 v3.14.1
go: downloading github.com/fxamacker/cbor/v2 v2.8.0
go: downloading github.com/google/go-tpm v0.9.5
go: downloading github.com/pkg/errors v0.9.1
go: downloading github.com/smallstep/go-attestation v0.4.4-0.20241119153605-2306d5b464ca
go: downloading golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0
go: downloading github.com/smallstep/linkedca v0.23.0
go: downloading github.com/smallstep/cli-utils v0.12.1
go: downloading go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.37.0
go: downloading google.golang.org/grpc v1.73.0
go: downloading github.com/slackhq/nebula v1.9.5
go: downloading cel.dev/expr v0.24.0
go: downloading google.golang.org/genproto/googleapis/api v0.0.0-20250603155806-513f23925822
go: downloading github.com/stoewer/go-strcase v1.2.0
go: downloading github.com/antlr4-go/antlr/v4 v4.13.0
go: downloading dario.cat/mergo v1.0.1
go: downloading github.com/Masterminds/goutils v1.1.1
go: downloading github.com/Masterminds/semver/v3 v3.3.0
go: downloading github.com/huandu/xstrings v1.5.0
go: downloading github.com/mitchellh/copystructure v1.2.0
go: downloading github.com/shopspring/decimal v1.4.0
go: downloading github.com/spf13/cast v1.7.0
go: downloading github.com/russross/blackfriday/v2 v2.1.0
go: downloading github.com/ccoveille/go-safecast v1.6.1
go: downloading github.com/go-jose/go-jose/v3 v3.0.4
go: downloading github.com/felixge/httpsnoop v1.0.4
go: downloading go.opentelemetry.io/otel/metric v1.37.0
go: downloading github.com/sirupsen/logrus v1.9.3
go: downloading github.com/smallstep/pkcs7 v0.2.1
go: downloading github.com/smallstep/scep v0.0.0-20240926084937-8cf1ca453101
go: downloading github.com/go-jose/go-jose/v4 v4.0.5
go: downloading golang.org/x/oauth2 v0.30.0
go: downloading go.opentelemetry.io/contrib/propagators/aws v1.37.0
go: downloading go.opentelemetry.io/contrib/propagators/b3 v1.37.0
go: downloading go.opentelemetry.io/contrib/propagators/jaeger v1.37.0
go: downloading go.opentelemetry.io/contrib/propagators/ot v1.37.0
go: downloading google.golang.org/genproto v0.0.0-20190306203927-b5d61aea6440
go: downloading github.com/x448/float16 v0.8.4
go: downloading google.golang.org/api v0.240.0
go: downloading github.com/russross/blackfriday v1.5.2
go: downloading github.com/rs/xid v1.6.0
go: downloading filippo.io/edwards25519 v1.1.0
go: downloading github.com/Microsoft/go-winio v0.6.0
go: downloading github.com/mitchellh/go-ps v1.0.0
go: downloading github.com/google/go-tspi v0.3.0
go: downloading github.com/urfave/cli v1.22.17
go: downloading github.com/chzyer/readline v1.5.1
go: downloading github.com/manifoldco/promptui v0.9.0
go: downloading google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.5.1
go: downloading github.com/dgraph-io/badger v1.6.2
go: downloading github.com/dgraph-io/badger/v2 v2.2007.4
go: downloading go.etcd.io/bbolt v1.3.10
go: downloading github.com/go-sql-driver/mysql v1.8.1
go: downloading github.com/jackc/pgx/v5 v5.6.0
go: downloading github.com/mitchellh/reflectwalk v1.0.2
go: downloading github.com/dlclark/regexp2 v1.11.5
go: downloading go.opentelemetry.io/proto/otlp v1.7.0
go: downloading google.golang.org/genproto/googleapis/rpc v0.0.0-20250603155806-513f23925822
go: downloading github.com/go-logr/logr v1.4.3
go: downloading github.com/go-logr/stdr v1.2.2
go: downloading go.opentelemetry.io/auto/sdk v1.1.0
go: downloading github.com/dgraph-io/ristretto v0.2.0
go: downloading github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13
go: downloading github.com/golang/protobuf v1.5.4
go: downloading github.com/cenkalti/backoff/v5 v5.0.2
go: downloading github.com/google/certificate-transparency-go v1.1.8-0.20240110162603-74a5dd331745
go: downloading github.com/golang/snappy v0.0.4
go: downloading github.com/AndreasBriese/bbloom v0.0.0-20190825152654-46b345b51c96
go: downloading github.com/mgutz/ansi v0.0.0-20200706080929-d51e80ef957d
go: downloading github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.1
go: downloading github.com/jackc/pgpassfile v1.0.0
go: downloading github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a
go: downloading github.com/jackc/puddle/v2 v2.2.1
go: downloading github.com/shurcooL/sanitized_anchor_name v1.0.0
go: downloading github.com/mattn/go-colorable v0.1.13
go: downloading github.com/mattn/go-isatty v0.0.20
go: downloading github.com/grpc-ecosystem/grpc-gateway v1.5.0
go: downloading github.com/googleapis/enterprise-certificate-proxy v0.3.6
go: downloading cloud.google.com/go/auth/oauth2adapt v0.2.8
go: downloading cloud.google.com/go/auth v0.16.2
go: downloading cloud.google.com/go/compute/metadata v0.7.0
go: downloading github.com/google/s2a-go v0.1.9
go: downloading github.com/googleapis/gax-go/v2 v2.14.2
go: downloading cloud.google.com/go v0.37.0
go: downloading github.com/googleapis/gax-go v2.0.0+incompatible
go: downloading google.golang.org/genproto v0.0.0-20250505200425-f936aa4a68b2
go: downloading cloud.google.com/go/compute v1.23.3
go: downloading cloud.google.com/go v0.120.0
2026/01/19 15:29:12 [INFO] Build environment ready
2026/01/19 15:29:12 [INFO] exec (timeout=0s): C:\Program Files\Go\bin\go.exe list -m github.com/caddyserver/caddy/v2
2026/01/19 15:29:12 [INFO] Building Caddy
2026/01/19 15:29:12 [INFO] exec (timeout=0s): C:\Program Files\Go\bin\go.exe mod tidy -e
go: downloading github.com/stretchr/testify v1.10.0
go: downloading go.uber.org/goleak v1.3.0
go: downloading github.com/smallstep/assert v0.0.0-20200723003110-82e2b9b3b262
go: downloading github.com/google/go-cmp v0.7.0
go: downloading github.com/kylelemons/godebug v1.1.0
go: downloading github.com/prashantv/gostub v1.1.0
go: downloading gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c
go: downloading github.com/zeebo/assert v1.3.0
go: downloading go.opentelemetry.io/otel/sdk/metric v1.36.0
go: downloading github.com/alecthomas/assert/v2 v2.11.0
go: downloading github.com/google/go-tpm-tools v0.4.5
go: downloading github.com/peterbourgon/diskv/v3 v3.0.1
go: downloading github.com/schollz/jsonstore v1.1.0
go: downloading github.com/aws/aws-sdk-go-v2/config v1.29.16
go: downloading github.com/aws/aws-sdk-go-v2/service/kms v1.41.0
go: downloading cloud.google.com/go/kms v1.22.0
go: downloading github.com/chzyer/test v1.0.0
go: downloading github.com/frankban/quicktest v1.14.6
go: downloading github.com/alecthomas/repr v0.5.1
go: downloading github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc
go: downloading github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2
go: downloading github.com/kr/pretty v0.3.1
go: downloading github.com/chzyer/logex v1.2.1
go: downloading github.com/aws/aws-sdk-go-v2 v1.36.4
go: downloading github.com/hexops/gotextdiff v1.0.3
go: downloading github.com/zeebo/pcg v1.0.1
go: downloading github.com/google/btree v1.1.2
go: downloading github.com/spaolacci/murmur3 v1.1.0
go: downloading github.com/OneOfOne/xxhash v1.2.2
go: downloading cloud.google.com/go/longrunning v0.6.7
go: downloading cloud.google.com/go/iam v1.5.2
go: downloading go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.61.0
go: downloading github.com/rogpeppe/go-internal v1.13.1
go: downloading github.com/kr/text v0.2.0
go: downloading github.com/aws/aws-sdk-go-v2/credentials v1.17.69
go: downloading github.com/aws/aws-sdk-go-v2/internal/ini v1.8.3
go: downloading github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.31
go: downloading github.com/aws/aws-sdk-go-v2/service/ssooidc v1.30.2
go: downloading github.com/aws/aws-sdk-go-v2/service/sso v1.25.4
go: downloading github.com/aws/aws-sdk-go-v2/service/sts v1.33.21
go: downloading github.com/aws/smithy-go v1.22.2
go: downloading github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.35
go: downloading github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.35
go: downloading github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.16
go: downloading github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.3
2026/01/19 15:29:15 [INFO] exec (timeout=0s): C:\Program Files\Go\bin\go.exe build -o D:\code\xcaddy\cmd\caddy.exe -ldflags -w -s -trimpath -tags nobadger,nomysql,nopgx
2026/01/19 15:29:42 [INFO] Build complete: .\caddy.exe
2026/01/19 15:29:42 [INFO] Cleaning up temporary folder: C:\Users\ADMINI~1\AppData\Local\Temp\buildenv_2026-01-19-1528.2530769539

.\.\caddy.exe version
v2.10.2 h1:g/gTYjGMD0dec+UgMw8SnfmJ3I9+M2TdvoRL/Ovu6U8=&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;设置服务器类型&lt;/p&gt;
&lt;pre class=&quot;language-markup&quot;&gt;&lt;code&gt;$env:GOOS=&quot;linux&quot;
$env:GOARCH=&quot;amd64&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;编译Ubuntu版本&lt;/p&gt;
&lt;pre class=&quot;language-markup&quot;&gt;&lt;code&gt; xcaddy build --with github.com/caddy-dns/alidns --output D:\code\xcaddy\caddy-linux-amd64&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;https://forstyle.cc/zblog/zb_users/upload/2026/01/20260119174117176881567723271.png&quot; /&gt;&lt;/p&gt;
&lt;p&gt;上传到服务器&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://forstyle.cc/zblog/zb_users/upload/2026/01/20260119174221176881574150494.png&quot; /&gt;&lt;/p&gt;
&lt;p&gt;编写配置文件 Caddyfile，tls里面配置的阿里云申请的密钥&lt;/p&gt;
&lt;pre class=&quot;language-markup&quot;&gt;&lt;code&gt;v4.forstyle.cc:8091 {

    tls {
        dns alidns {
            access_key_id &quot;your access_key_id&quot;
            access_key_secret &quot;your access_key_secret&quot;
        }
    }

    reverse_proxy localhost:8080
    header Host {host}
    header X-Real-IP {remote_host}
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;前台启动服务&lt;/p&gt;
&lt;pre class=&quot;language-markup&quot;&gt;&lt;code&gt;./caddy run --config Caddyfile
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;https://forstyle.cc/zblog/zb_users/upload/2026/01/20260119174451176881589134029.png&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;后台启动&lt;/p&gt;
&lt;pre class=&quot;language-markup&quot;&gt;&lt;code&gt; nohup ./caddy run --config Caddyfile &amp;amp;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description><pubDate>Mon, 19 Jan 2026 17:24:12 +0800</pubDate></item><item><title>windows系统开启远程桌面，并且无需密码登录</title><link>https://forstyle.cc/zblog/post/107.html</link><description>&lt;h3&gt;一、开启远程桌面&lt;/h3&gt;
&lt;p&gt;右键 &amp;ldquo;此电脑&amp;rdquo;，选择 &amp;ldquo;属性&amp;rdquo;，左侧点击 &amp;ldquo;远程设置&amp;rdquo;。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://forstyle.cc/zblog/zb_users/upload/2026/01/20260106094840176766412073132.png&quot; /&gt;&lt;/p&gt;
&lt;p&gt;在 &amp;ldquo;远程桌面&amp;rdquo; 区域，勾选 &amp;ldquo;允许远程连接到此计算机&amp;rdquo; 选项&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://forstyle.cc/zblog/zb_users/upload/2026/01/20260106094854176766413419273.png&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;二、添加用户&lt;/h3&gt;
&lt;p&gt;点击&amp;ldquo;选择可远程这台电脑的用户&amp;rdquo;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://forstyle.cc/zblog/zb_users/upload/2026/01/20260106094937176766417749217.png&quot; /&gt;&lt;/p&gt;
&lt;p&gt;点击添加&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://forstyle.cc/zblog/zb_users/upload/2026/01/20260106094954176766419431007.png&quot; /&gt;&lt;/p&gt;
&lt;p&gt;输入用户名，点击右侧检查名称&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://forstyle.cc/zblog/zb_users/upload/2026/01/20260106095024176766422460223.png&quot; /&gt;&lt;/p&gt;
&lt;p&gt;点确定保存&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;三、关闭登录密码&lt;/h3&gt;
&lt;p&gt;按 Win+R 键，打开 &amp;ldquo;运行&amp;rdquo; 对话框，输入 &amp;ldquo;gpedit.msc&amp;rdquo; 回车，启动组策略编辑器。&lt;/p&gt;
&lt;p&gt;依次展开 &amp;ldquo;计算机配置&amp;rdquo;&amp;gt;&amp;ldquo;Windows 设置&amp;rdquo;&amp;gt;&amp;ldquo;安全设置&amp;rdquo;&amp;gt;&amp;ldquo;本地策略&amp;rdquo;&amp;gt;&amp;ldquo;安全选项&amp;rdquo; 。&lt;/p&gt;
&lt;p&gt;在右侧找到 &amp;ldquo;帐户：使用空白密码的本地账户只允许进行控制台登录&amp;rdquo; ，双击打开，选择 &amp;ldquo;已禁用&amp;rdquo; ，点击 &amp;ldquo;确定&amp;rdquo; 按钮。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://forstyle.cc/zblog/zb_users/upload/2026/01/20260106093908176766354888341.png&quot; /&gt;&lt;/p&gt;</description><pubDate>Tue, 06 Jan 2026 09:06:24 +0800</pubDate></item><item><title>php加速下载文件，比普通下载快三倍以上</title><link>https://forstyle.cc/zblog/post/106.html</link><description>&lt;p&gt;直接通过服务器下载文件有点慢，写了个加速下载代码，使用的php5.3，windows服务器，需要修改下文件路径&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://forstyle.cc/zblog/zb_users/upload/2026/01/20260105173318176760559831502.png&quot; /&gt;&lt;/p&gt;
&lt;p&gt;差不多比直接下载文件快三倍以上。&lt;/p&gt;
&lt;pre class=&quot;language-markup&quot;&gt;&lt;code&gt;&amp;lt;?php
/**
 * PHP5.3.28 服务器端ZIP下载接口（部署到服务器，浏览器请求直接下载到本地）
 * 运行环境：PHP5.3.28 + Windows + NTS + CGI/FastCGI（你的服务器环境）
 * 核心特性：高速流式下载 + 断点续传 + 大文件支持 + 内存优化 + 浏览器适配
 */
// ======================== 【必须修改的2处核心配置】 =======================
$LOCAL_ZIP_FILE = &#039;D:/TTT/www/your_file.zip&#039;; // ★服务器本地的ZIP文件绝对路径（必填）
$DOWNLOAD_FILE_NAME = &#039;my_download.zip&#039;;     // ★下载到本地时显示的文件名（自定义）
// ==========================================================================

// 全局配置（适配你的PHP5.3环境，无需修改）
set_time_limit(0);          // 取消执行超时限制（大文件必备）
ini_set(&#039;memory_limit&#039;, &#039;64M&#039;); // 进一步降低内存占用，适配128M限制
ini_set(&#039;output_buffering&#039;, &#039;off&#039;); // 关闭输出缓冲，流式下载核心
ob_end_clean();             // 清空缓冲区，防止文件损坏

// 初始化下载处理器
$downloader = new ServerZipDownloader();
$downloader-&amp;gt;download($LOCAL_ZIP_FILE, $DOWNLOAD_FILE_NAME);

/**
 * 服务器端ZIP下载核心类（PHP5.3完全兼容，极致速度优化）
 */
class ServerZipDownloader
{
    /**
     * 主下载方法：响应HTTP请求，将服务器本地ZIP流式下载到客户端
     * @param string $localFile 服务器本地ZIP绝对路径
     * @param string $showName  客户端显示的下载文件名
     */
    public function download($localFile, $showName)
    {
        // ========== 第一步：前置校验（核心，防止报错） ==========
        if (!$this-&amp;gt;checkFileExist($localFile)) {
            $this-&amp;gt;outputError(&#039;服务器本地ZIP文件不存在！路径：&#039;.$localFile);
            return;
        }
        
        $fileSize = filesize($localFile); // 获取服务器本地文件大小
        $fileExt  = strtolower(pathinfo($localFile, PATHINFO_EXTENSION));
        
        if ($fileExt !== &#039;zip&#039;) {
            $this-&amp;gt;outputError(&#039;文件格式错误，仅支持ZIP文件下载！&#039;);
            return;
        }
        
        if ($fileSize &amp;lt;= 0) {
            $this-&amp;gt;outputError(&#039;ZIP文件为空或损坏！&#039;);
            return;
        }

        // ========== 第二步：设置HTTP响应头（浏览器下载核心+断点续传） ==========
        $this-&amp;gt;setDownloadHeaders($showName, $fileSize);

        // ========== 第三步：高速流式下载核心（速度拉满，内存零占用） ==========
        $this-&amp;gt;streamFileToClient($localFile, $fileSize);
        exit;
    }

    /**
     * 校验服务器本地文件是否存在且可读
     */
    private function checkFileExist($file)
    {
        if (!file_exists($file)) return false;
        if (!is_file($file)) return false;
        if (!is_readable($file)) return false;
        return true;
    }

    /**
     * 设置HTTP下载响应头（关键：浏览器识别下载、断点续传、中文文件名兼容）
     */
    private function setDownloadHeaders($fileName, $fileSize)
    {
        // 解决Windows+PHP5.3中文文件名乱码问题
        $ua = isset($_SERVER[&#039;HTTP_USER_AGENT&#039;]) ? $_SERVER[&#039;HTTP_USER_AGENT&#039;] : &#039;&#039;;
        if (preg_match(&#039;/MSIE|Edge/i&#039;, $ua)) {
            $fileName = urlencode($fileName);
        } else {
            $fileName = iconv(&#039;UTF-8&#039;, &#039;GB2312//IGNORE&#039;, $fileName);
        }

        // 核心响应头（下载类型+禁用缓存）
        header(&#039;Content-Type: application/zip&#039;);
        header(&#039;Content-Disposition: attachment; filename=&quot;&#039;.$fileName.&#039;&quot;&#039;);
        header(&#039;Pragma: no-cache&#039;);
        header(&#039;Cache-Control: no-cache, must-revalidate&#039;);
        header(&#039;Expires: 0&#039;);
        header(&#039;Accept-Ranges: bytes&#039;); // 开启断点续传支持

        // 断点续传核心逻辑（适配浏览器/下载工具的暂停、续传功能）
        $range = &#039;&#039;;
        if (isset($_SERVER[&#039;HTTP_RANGE&#039;]) &amp;amp;&amp;amp; !empty($_SERVER[&#039;HTTP_RANGE&#039;])) {
            $range = $_SERVER[&#039;HTTP_RANGE&#039;];
            $range = preg_replace(&#039;/[\s|,].*/&#039;, &#039;&#039;, $range);
            list($a, $range) = explode(&#039;=&#039;, $range);
            list($start, $end) = explode(&#039;-&#039;, $range);
            $start = (int)$start;
            $end   = $end ? (int)$end : $fileSize - 1;
            
            header(&#039;HTTP/1.1 206 Partial Content&#039;);
            header(&#039;Content-Length: &#039; . ($end - $start + 1));
            header(&#039;Content-Range: bytes &#039; . $start . &#039;-&#039; . $end . &#039;/&#039; . $fileSize);
        } else {
            header(&#039;Content-Length: &#039; . $fileSize); // 返回完整文件大小
        }
    }

    /**
     * 流式输出文件到客户端（PHP5.3速度最优方案，零内存占用，突破30M限制）
     * ✅ 替代原生readfile，解决大文件下载慢/卡死/内存溢出问题
     */
    private function streamFileToClient($file, $fileSize)
    {
        $fp = fopen($file, &#039;rb&#039;); // 二进制只读模式（Windows最优）
        if (!$fp) {
            $this-&amp;gt;outputError(&#039;服务器文件读取失败！&#039;);
            return;
        }

        // 处理断点续传的起始位置
        $start = 0;
        if (isset($_SERVER[&#039;HTTP_RANGE&#039;]) &amp;amp;&amp;amp; !empty($_SERVER[&#039;HTTP_RANGE&#039;])) {
            $range = $_SERVER[&#039;HTTP_RANGE&#039;];
            $range = preg_replace(&#039;/[\s|,].*/&#039;, &#039;&#039;, $range);
            list($a, $range) = explode(&#039;=&#039;, $range);
            list($start) = explode(&#039;-&#039;, $range);
            $start = (int)$start;
            fseek($fp, $start); // 定位到断点位置
        }

        // ========== 速度优化核心：分块流式输出 ==========
        $bufferSize = 1024 * 1024; // 1MB输出缓冲区（适配128M内存，速度最快）
        while (!feof($fp) &amp;amp;&amp;amp; connection_status() === CONNECTION_NORMAL) {
            $buffer = fread($fp, $bufferSize);
            echo $buffer;
            ob_flush(); // 立即输出缓冲区内容
            flush();    // 强制刷新系统输出缓冲区
        }

        fclose($fp); // 关闭文件句柄
    }

    /**
     * 输出错误信息（友好提示）
     */
    private function outputError($msg)
    {
        header(&#039;Content-Type: text/html; charset=utf-8&#039;);
        echo &#039;&amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;&#039;;
        echo &#039;&amp;lt;h2 style=&quot;color:red;&quot;&amp;gt;下载失败&amp;lt;/h2&amp;gt;&#039;;
        echo &#039;&amp;lt;p&amp;gt;错误信息：&#039;.$msg.&#039;&amp;lt;/p&amp;gt;&#039;;
        echo &#039;&amp;lt;p&amp;gt;请检查服务器本地ZIP文件路径是否正确！&amp;lt;/p&amp;gt;&#039;;
        exit;
    }
}
?&amp;gt;&lt;/code&gt;&lt;/pre&gt;</description><pubDate>Mon, 05 Jan 2026 17:30:29 +0800</pubDate></item><item><title>浏览器播放h265编码的视频，兼容windows7及linux系统</title><link>https://forstyle.cc/zblog/post/105.html</link><description>&lt;p&gt;找了好久，网上说的都试了一遍，兼容性都不好，修改代码、安装插件、使用EasyPlayer，安装 K-Lite Codec Pack等等各种办法，但是效果都不理想。后来想的不行就找个兼容的浏览器试试。&lt;/p&gt;
&lt;p&gt;万能的豆包辅助下，找到了 Thorium 浏览器。号称地球上最快的浏览器。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://forstyle.cc/zblog/zb_users/upload/2026/01/20260104141621176750738146984.png&quot; /&gt;&lt;/p&gt;
&lt;p&gt;官网地址 &lt;a href=&quot;https://thorium.rocks/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Thorium Browser&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;可以看到不同操作系统的下载地址&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://forstyle.cc/zblog/zb_users/upload/2026/01/20260104141954176750759485044.png&quot; /&gt;&lt;/p&gt;
&lt;p&gt;windows版本地址 &lt;a href=&quot;https://github.com/Alex313031/thorium-legacy/releases/tag/M122.0.6261.171&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Release M122 R4 (remaining builds) &amp;middot; Alex313031/thorium-legacy &amp;middot; GitHub&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;linux版本地址 &lt;a href=&quot;https://github.com/Alex313031/Thorium/releases&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Releases &amp;middot; Alex313031/thorium&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;阿里云盘下载地址 &lt;a href=&quot;https://www.alipan.com/s/XdFKQahsRqf&quot;&gt;https://www.alipan.com/s/XdFKQahsRqf&lt;/a&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;我测试了在window7、windows10，windows11，通信UOS、麒麟v10，ubuntu等系统下都可以播放h265编码视频。&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description><pubDate>Sun, 04 Jan 2026 13:58:19 +0800</pubDate></item></channel></rss>