什么是redis
冷热数据:一些常用数据(热数据)访问很慢,可以把它放在内存中
如何存储
一对多项
多项计数需求,可使用hash结构存储
Hash 数据结构,渐进式rehash
排序存储
Zset
数据结构zskiplist
分布式锁
setnx实现,利用了两个特性:
- Redis是单线程执行命令
- setnx只有未设置过才能执行成功
存在的问题:
- 业务超时解锁会导致并发问题(业务时间超过锁超时时间)
- redis主备切换临界点问题:主备切换后,A持有的锁还未同步到新的主节点,B可在新主节点获得锁
- redis集群脑裂,导致出现多个主节点
常见优化
大Key
String: byte of value > 10KB
Other structures like hash/set/zset/list: >5000 item or total byte > 10MB
因为:redis单线执行
- 读取成本高
- 容易满查询
- 主从节点复制异常、服务阻塞
- 超时报错
拆分
大key拆分成小key
业务逻辑复杂
压缩
将value压缩后写入,读取时解压再使用。
热key
QPS 高的key,会导致某个实例负载过重
localcache
写到业务服务侧:如果过期/未命中就从redis中更新
拆分
同时存到多个实例中,降低负载,但:写入时需要保证同步
慢查询
pipeline一次传入过多key/value
Zset大小超过5k
大key
缓存穿透
热点数据绕过缓存,直接查询数据库
- 一定不存在的数据:黑客反复查询导致db反应慢或者宕机
- 缓存过期:批量缓存过期
如何解决:
-
缓存空值:db不存在时缓存空值
-
布隆过滤器:存储合法key
缓存雪崩
大量数据同时过期
- 缓存空值:将失效时间分散开(失效时间加一个随机值)
- 集群