Redis | Bitmap、雪花ID、分布式

Redis | Bitmap、雪花ID、分布式

2026年5月6日星期三 · #实践笔记 Redis / Bitmap / 分布式 / 性能优化 · 3859 字 19 分钟 ·
-浏览量
·
简介

Redis Bitmap 结合雪花 ID 在分布式场景下的三大陷阱:首次写入 O(offset) 卡顿、哈希碰撞风险、单线程阻塞,最终给出 String+Set 替代方案。

Redis | Bitmap、雪花ID、分布式#

Bitmap 是 Redis 中极其精巧的数据结构——用 1 个 bit 标记一个用户状态,1 亿用户仅需 12 MB。但当它遇上雪花 ID(64 bit)和分布式架构时,一切美好都化为泡影。本文从三个维度(Bitmap 本身、雪花 ID、分布式)深度剖析这个经典踩坑,并给出最终方案。


〇案发现场#

用户首次点击”收藏”按钮,接口响应 1.5 秒,再次点击只需 20ms。Redis 中多出了一个占用 256 KB 的 Key。

# 第一次收藏(Key 不存在)
SETBIT collect:bit:1:2051776854918803458 1823456789 1
→ 耗时: 1500ms ← 😰 用户肉眼可见的卡顿
→ Redis 内存增长: 256 KB(分配 offset 0~18 亿的 bit 空间并清零)
# 第二次收藏(Key 已存在)
SETBIT collect:bit:1:2051776854918803458 3456789012 1
→ 耗时: 20ms ← ✅ 正常速度
# 第三次收藏
SETBIT collect:bit:1:2051776854918803458 987654321 1
→ 耗时: 18ms ← ✅ 正常速度

关键线索

指标首次操作后续操作差异倍数
响应时间1500 ms20 ms75 倍
Redis 内存变化+256 KB无变化-
Key 状态不存在 → 创建已存在 → 修改-

为什么第一次这么慢?为什么后续又正常了?256 KB 从何而来?下面逐步拆解。


一、问题现象#

使用 Redis Bitmap 存储用户交互状态(点赞/收藏/关注)时,首次写入某个 Key 极慢(数秒甚至超时),后续操作正常。

典型代码:

// 收藏操作:SETBIT 设置用户位
Boolean wasCollected = redisTemplate.opsForValue().setBit(
"collect:bit:1:" + targetId,
toOffset(userId), // offset 可达 42.9 亿
true
);

其中 offset 转换逻辑:

public static long toOffset(Long userId) {
long hash = hash64(userId);
return Math.abs(hash) % (2^32 - 1); // 哈希取模,范围 0 ~ 42.9 亿
}

二、从 Bitmap 本身分析#

2.1 SETBIT 的时间复杂度陷阱#

Redis 官方文档对 SETBIT 的复杂度定义:

场景时间复杂度说明
Key 已存在,offset 在已有范围内O(1)直接修改对应 bit
Key 不存在(首次写入)O(offset)从字节 0 到目标 offset 分配并零初始化整段内存

这是问题的直接原因:Redis Bitmap 底层是一个原始 bit 数组,首次 SETBIT 时必须把 0 到 offset 之间的所有字节都分配出来并清零。

2.2 内存分配量化#

offset 经哈希取模后均匀分布在 0 ~ 42.9 亿之间,期望值约 21.4 亿。

offset 大小首次 SETBIT 分配内存耗时量级
100 万~125 KB毫秒级
1 亿~12 MB百毫秒级
10 亿~120 MB秒级
21.4 亿(期望值)~256 MB数秒
42.9 亿(最坏)~512 MB超时风险

2.3 为什么后续操作快?#

Key 一旦存在,内存已分配完毕,后续 SETBIT/GETBIT 都是 O(1),所以第二次及之后操作正常。这也解释了为什么问题容易被忽视——开发/测试时第二次操作就正常了,只有”首次”才会暴露。

