跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
编程语言大前端java

小需求设计:如何用 Redis 实现协议勾选状态管理

综述由AI生成针对 APP 首次进入展示协议的需求,传统数据库方案存在读写压力与逻辑耦合问题。通过对比分析,演示如何利用 Redis 的原子性与过期策略高效解决状态标记问题。核心在于使用 SETNX 命令配合 TTL 设置,确保用户协议签署状态仅记录一次且可自动失效,既降低了存储成本又提升了查询性能。同时探讨了 Key 命名规范及协议更新时的处理策略,为类似场景提供可落地的技术方案。

月光旅人发布于 2019/12/2更新于 2026/6/518 浏览
小需求设计:如何用 Redis 实现协议勾选状态管理

需求背景

最近有个 APP 功能迭代,产品经理提了个看似简单却容易踩坑的需求:用户首次进入'程序员树洞'模块时,必须展示一份隐私协议,勾选后才能进入;后续再次访问则直接跳过。这个逻辑听起来 trivial,但一旦涉及高并发或海量用户,简单的数据库方案就会暴露出性能瓶颈。

需求分析

先把业务拆解一下,核心关注点其实就三个:

  1. 状态持久化:用户的勾选状态需要被记录,不能因为重启服务就丢失。
  2. 读取高频:每次打开功能都要判断是否显示弹窗,读操作远多于写操作。
  3. 写入低频:绝大多数用户只勾选一次,重复写入是浪费资源。

如果直接用 MySQL 存一张 user_agreement 表,虽然稳妥,但每次请求都要查库。当用户量上来后,这张表的查询压力会迅速增大,而且为了加锁防止并发冲突,数据库的吞吐量可能会成为瓶颈。这时候,Redis 的优势就体现出来了。

为什么选 Redis?

Redis 作为内存数据库,读写速度极快,天然适合这种'读多写少'且对一致性要求不是绝对强一致的场景。更重要的是,它提供了一些原子性命令和过期策略,能帮我们省去很多代码层面的判断。

方案对比

方案优点缺点
MySQL数据持久化强,事务支持好高并发下 IO 压力大,查询慢
Redis速度极快,支持原子操作内存成本高,需处理持久化

在这个场景下,我们不需要像订单系统那样保证强一致性,只要保证用户不重复看协议即可。Redis 完全够用。

实战实现

Key 的设计

Key 的命名要清晰且唯一。建议采用 feature:agreement:{userId} 这样的格式。这样既能隔离不同功能,又方便后续按前缀批量删除或统计。

核心逻辑

这里有两个关键点:一是如何确保只写一次,二是如何处理过期(比如协议更新后需要重新展示)。

1. 原子写入

使用 SETNX (Set if Not Exists) 是最经典的做法。如果 Key 不存在,设置成功并返回 1;如果已存在,说明用户已经看过,直接忽略。

// 伪代码示例
String key = "feature:agreement:" + userId;
Boolean success = redisTemplate.opsForValue().setIfAbsent(key, "accepted", 365, TimeUnit.DAYS);
if (!success) {
    // 用户已同意,直接放行
    return showFeaturePage();
}

注意这里的 setIfAbsent 配合 TTL 一起用,既保证了原子性,又设置了有效期。如果协议版本更新了,我们可以把 Key 删掉或者修改 Value 里的版本号,下次再进来就是新的了。

2. 检查状态

读取的时候非常简单,直接 GET 一下。如果返回 null 或者非预期值,就弹出协议页。

String status = redisTemplate.opsForValue().get(key);
if ("accepted".equals(status)) {
    // 已同意
} else {
    // 展示协议页
}

潜在坑点

  • 缓存穿透:如果是新用户,Key 不存在怎么办?通常不需要特殊处理,直接走逻辑即可。但如果恶意刷接口,可以考虑在网关层做限流。
  • 数据一致性:如果 Redis 挂了,用户会不会反复看协议?这取决于你的容灾策略。对于这种体验型功能,偶尔重复展示比无法展示要好得多。当然,生产环境记得配置 RDB/AOF 持久化。
  • 协议更新:如果协议内容变了,怎么让用户重新看?可以在 Key 里带上版本号,比如 key:version:v2,后端维护当前协议版本号,比对不一致时强制清除旧 Key。

总结

这个小需求其实是个很好的切入点,用来理解 Redis 在业务中的实际价值。它不仅仅是个缓存工具,更是解决特定业务逻辑(如状态标记、限流、分布式锁)的高效手段。通过合理的 Key 设计和命令选择,我们能以最小的成本换取最高的性能。在实际开发中,遇到类似的'一次性状态'或'高频读取'场景,不妨先想想能不能用上 Redis。

目录

  1. 需求背景
  2. 需求分析
  3. 为什么选 Redis?
  4. 方案对比
  5. 实战实现
  6. Key 的设计
  7. 核心逻辑
  8. 1. 原子写入
  9. 2. 检查状态
  10. 潜在坑点
  11. 总结
  • 💰 8折买阿里云服务器限时8折了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • Three.js 模型导入后显示黑色的常见原因及解决方案
  • 前端文本测量瓶颈突破:Pretext 纯 TypeScript 用户态引擎
  • Python FastAPI 入门教程:从环境搭建到核心功能
  • AR 眼镜移动端应用软件概述与技术展望
  • Java 单例模式详解:饿汉式与懒汉式实现对比
  • 链表实现解析:结构体与数组两种方式对比
  • 2024 年中国 AI 大模型场景应用趋势蓝皮书
  • 基于 Qwen Image 的儿童专属 AI 绘画工作流配置
  • 前端通用 AI Rules 规范:适配 Cursor、Trae 等主流 AI 工具
  • Qwen 大模型基于 QLoRA 的微调实战指南
  • DeepSeek-OCR-WebUI 部署实战:7 种模式与 GPU 加速多语言识别
  • Spatial Joy 2025 全球 AR&AI 赛事:资源、玩法与避坑指南
  • 无需公网 IP 安全访问本地 AI 服务的几种方案
  • Git 原理与使用深入剖析(上)
  • Llama-Factory 模型评估系统:科学衡量微调后性能变化
  • 2025 年睿抗机器人开发者大赛 CAIP 编程技能赛本科组解题报告
  • 中国开源大模型全球崛起:生态格局与数学底层逻辑
  • Llama-2-7B 昇腾 NPU 性能测评与部署实践
  • 大模型开发通用流程
  • Neeshck-Z-lmage_LYX_v2 本地 AI 绘画工具搭建教程

相关免费在线工具

  • Keycode 信息

    查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online

  • Escape 与 Native 编解码

    JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online

  • JavaScript / HTML 格式化

    使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online

  • JavaScript 压缩与混淆

    Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online