17 Redis - 大厂程序员是怎么用的| 青训营笔记

80 阅读3分钟

这是我参与「第五届青训营 」笔记创作活动的第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设置缓存集群 避免单机宕机