2.4 能否缩小 Offset 范围?#

直觉方案:把取模上限从 2^32 缩小到 2^20(约 100 万),首次写入只需分配 128 KB。

问题:哈希碰撞导致数据错误。

不同 userId 可能映射到同一个 offset:

场景碰撞后果
用户 A 和 B 映射到同一 offsetA 收藏后,查询 B 的收藏状态返回 true(误判)
B 取消收藏把 A 的收藏状态也清掉了

碰撞概率(生日悖论公式):

Offset 上限 M单内容 100 人操作单内容 1000 人操作单内容 1 万人操作首次分配内存
2^32 (42.9 亿)≈ 0.0001%≈ 0.01%≈ 1.2%512 MB
2^28 (2.68 亿)≈ 0.002%≈ 0.19%≈ 17%32 MB
2^24 (1677 万)≈ 0.03%≈ 3%≈ 95%2 MB
2^20 (104 万)≈ 0.48%≈ 100%≈ 100%128 KB

结论:缩小 Offset 到不卡的范围,碰撞率对热门内容不可接受。性能和正确性无法兼得。


三、从雪花 ID 角度分析#

3.1 雪花 ID 的结构决定了它不适合做 Bitmap offset#

雪花 ID(64 bit)的结构:

┌──────────────────────────────────────────────────────────────────┐
│ 1 bit │ 41 bit │ 10 bit │ 12 bit │
│ 符号位 │ 时间戳(ms) │ 机器ID │ 序列号 │
│ 0 │ 1746000000000+... │ 0~1023 │ 0~4095 │
└──────────────────────────────────────────────────────────────────┘

一个典型的雪花 ID:2051776854918803458(约 2 × 10^18)

核心矛盾:Bitmap offset 的有效范围是 0 ~ 2^32 - 1(约 42.9 亿),而雪花 ID 的值域是 0 ~ 2^63 - 1(约 9.2 × 10^18),差了 20 亿倍

3.2 哈希取模是”治标不治本”的妥协#

userId → hash64() 散列 → % (2^32 - 1) → offset

这带来了两个问题:

问题 1:取模后的值仍然很大

hash64() 输出均匀分布在 Long.MIN_VALUE ~ Long.MAX_VALUE,取模后均匀分布在 0 ~ 2^32-1。期望值约 21.4 亿,首次写入仍需分配 ~256 MB。

问题 2:取模引入碰撞

取模是压缩映射,必然存在多对一关系。两个不同的 userId 可能映射到同一个 offset,导致数据错误。

3.3 雪花 ID 的”时间递增”特性也无法利用#

有人可能想:雪花 ID 是递增的,早期用户的 ID 较小,offset 不会太大?

不对——因为 hash64() 打散了原始 ID 的递增特性:

userId=1 → hash64 → 0x7A3B2C1D4E5F6A7B → % 2^32 → 1,823,456,789
userId=2 → hash64 → 0x1234567890ABCDEF → % 2^32 → 3,456,789,012
userId=100 → hash64 → 0xFEDCBA0987654321 → % 2^32 → 987,654,321

即使 userId 很小,hash 后的 offset 仍然可能很大。递增特性被哈希完全破坏了。

3.4 如果不用哈希,直接用雪花 ID 做 offset 呢?#

更糟——雪花 ID 本身就是 19 位数字(~2^61),远超 Bitmap offset 上限 2^32,直接用会报错:

ERR bit offset is not an integer or out of range

3.5 从 ID 生成策略角度的替代方案#

如果一定要用 Bitmap,需要让 ID 变小:

方案原理offset 上限首次分配内存问题
自增整数 IDDB auto_increment等于用户总数极小❌ 分库分表不适用,暴露业务信息
映射表userId → localId 映射等于用户总数极小⚠️ 额外维护映射关系,多一次查询
号段模式(Leaf)美团 Leaf segment等于用户总数极小⚠️ 需要引入 Leaf 组件
压缩雪花 ID只取低 32 bit2^32 ≈ 42.9 亿最大 512 MB❌ 低 32 bit 碰撞率高,回到原点

