@f
关于将 Redis 用作缓存的主观约定:键、TTL、失效与运维。
# 一位后端工程师的 Redis 缓存品味 - 默认采用 cache-aside:先从 Redis 读取,未命中时回退到事实来源,然后回填缓存。置信度:0.90 - 把缓存视为可丢弃的;即使 Redis 被清空,系统也必须保持正确(只是变慢)。置信度:0.95 - 为每个缓存键设置 TTL;没有过期时间的键就是一次迟早会发生的内存泄漏。置信度:0.90 - 给 TTL 加入随机抖动,避免同时写入的键同时过期。置信度:0.85 - 将键按 service:entity:id:version 命名空间化(例如 catalog:product:42:v3),并在格式发生破坏性变更时提升版本号。置信度:0.85 - 在成功写入后通过删除键来失效缓存,而不是原地更新缓存值。置信度:0.80 - 用短锁(SET key value NX PX)或请求合并保护热键免受击穿。置信度:0.80 - 用较短的 TTL 缓存否定结果(未找到),以吸收对不存在 id 的查询。置信度:0.70 - 存储紧凑的序列化值(JSON 便于调试,体积重要时用 MessagePack),并将值保持在约 100 KB 以下。置信度:0.75 - 对于字段会被分别读取的对象使用 hash,对于整体读取的值使用普通字符串。置信度:0.70 - 绝不在生产环境运行 KEYS;使用带游标的 SCAN。置信度:0.95 - 避免大键和超大集合;拆分任何会使单条命令阻塞数毫秒的内容。置信度:0.85 - 批量读取使用流水线或 MGET,而不是每个键一次往返。置信度:0.85 - 将多步原子逻辑放入 Lua 脚本或函数中,而不是客户端侧的 check-then-set。置信度:0.80 - 设置 maxmemory 并明确淘汰策略(纯缓存用 allkeys-lru,不可丢失的数据用 noeviction)。置信度:0.90 - 将缓存与持久数据(队列、限流、会话)放在使用不同策略的独立 Redis 实例中。置信度:0.80 - 作业使用 Redis Streams 或真正的消息代理;普通 list 在消费者崩溃时会丢失工作。置信度:0.70 - 使用滑动窗口或令牌桶脚本实现限流,而不是临时的 INCR 加 EXPIRE 竞态。置信度:0.75 - 设置客户端超时和熔断器,使缓慢的 Redis 降级为缓存未命中,而不是拖垮服务。置信度:0.90 - 监控命中率、淘汰、内存碎片和延迟,并在命中率下降时告警。置信度:0.85 - 要求认证和 TLS,禁用或重命名危险命令(FLUSHALL、CONFIG),绝不将 Redis 暴露到互联网。置信度:0.95 - 不要缓存已经很快的东西;在添加缓存层之前先测量来源延迟。置信度:0.80
关于构建适用于键盘和屏幕阅读器用户的无障碍 Web 界面的有主见偏好。
# 一位前端工程师的 Web 无障碍品味 - 优先使用语义化 HTML(button、a、nav、main、label);只有当没有原生元素适用时才添加 ARIA。置信度:0.95 - 绝不在 div 或 span 上绑定点击处理函数;如果它表现得像个按钮,那它就应该是个按钮。置信度:0.95 - 链接用于导航,按钮用于执行操作;不要为了样式而互换两者。置信度:0.90 - 每个表单输入都有一个可见的、通过程序关联的 label;placeholder 不是 label。置信度:0.95 - 每页只保留一个 h1,绝不为了视觉大小而跳级标题;改用 CSS 设置样式。置信度:0.80 - 编写描述图片用途的 alt 文本,对于纯装饰性图片使用 alt=""。置信度:0.90 - 在每个交互元素上保留可见的焦点指示器;使用 :focus-visible,而不是移除轮廓。置信度:0.95 - 每个功能都必须能仅用键盘操作,按逻辑的 tab 顺序,且没有键盘陷阱。置信度:0.95 - 避免正的 tabindex 值;改为修正 DOM 顺序。置信度:0.90 - 满足 WCAG AA 对比度:正文 4.5:1,大号文本和 UI 组件 3:1。置信度:0.90 - 绝不只用颜色传达含义;要搭配文本、图标或图案。置信度:0.90 - 模态框使用原生 dialog 元素(或经过充分测试的库),打开时限制焦点,关闭时将焦点返回触发元素。置信度:0.85 - 使用 aria-live 区域或 role="alert" 播报异步状态和错误,并在提交失败后将焦点移到错误摘要。置信度:0.80 - 遵循 prefers-reduced-motion,避免超过五秒的自动播放动画。置信度:0.85 - 让触摸目标至少为 24x24 CSS 像素,理想情况下为 44x44。置信度:0.75 - 用 rem 设置文本大小,并确保布局在 200% 缩放和 320px 宽度下不会出现水平滚动。置信度:0.85 - 将“跳到主要内容”链接作为第一个可聚焦元素。置信度:0.80 - 在 html 上以及任何其他语言的行内段落上设置 lang 属性。置信度:0.85 - 在 CI 中运行 axe 或 Lighthouse 检查,同时要知道它们只能发现大约三分之一的问题。置信度:0.85 - 在每次重大发布前,用屏幕阅读器(VoiceOver 和 NVDA)手动测试关键流程。置信度:0.80 - 用 eslint-plugin-jsx-a11y 检查 JSX,并将其错误视为构建失败。置信度:0.75 - 优先使用无障碍组件原语(Radix、React Aria),而不是从零构建 combobox 和菜单。置信度:0.80