这是我参与「第五届青训营 」笔记创作活动的第17天
1Redis是什么
2Redis应用案例
3Redis使用注意事项
1什么是Redis
为什么需要
数据从单表 演进出分库分表
mySQL从单机演进出集群
数据量增长 读写数据压力不断增加
数据分冷热
将热数据存储到内存中
Redis基本工作原理
数据从内存中读写
数据保存到硬盘上防止重启数据丢失
增量数据保存到AOF文件
全量RDB文件
单线程处理所有操作命令
2Redis应用案例
案例
1连续签到
Key value expireAt
2消息通知
String数据结构 可存储字符串 数字 二进制数据 通常和expire配合使用 场景:存储计数 Session
2消息通知
用list作为消息队列
使用场景:消息通知
将更新推送到ES
Quicklist 双向链表和listpack实现
3计数
多项计数需求
可通过hash结构存储
hash数据结构dict rehash 渐进式hash
4排行榜
积分变化时,排名实时变更
结合dict后可实现通过key操作跳表的功能
zest数据结构 zskiplist
5限流 要求1秒内放行的请求为N 超过N则禁止访问
6分布式锁
可以使用redis的setnx实现 利用了两个特性
redis是单线程执行命令
setnx只有未设置过才能执行成功
3Redis使用注意事项 大Key、热Key 慢查询场景 缓存穿透、缓存雪崩
大Key的定义
value字节数大于10KB/
复杂数据结构类型元素大于5000给或总value字节数大于10MB
大Key的危害
读取成本高
容易导致慢查询 过期删除
主从复制异常 服务阻塞
无法响应正常请求
业务侧使用大Key的表现 请求Redis超时报错
消除大Key的方法
1拆分
2压缩
3集合类结构
拆分 hash取余
区分冷热 zset只缓存前十页
热Key的定义
QPS超过500就可能识别为热Key
导致Server实例出现CPU负载突增或者不均的情况
解决热Key方法
1设置Localcache
在访问Redis前,在业务服务侧设置Localcache,降低访问Redis的OPS。LocalCache中缓存过期或未命中.则从Redis中将数据更新到LocalCache。Java的Guava、Golang的Bigcache就是这类LocalCache
2拆分
3使用Redis代理的热Key承载能力
字节跳动的Redis访问代理就具备热Key承载能力。本质上是结合了“热Key发现"、"LocalCache"两个功能
2.慢查询场景
容易导致redis慢查询的操作
1)批量操作一次性传入过多的kev/value , 如mset/hmset/sadd/zad等o(n)操作
建议单批次不要超过100,超过100之后性能下降明显。
(2)zset大部分命令都是o(log(n)),当大小超过5k以上时,简单的zadd/zrem也可能导致慢查询
(3)操作的单个value过大,超过10KB。也即,避免使用大Key
(4)对大key的delete/ expire操作也可能导致慢查询,Redis4.0之前不支持异步删除unlink,大key删除会阻塞Redis
3缓存穿透 缓存雪崩
穿透 热电数据绕过缓存 直接查询数据库
雪崩 大量缓存同时过期
缓存穿透危害
1查询一个一定不存在的数据
2缓存过期时
减少缓存穿透
1缓存空值
2布隆过滤器
避免缓存雪崩
1缓存失效时间分散开 增加一个随机值
2设置缓存集群 避免单机宕机