Redis | 青训营笔记

48 阅读3分钟

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

1.概述

  1. 为什么需要Redis,Redis的基本工作原理
  2. Redis应用案例
  3. 在字节跳动,使用Redis有哪些注意事项

2.Redis

2.1 熟悉Redis基本操作

2.1.1 熟悉以下命令的操作

  • GET/SET/DEL/INCR/SETNX
  • HSET/HGET/HINCRBY
  • LPUSH/RPOP/LRANGE
  • ZADD/ZRANGEBYSCORE/ZREVRANGE/ZINCRBY/ZSCORE

2.1.2 了解pipelining概念

2.1.3 复习数据结构

  • 链表/FIFO
  • Hash Tale
  • Skip List

2.2 Redis基本工作原理

  • Redis实现数据持久化的原理:AOF/RDB
  • Redis单线程处理命令的概念

2.3 Redis应用案例

  • 掘金连续签到,需要了解GET/SET,Key过期
  • 掘金用户计数,使用到HASH
  • 排行榜ZSET
    • 积分变化时,排名要实时变更
    • 结合dict后,实现跳表
  • 限流
  • 使用SETNX实现分布式锁

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

  • 大Key:Value大于10KB就是大Key,使用大Key将导致Redis系统不稳定

    • 拆分:
      • image.png
    • 压缩value
    • 集合类结构hash、list、set - 拆分 - 区分冷热:如榜单列表场景使用zset,只缓存前10页数据,后续数据走db
  • 热Key:一个Key的QPS特别高,将导致Redis实例出现负载突增,负责均衡流量不均的情况。导致单实例故障

    • 设置Localcache
      • 在访问Redis前,在业务服务侧设置Localcache,降低访问Redis的QPS。Localcache中缓存过期或未命中,则从Redis中将数据更新到Localcache。
      • image.png
      • Java:Guava; Golang: bigcache
    • 拆分
      • 将key:value这一个热key复制写入多份。例如key1:value,key2:value
    • 使用Redis代理的热key承载能力
      • image.png
  • 慢查询:大Key、热Kye的读写;一次操作过多的Key(mset/hmset/sadd/zadd)

  • 导致缓存穿透、缓存雪崩的场景及避免方案(还有缓存击穿

    • image.png

    • 缓存穿透避免

      • 使用布隆过滤器:将查询的参数都存储到一个 bitmap 中,在查询缓存前,如果 bitmap 存在则进行底层缓存的数据查询,如果不存在则进行拦截,不再进行缓存的数据查询

      • 缓存空对象:如果数据库查询的为空,则依然把这个数据缓存并设置过期时间,当多次访问的时候可以直接返回结果,避免造成多次访问数据库,但要保证当数据库有数据时及时更新缓存

    • 缓存雪崩避免

      1. 在缓存失效后,通过加锁或者队列来控制读数据库写缓存的线程数量。比如对某个Key只允许一个线程查询和写缓存,其他线程等待

      2. 通过缓存 reload 机制,预先去更新缓存,在即将发生高并发访问前手动触发加载缓存

      3. 对于不同的key设置不同的过期时间,让缓存失效的时间点尽量均匀,比如我们可以在原有的失效时间基础上增加一个随机值,比如1~5分钟随机,这样每一个缓存的过期时间的重复率就会降低。

      4. 设置二级缓存,或者双缓存策略。