Redis - 大厂程序员是怎么用的 | 青训营笔记

65 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 17 天

为什么需要Redis

  • Mysql数据压力的增加
  • 冷数据和热数据的区分,对热数据缓存到内存中

Redis基本工作原理

  • Redis实现数据持久化的原理
    • 增量数据保存到AOF
    • 全脸数据RDB
  • Redis单线程处理所有操作命令

Redis应用案例

  • 掘金连续签到,需要了解GET/SET,Key过期
    • Key: cc_uid_[uid]
    • value: [签到天数]
    • expireAt: 后天的零点
  • 消息通知:用list作为消息队列
    • list结构:双向链表+listpack
  • 掘金用户计数,使用到HASH
  • 排行榜ZSET
  • 限流:要求1秒内放行的请求为N,超过N则禁止放行
  • 使用SETNX实现分布式锁

在字节跳动,使用Redis有哪些注意事项

  • 大Key:
    • String大于10KB就是大Key,使用大Key将导致Redis系统不稳定
    • Hash/Set/Zset/list等复杂数据结构:元素数大于5000个或总字节数大于10MB
    • 危害
      • 读取成本高
      • 容易导致慢查询
      • 主从复制异常
    • 消除大Key的方法:
      • 拆分:例如一个String拆分成多个String
      • 压缩,压缩算法可以是gzip、snappy、lz4
      • 区分冷热:只缓存前十页,后续数据走db
  • 热Key:一个Key的QPS特别高,将导致Redis实例出现负载突增,负责均衡流量不均的情况。导致单实例故障
    • 解决方法:
      • 设置localcache
      • 拆分,访问多个key,但是value是相同的。代价是需要更新多个key
      • 使用热Key承载能力,自动实现优化
  • 慢查询:大Key、热Key的读写;一次操作过多的Key(mset/hmset/sadd/zadd)
  • 导致缓存穿透、缓存雪崩的场景及避免方案
    • 缓存穿透:热点数据查询绕过缓存,直接查询数据库
      • 解决办法:缓存空值、布隆过滤器。
    • 缓存雪崩:大量缓存同时过期
      • 解决办法:将缓存失效时间分散开(在原数据上增加随机值)、使用缓存集群。