这是我参与「第五届青训营 」笔记创作活动的第28天
Redis是什么
什么是Redis
为什么需要Redis
数据从单表,演进出了分库分表
MySQL从残疾演进出了集群,这就导致了数据量增加,读写数据的压力不断增加
数据又分冷热:热数据就是经常被访问到的数据
Redis能将热数据存储到内存中,极大的优化了效率
基本工作原理
- 让数据从内存中读写来
- 同时也让数据保存到硬盘中防止重启数据丢失
- 增量数据:AOF文件
- 全量数据:RDB文件
- 单线程的处理所有操作命令
应用案例
- 连续签到
- 消息通知
- 技术
- 排行榜
- 限流
- 分布式锁
连续签到
string数据结构
- 可以存储字符串,数字,二进制数据
- 通常和expire配合使用
- 场景:存储技术,Session
消息通知
用list作为消息队列
- 使用场景:消息通知
- 文章更新时就将更新后的文章推送到ES,用户就能搜索到最新的文章数据
数据结构
- QuickList------由一个双向链表和listpack实现
计数
可以通过hash结构存储
hash数据结构dict
- rehash
- 数据量大时,迁移过程会明显阻塞用户请求
- 渐进式rehash
- 每次用户访问是都会迁移少量数据,将整个迁移过程平摊到所有的访问用不请求过程中
排行榜
关键在于积分变化时,排名要实施变更
- 结合dict后,可实现通过key操作跳表的功能
ZSET数据结构zskiplist
- 结合dict
限流
- 要求一秒内放行的请求为N,超过N则禁止访问
分布式锁
并发场景,要求一次只能由一个协程执行
执行完成后,其他等待中的协程才能执行
- 用setnx实现!利用了两个特性
- redis是单线程执行命令
- setnx只有未设置过才能执行成功
使用注意事项
大Key,热Key
- 什么是大Key?
- string标准下,是value的字节数大于10kb即为大Key
- Hash/Set/Zest/list等复杂数据结构类型标准下,要求元素大于5000个或总字节数大于10MB即为大Key
- 危害:
- 读取成本高
- 导致查询慢
- 表现:
- 请求Redis超时报错
- 消除方法
- 将大Key查分成小Key
- 压缩:将value用压缩算法压缩后再写入redis
- 区分冷热
- 什么是热Key
- 当用户访问一个Key的Qps特别高,导致Server实例出现CPU负载突增或者不均的情况,一般QPS超过500就可判定为热KEY
- 解决方法:
- 设置localCache
- 拆分
- 用Redis代理的热Key承载能力
- 慢查询场景如下
- 批量操作一次性传入过多的key/value
- 单个value过大
- 对大key的delete和expire操作
缓存穿透,缓存雪崩
- 缓存穿透:热点数据查询绕过缓存,直接查询数据库
- 危害:
- 查询一个一定不存在的数据,db容易响应慢或者宕机
- 解决:
- 缓存空值,布隆过滤器
- 缓存雪崩:大量缓存同时过期
- 缓存过期时会有大量请求同时击穿db,容易影响db性能和稳定,出现db无法相应新的查询
- 解决:魂村空值,使用缓存集群,避免单机宕机造成的缓存雪崩