Intro to Redis | 青训营

29 阅读2分钟

什么是redis

image-20230820173342079

冷热数据:一些常用数据(热数据)访问很慢,可以把它放在内存中

image-20230820173428983

如何存储

一对多项

多项计数需求,可使用hash结构存储

image-20230820174727586

Hash 数据结构,渐进式rehash

image-20230820181530430

排序存储

Zset

数据结构zskiplist

image-20230820183416976

分布式锁

setnx实现,利用了两个特性:

  1. Redis是单线程执行命令
  2. setnx只有未设置过才能执行成功

存在的问题:

  1. 业务超时解锁会导致并发问题(业务时间超过锁超时时间)
  2. redis主备切换临界点问题:主备切换后,A持有的锁还未同步到新的主节点,B可在新主节点获得锁
  3. redis集群脑裂,导致出现多个主节点

常见优化

大Key

String: byte of value > 10KB

Other structures like hash/set/zset/list: >5000 item or total byte > 10MB

因为:redis单线执行

  • 读取成本高
  • 容易满查询
  • 主从节点复制异常、服务阻塞
  • 超时报错

拆分

大key拆分成小key

image-20230821100942224

业务逻辑复杂

压缩

将value压缩后写入,读取时解压再使用。

热key

QPS 高的key,会导致某个实例负载过重

image-20230821101310675

localcache

写到业务服务侧:如果过期/未命中就从redis中更新 image-20230821114030613

拆分

同时存到多个实例中,降低负载,但:写入时需要保证同步

image-20230821113925001

慢查询

pipeline一次传入过多key/value

Zset大小超过5k

大key

缓存穿透

热点数据绕过缓存,直接查询数据库

  • 一定不存在的数据:黑客反复查询导致db反应慢或者宕机
  • 缓存过期:批量缓存过期

如何解决:

  • 缓存空值:db不存在时缓存空值

  • 布隆过滤器:存储合法key

缓存雪崩

大量数据同时过期

  • 缓存空值:将失效时间分散开(失效时间加一个随机值)
  • 集群