这是我参与「第五届青训营 」伴学笔记创作活动的第 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无法响应新的查询