结论:在雪花 ID 体系下,没有好的办法让 ID 变小到适合 Bitmap。换数据结构比换 ID 方案成本更低。

3.6 雪花 ID 角度的本质#

雪花 ID 的本质:全局唯一、趋势递增、64 bit
Bitmap offset 的本质:紧凑整数、0~2^32、bit 位映射
两者设计目标根本不同:
雪花 ID → 保证唯一性 → 值域必须大
Bitmap offset → 紧凑映射 → 值域必须小
强行用哈希取模桥接,既丢失了唯一性(碰撞),又没解决紧凑性(offset 仍大)。

四、从分布式角度分析#

4.1 Redis 单线程阻塞:一个慢操作拖垮整个节点#

Redis 是单线程模型(命令串行执行),一个 SETBIT key 2147483648 1 需要分配 256 MB 并清零,在此期间该 Redis 节点无法响应任何其他请求

时间线:
t0 客户端A: SETBIT collect:bit:1:xxx 2147483648 1 ← 开始分配 256MB
t1 客户端B: GET user:info:123 ← 排队等待...
t2 客户端C: INCR like:count:1:456 ← 排队等待...
t3 客户端D: SADD follow:user:789:1 999 ← 排队等待...
t4 SETBIT 完成(耗时 2~5 秒) ← 客户端 B/C/D 全部超时
t5 客户端 B/C/D 的命令才开始执行

影响范围:不仅是收藏操作本身慢,同一 Redis 节点上的所有业务(登录、查询、计数)都会被阻塞。

4.2 Redis Cluster 数据倾斜#

Redis Cluster 按 Key 的 hash slot 分配到不同节点。Bitmap 方案下:

collect:bit:1:10086 → slot A → 节点 1
collect:bit:1:10087 → slot B → 节点 2
collect:bit:2:10086 → slot C → 节点 3

如果某篇爆款文章首次被大量用户收藏,所有 SETBIT 操作都打到同一个 Key,即同一个节点。该节点瞬间承受:

  • 内存分配压力(单次 256 MB)
  • CPU 压力(memset 清零)
  • 网络压力(响应延迟导致连接堆积)

而其他节点完全空闲——典型的数据倾斜

4.3 KEYS 命令的集群隐患#

同步任务中通常使用 KEYS collect:bit:* 扫描所有 Bitmap Key:

Collection<String> keys = redisTemplate.keys("collect:bit:*");

在 Redis Cluster 中:

  • KEYS 命令只扫描当前节点,需要用 SCAN 逐节点遍历
  • KEYS 是 O(N) 操作,会阻塞当前节点
  • 大量 Bitmap Key 时,同步任务本身也可能成为性能瓶颈

4.4 Bitmap 大 Key 的运维风险#

运维操作影响
DEL collect:bit:1:xxx释放 256 MB 内存,可能触发 Redis 内存碎片整理,短暂卡顿
RDB 持久化大 Key 导致 RDB 生成时间变长,fork() 耗时增加
AOF 重写大 Key 导致 AOF 重写时间变长
主从同步全量同步时大 Key 传输耗时,从节点长时间处于”加载中”状态
maxmemory单个 Key 占用数百 MB,可能触发淘汰策略误杀其他 Key

4.5 分布式角度的结论#

问题Bitmap 方案Set 方案
单线程阻塞❌ SETBIT 分配数百 MB 阻塞整个节点✅ SADD O(1),毫秒级
数据倾斜❌ 爆款内容所有操作打同一个节点✅ 用户维度 Key 天然分散到不同 slot
大 Key 风险❌ 单 Key 数百 MB✅ 单用户 Key 通常几 KB
同步扫描❌ KEYS 阻塞 + Cluster 不友好✅ 可用 pending Hash 队列,无需扫描
运维友好度❌ DEL/RDB/AOF 全受影响✅ 小 Key 无特殊影响

