Redis(2)| 青训营笔记

53 阅读2分钟

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

今天继续写有关Redis的部分。

6. 分布式锁

可采用的形式:setnx

  • setnx 只有未设置过才能执行成功

Redis注意事项

大Key,热Key

大Key

  • 对于String类型,字节数大于10kb
  • 对于Hash,Zset,Set,List类型,元素数大于5000或字节数大于10MB

大Key的问题:

  • 读取成本高
  • 容易产生慢查询

大Key表现:

  • Redis超时

解决方案:

  • 拆成多个小key
  • 压缩算法
  • 集合类可以区分冷热,或者hash,位掩码的办法拆分

热Key

  • 用户访问量QPS特别高

解决方案:

  • 设置LocalCache存储在业务侧
  • 拆分为多个Key,但存在数据短暂不一致的问题

慢查询常见场景

容易导致redis慢查询的操作 (1)批量操作一次性传入过多的keyalue,如mset/hmset/sadd/zadd等 O(n)操作 建议单批次不要超过100,超过100之后性能下降明显。 (2)zset大部分命令都是O(log(n),当大小超过5k以上时,简单的zadd/2rem也可能导致慢查询 (3)操作的单个value过大,超过10KB。也即,避免使用大Key (4)对大key的delete/expire操作也可能导致慢查询,Redis4.0之前不支持异步删除unlink,大key删除会阻塞Redis

缓存穿透,缓存雪崩

3.缓存穿透、缓存雪崩 缓存穿透:热点数据查询绕过缓存,直接查询数据库 缓存雪崩:大量缓存同时过期 缓存穿透的危害 (1)查询一个一定不存在的数据 通常不会缓存不存在的数据,这类查询请求都会直接打到db,如果有系统bug或人为攻击。 那么容易导致db响应慢甚至宕机 (2)缓存过期时 在高并发场景下,一个热key如果过期,会有大量请求同时至db,容易影响db性能和稳定,同一时间有大量key集中过期时,也会导致大量请求落到db上,导致查询变慢,甚至出现db无法响应新的查询