这是我参与「第五届青训营 」伴学笔记创作活动的第 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)
- 导致缓存穿透、缓存雪崩的场景及避免方案
- 缓存穿透:热点数据查询绕过缓存,直接查询数据库
- 解决办法:缓存空值、布隆过滤器。
- 缓存雪崩:大量缓存同时过期
- 解决办法:将缓存失效时间分散开(在原数据上增加随机值)、使用缓存集群。
- 缓存穿透:热点数据查询绕过缓存,直接查询数据库