五、RoaringBitmap 能解决吗?#

5.1 原理#

RoaringBitmap 是压缩位图,将 32 位整数空间分成 65536 个桶,每桶按数据稀疏程度选择容器:

容器类型触发条件内存占用
Array Container桶内元素 ≤ 40962 bytes × 元素数
Bitmap Container桶内元素 > 40968 KB(固定)
Run Container连续值多更压缩

设置 offset=20 亿时,只需在对应桶里加一个元素(Array Container,2 bytes),不会分配 250 MB

5.2 三种使用方式对比#

方式 A:RedisBloom 模块(RB.* 命令)#

RB.SETBIT key 2000000000 1 -- O(1),不预分配
RB.GETBIT key 2000000000 -- O(1)
维度评价
首次写入✅ O(1),无预分配
原子性✅ Redis 单线程保证
致命问题❌ 需要安装 RedisBloom 模块,云 Redis 不一定支持

方式 B:客户端序列化(Read-Modify-Write)#

byte[] data = redisTemplate.opsForValue().get(key);
RoaringBitmap bitmap = data != null
? RoaringBitmap.deserialize(data) : new RoaringBitmap();
bitmap.add(userId);
redisTemplate.opsForValue().set(key, bitmap.serialize());
维度评价
首次写入✅ 无预分配
致命问题 1❌ 非原子操作:并发 Read-Modify-Write 导致数据丢失
致命问题 2❌ 必须加分布式锁,延迟 5~15ms
致命问题 3❌ 每次操作全量序列化/反序列化,数据量大时很慢

方式 C:Lua 脚本#

不可行——Redis 内置 Lua 不支持 RoaringBitmap 库。

5.3 RoaringBitmap 结论#

方案首次写入原子性内存效率额外依赖推荐度
RedisBloom 模块RedisBloom⭐⭐⭐⭐ 有条件推荐
客户端序列化❌ 需加锁RoaringBitmap⭐⭐ 不推荐
Set(用户维度)⚠️ 稍高⭐⭐⭐⭐⭐ 最推荐

除非能装 RedisBloom 模块,否则 RoaringBitmap 客户端方案会丢失原子性,得不偿失。


六、正确方案:String + Set(用户维度)#

6.1 Key 设计#

# 1. 操作总数(内容维度)—— String
like:count:{targetType}:{targetId} → INCR / DECR
# 2. 用户操作集合(用户维度)—— Set
like:user:{userId}:{targetType} → SADD / SREM / SISMEMBER

6.2 为什么用用户维度而不是内容维度的 Set?#

方案Key问题
like:article:{targetId} → Set<userId>内容维度爆款文章百万点赞,单 Key 几百 MB
like:user:{userId}:{targetType} → Set<targetId>用户维度单用户操作量可控,通常几百~几千

用户维度的 Set 天然上限合理,加 TTL(如 7 天)冷数据自动淘汰。

6.3 操作流程#

// 点赞
Boolean added = redisTemplate.opsForSet().isMember(
"like:user:" + userId + ":1", String.valueOf(targetId));
if (Boolean.TRUE.equals(added)) {
throw new BusinessException("已点赞");
}
redisTemplate.opsForSet().add("like:user:" + userId + ":1",
String.valueOf(targetId));
redisTemplate.opsForValue().increment("like:count:1:" + targetId);
// 异步写 MySQL
// 取消点赞
redisTemplate.opsForSet().remove("like:user:" + userId + ":1",
String.valueOf(targetId));
redisTemplate.opsForValue().decrement("like:count:1:" + targetId);
// 异步删 MySQL
// 判断是否已点赞
Boolean isLiked = redisTemplate.opsForSet().isMember(
"like:user:" + userId + ":1", String.valueOf(targetId));

6.4 缓存冷启动(Redis 无数据时)#

