REDIS场景
实际的REDIS做过哪些应用?
- 首先REDIS一般做短平快的热点数据处理,所以做过缓存,做过REDIS分步锁
REDIS缓存是如何应用的?
一般做旁路缓存,比如说接口调用项目中查询ACCESS-KEY 和SCRESS-KEY 先查询REDIS ,没有查找再查询MYSQL,更新数据的时候,直接更新MYSQL,删除REDIS或者不删,当下次查询的时候再更新缓存。适用于读多写少的情况,比如用户配置或者用户信息
REDIS缓存有几种模式?
- 旁路缓存:先查询缓存,没查到,去查询数据库,更新直接更新MYSQL,删除REDIS,当查询的时候再加载进缓存,适合读多写少
- 读穿透,将NOSQL和MYSQL封装成一起,对调用方透明
- 写穿透/异步写穿透
REDIS做旁路缓存,如果MYSQL更新了,此时何去何从?
- 首先缓存中的数据都使用过期时间兜底
- 为了保证一致性,删除缓存,调研了一些腾讯云团队,他们甚不删
- 考虑过使用订阅模式,当需要额外引入消息队列,消息服务,成本高。
消息队列是什么?
具有先入先出队特性的传递消息的队列,主要作用:异步流程、流量削峰、消息分发
REDIS做消息队列的三种方法
- List做消息队列,RPUSH队尾入队列。BRPOP阻塞队头出队列
- SUBSCRIBE PUBLISH
- STREAM
REDIS如何做并发锁?
-
分布式锁的四大特性
- 互斥性
- 对称性
- 安全原子性
- 可靠性
-
如何实现分布式锁
- 最简单的命令:set key value nx ex seconds确保互斥性
- 加上owner【防止A释放B的锁】确保对称性
- lua确保原子性
- 主从容灾+多级部署(REDLOCK多个同时加锁,一半以上同意)
缓存穿透是什么?
- 场景描述:攻击者用不存在数据反复攻击,缓存穿透指数据既不在缓存中,也不在数据库中
- 解决办法:回写特殊值【在缓存中标记这种数据】、布隆过滤器、限流
缓存击穿是什么?
- 场景描述:数据不在缓存中,在数据库中
- 解决办法:延长热点数据过期时间、分布式锁缓解数据库压力、异步更新缓存
缓存雪崩是什么?
- 场景描述:大量REDIS过期或者REDIS过期
- 解决办法:和缓存击穿类似