Boolean isLiked = redisTemplate.opsForSet().isMember(key, String.valueOf(targetId));
if (isLiked == null) {
// key 不存在,从 MySQL 回捞
RLock lock = redisson.getLock("lock:like:load:" + userId);
lock.lock();
try {
List<Long> likedIds = likeMapper.selectByUserId(userId, targetType);
if (CollUtil.isNotEmpty(likedIds)) {
redisTemplate.opsForSet().add(key,
likedIds.stream().map(String::valueOf).toArray());
}
redisTemplate.expire(key, 7, TimeUnit.DAYS);
} finally {
lock.unlock();
}
}

6.5 方案对比#

维度Bitmap + Hash(旧方案)String + Set(新方案)
首次写入性能❌ O(offset),最大 512 MB✅ O(1),始终毫秒级
判断是否已操作GETBIT O(1)SISMEMBER O(1)
数据正确性⚠️ 哈希碰撞风险✅ 零碰撞(存储原始 ID)
内存效率(1 亿用户)✅ ~12 MB⚠️ ~2 GB(但单用户维度可控)
内存效率(1 万用户)✅ ~1.2 KB✅ ~80 KB(可接受)
计数查询HGET O(1)INCR/GET O(1)
分布式友好度❌ 大 Key 阻塞单节点✅ 小 Key 天然分散
原子性✅ SETBIT 返回旧值✅ SADD/SREM 原子

6.6 前端注意事项:雪花 ID 精度丢失#

雪花 ID 约 19 位数字,超过 JS Number.MAX_SAFE_INTEGER(2^53 ≈ 16 位),JSON 序列化会丢精度:

// 前端接收后
12345678901234567891234567890123456800 // 末尾精度丢失

解决方案:Jackson 序列化时将 Long 转 String。

// 方式一:字段级注解
@JsonSerialize(using = ToStringSerializer.class)
private Long targetId;
// 方式二:全局配置 ObjectMapper
@Bean
public ObjectMapper objectMapper() {
ObjectMapper mapper = new ObjectMapper();
SimpleModule module = new SimpleModule();
module.addSerializer(Long.class, ToStringSerializer.instance);
module.addSerializer(Long.TYPE, ToStringSerializer.instance);
mapper.registerModule(module);
return mapper;
}

七、总结#

三维问题全景#

┌─────────────────────────────────────────────────────────────────────┐
│ 问题全景图 │
├──────────────┬──────────────────────────────────────────────────────┤
│ │ 首次写入 O(offset) 分配数百 MB 内存 │
│ Bitmap 本身 │ 缩小 Offset → 碰撞率不可接受 │
│ │ 性能与正确性无法兼得 │
├──────────────┼──────────────────────────────────────────────────────┤
│ │ 64 bit vs 32 bit offset,差 20 亿倍 │
│ 雪花 ID │ 哈希取模:既丢唯一性(碰撞),又没解决紧凑性(offset 仍大) │
│ │ 递增特性被哈希破坏,无法利用 │
│ │ 换 ID 方案成本远高于换数据结构 │
├──────────────┼──────────────────────────────────────────────────────┤
│ │ 单线程阻塞:一个慢操作拖垮整个节点 │
│ 分布式 │ 数据倾斜:爆款内容所有操作打同一个节点 │
│ │ 大 Key 运维:DEL/RDB/AOF/主从同步全受影响 │
│ │ KEYS 扫描:Cluster 不友好 + O(N) 阻塞 │
└──────────────┴──────────────────────────────────────────────────────┘

问题-方案对照表#

问题原因方案
首次写入卡顿雪花 ID → 大 offset → SETBIT O(offset) 分配内存改用 Set 结构
缩小 Offset 不可行哈希碰撞导致数据错误Set 存原始 ID,零碰撞
爆款内容 Set 过大内容维度 Set 百万成员改用用户维度 Set
单线程阻塞SETBIT 分配数百 MB 阻塞整个 Redis 节点SADD O(1) 不阻塞
数据倾斜爆款内容所有操作打同一节点用户维度 Key 天然分散
大 Key 运维风险DEL/RDB/AOF/主从同步全受影响小 Key 无特殊影响
RoaringBitmap 不可行客户端序列化丢失原子性除非有 RedisBloom 模块
雪花 ID 不兼容 Bitmap64 bit vs 32 bit offset,差 20 亿倍承认不兼容,换数据结构
前端 ID 精度丢失雪花 ID > JS MAX_SAFE_INTEGERLong 序列化为 String

最终选型#

String(计数)+ Set(用户维度,判断是否已操作)+ 异步写库。

不用 Bitmap(雪花 ID 太大),不用内容维度 Set(爆款 Key 太大),不用 RoaringBitmap(原子性难保证)。

什么时候 Bitmap 仍然适用?#

Bitmap 并非一无是处,以下场景仍然是最优选择:

场景条件示例
用户在线状态userId 为自增小整数SETBIT online 42 1
签到打卡日期作为 offset(1~31)SETBIT sign:userId:202601 15 1
布隆过滤器概率型数据结构,允许误判去重、防缓存穿透
活跃用户统计自增 ID + 按天 BitmapBITCOUNT + BITOP 统计 DAU

核心判断标准:offset 是否为紧凑小整数(万级以内)。如果是雪花 ID,直接放弃 Bitmap。

Redis | Bitmap、雪花ID、分布式
https://tblog.mmzhiku.xyz/posts/projects/projects-redis-bitmap-snowflake-id/
作者
MmzMing
发布于
2026-05-06
许可协议
CC BY-NC-SA 4.0

评论区

看板娘
公告
友链 互换友链

正在招募技术类博客友链,要求原创、稳定更新。点击了解更多。

查看详情
维护 服务器升级

本周日凌晨 2:00-4:00 进行服务器维护,期间站点可能短暂无法访问。

欢迎 关于我的介绍

欢迎来到我的博客,我是深耕java、python和react技术开发。热爱技术、持续学习,欢迎同好交流探讨,也欢迎大佬互换友链。

查看详情
音乐
封面

音乐

暂未播放

0:00
0:00
暂无歌词
标签
# AI 6 # 认证 5 # 安全 4 # 登录 3 # 博客 2 # Skill 2 # Redis 2 # Bitmap 2 # 部署 2 # Java 2 # 并发编程 2 # 性能优化 2 # 二开 1 # firefly 1 # 前端 1 # Prompt 1 # 工作流 1 # RAG 1 # Cloudflare 1 # 缓存设计 1 # 高性能 1 # Bot 1 # Umami 1 # Vercel 1 # 线程池 1 # 虚拟线程 1 # 分布式 1 # JWT 1 # OAuth2 1 # MinIO 1 # 对象存储 1 # 扫码登录 1 # WebSocket 1 # Agent 1 # Oracle 1 # 数据库 1
目录
工具

隐私政策

更新日期: 2026 年 7 月 15 日
生效日期: 2026 年 7 月 15 日

适用范围#

本政策适用于 MmzMing 的博客(以下简称“本站”)。本站是个人博客,用于发布和分享内容;不提供账户注册、支付、定位或广告投放服务。访问本站、发表文章评论或在留言板留言前,请阅读本政策。

信息收集与使用#

本站只在提供内容、评论和留言功能,以及维护站点安全所需的范围内处理信息。

  • 访问与统计信息:访问页面时,统计服务可能处理访问时间、页面地址、来源页、浏览器和设备相关信息,用于了解内容访问情况、排查故障和改进站点。
  • 评论信息:使用文章评论功能时,Waline 可能处理您主动提交的昵称、邮箱、站点链接和评论内容;还可能处理 IP 地址等必要信息,用于防止垃圾评论、滥用和维护服务安全。评论内容、昵称和站点链接(如填写)可能公开展示在文章下方;邮箱不会公开展示。
  • 留言信息:留言板使用 Waline /guestbook/ 频道。Waline 可能处理您主动提交的昵称、可选邮箱、站点链接、留言内容和图片,以及浏览器、操作系统、IP 地址等必要的反滥用信息。默认情况下,留言图片以内嵌数据随留言提交;如站点维护者配置了远程图片上传接口,图片会先发送至该接口并在留言中保存返回的图片地址。留言内容、昵称、图片和站点链接(如填写)可能公开展示;邮箱和 IP 地址不会在留言板公开展示。
  • AI 对话信息:使用 AI 搜索时,本站会处理您提交的问题以及最近 6 条对话历史,用于检索博客内容并生成回答。问题和对话历史会发送至 ModelScope,或在第三方接口不可用时由 Cloudflare Workers AI 处理。请勿在 AI 对话中提交密码、Token、身份证件、联系方式或其他敏感信息。

请不要在评论或留言中提交身份证件、银行卡、住址、密码或其他不必要的敏感个人信息。

第三方服务#

为实现本站功能,以下第三方会在各自服务范围内处理相关数据:

  • Umami:用于匿名化的网站访问统计和出站链接点击统计,帮助我了解本站的使用情况。
  • Waline:用于文章评论、留言板及访问量统计。服务会按照其自身规则处理您在评论或留言时提交的信息及必要的反滥用信息。
  • Cloudflare:为本站提供静态资源分发、AI Worker、Vectorize 和相关基础设施。留言板不使用项目 Worker 或 KV 存储。
  • ModelScope:为 AI 搜索提供文本向量和对话模型服务,会处理您提交的问题及发送给模型的最近对话历史。
  • Cloudflare Workers AI:在未配置第三方 AI 接口时提供文本向量和对话模型服务,并处理相同的 AI 请求数据。
  • unpkg:用于加载 Waline 的前端脚本、样式和表情资源;请求这些资源时,您的浏览器会与该服务建立连接。

第三方服务可能有独立的隐私政策和数据保存规则。请在使用相关功能前查阅其规则;本站无法控制其独立的数据处理活动。

本站主要使用浏览器本地存储(Local Storage 或 Session Storage)保存使用偏好,例如主题颜色、明暗模式、文章列表视图和音乐播放设置。留言板会在本地保存匿名资料、未发送草稿和登录状态,以便恢复输入与会话;管理员登录状态仅保存在当前会话。AI 搜索的会话标题和完整对话也会保存在当前浏览器的 Local Storage 中,最长保存 7 天;您可以在 AI 面板中使用“清空全部会话”立即删除这些数据。

本站不主动设置用于广告定向的第一方 Cookie。评论、统计或资源服务可能按照其自身规则使用 Cookie 或类似技术。您可以通过浏览器设置查看、删除或限制 Cookie 和本地存储;清除后,部分偏好或互动状态可能会恢复为默认值,评论功能也可能受到影响。

信息公开、保存与安全#

评论和留言属于公开互动内容,提交后可能被搜索引擎收录、被他人引用或在缓存中短暂保留。请谨慎决定发布内容。除非您提出删除请求、内容违反规则或法律法规另有要求,公开内容会持续保留以维持讨论上下文。

本站会采取合理措施保护数据安全,包括使用 HTTPS、输入校验、内容转义和访问频率限制。但互联网传输和第三方服务均无法保证绝对安全,请理解并自行承担公开发布信息的相应风险。

你的权利#

你可以通过 784774835@qq.com 联系我,申请查询、更正或删除由本站直接保存的评论、留言或相关公开内容。为保护他人权益,请在请求中提供足以定位内容的信息,并说明你与该内容的关系;必要时可能需要进行合理核验。

对于由 Waline、Umami、Cloudflare 或 unpkg 独立处理的数据,你也可以直接向对应服务提供方行使相关权利。删除公开评论或留言后,第三方缓存、搜索引擎索引或他人转载的副本可能无法立即同步删除。

未成年人条款#

未满 14 周岁的未成年人应在监护人同意和指导下使用本站的评论、留言等互动功能。监护人如发现未成年人未经同意提交了个人信息,可通过上述联系方式与我联系,我会在合理范围内协助处理。

政策更新与联系#

我可能因本站功能或适用规则变化更新本政策,更新后的版本将在本站公布并标明日期。继续使用相关功能即表示你已阅读并理解更新后的政策。

如对本政策或数据处理有疑问,请联系 784774835@qq.com

用户协议

更新日期: 2026 年 5 月 19 日
生效日期: 2026 年 5 月 19 日

适用范围#

本协议适用于你访问 MmzMing 的博客,以及使用文章评论、留言板等互动功能的行为。继续浏览本站或提交评论、留言,即表示你已阅读、理解并同意遵守本协议及本站的隐私政策。

评论及留言规则#

请在交流中保持友善、理性和尊重。你不得利用本站发布、传播或实施以下行为:

  • 发布任何违反中华人民共和国法律法规的内容。
  • 发布任何侵犯他人合法权益的内容,包括但不限于隐私、名誉、肖像、著作权、商标权和其他知识产权。
  • 恶意攻击、辱骂、骚扰、威胁、歧视其他用户或任何第三方。
  • 发布垃圾广告、恶意推广、刷屏、灌水,或与讨论主题明显无关的重复内容。
  • 利用本站进行网络诈骗、钓鱼、传播恶意软件,或发布可能危害网络和信息安全的内容。
  • 绕越或试图绕越本站的审核、限流、封禁等管理措施。
  • 冒充他人、伪造身份,或收集、公开他人的个人信息。

内容与访问管理#

你应对自己发布的评论和留言负责,并保证拥有发布该等内容所需的合法权利。论坛管理员有权在不另行通知的情况下删除违规内容、限制或封禁违规账号,或限制其继续使用本站互动功能。

如发现涉嫌违法犯罪、严重侵权或危及本站安全的内容,本站可保留相关记录,并在法律法规要求或必要时向有关部门提供协助。对管理措施有疑问时,可通过文末联系方式说明情况;本站会结合实际情况处理,但不承诺恢复已删除内容或访问权限。

知识产权与内容授权#

本站原创文章、页面设计和其他受保护内容的权利归作者或权利人所有。未经授权,请勿复制、转载、镜像或用于商业用途;法律法规允许的合理使用除外。

你发布评论或留言时,授予本站为展示、存储、备份、审核、删除和维护互动功能所必需的非独占、免费的使用许可。该许可不改变你对原创内容依法享有的权利。

免责声明#

本站内容仅用于个人记录、学习交流和一般信息参考,不构成任何专业意见、承诺或担保。你应结合自身情况独立判断,并对据此采取的行动负责。

评论、留言和外部链接中的内容由其发布者或运营者负责,不代表本站立场。本站会在合理范围内处理明显违规内容,但不保证所有内容均及时发现,也不对第三方网站的可用性、内容、安全性或隐私实践承担责任。

因网络故障、不可抗力、第三方服务异常、维护升级或超出合理控制范围的原因导致本站暂时无法访问、内容延迟或数据丢失的,本站会尽力恢复,但不承担由此产生的间接损失。

未成年人条款#

未满 14 周岁的未成年人应在监护人同意和指导下使用评论、留言等互动功能。监护人应协助未成年人理解本协议,并对其使用行为进行必要的引导。

其他条款#

我可以根据本站功能、管理需要或法律法规变化更新本协议,更新后的版本将在本站公布并标明日期。继续使用本站即视为接受更新后的协议。

本协议的订立、执行和解释适用中华人民共和国法律。因本协议或使用本站产生争议时,双方应先友好协商;协商不成的,依法向有管辖权的人民法院解决。

如对本协议或内容管理有疑问,请联系 784774835@qq.com