Redis - 大厂程序员是怎么用的 | 青训营笔记
这是我参与「第五届青训营 」笔记创作活动的第17天
今天主要对Redis - 大厂程序员是怎么用的进行学习。
一、本堂课重点内容:
本次课程讲了以下几个方面:
-
为什么需要Redis,Redis的基本工作原理
-
Redis应用案例
-
在字节跳动,使用Redis有哪些注意事项
二、详细知识点介绍:
1.为什么需要Redis,Redis的基本工作原理
在关系型数据库中,我们数据从单表演进出了分库分表,例如MySQL也随着数据量的增长和读写压力的不断增加,也从单机演进到集群。如下图:
那么我们为什么需要使用非关系型数据库Redis呢?因为我们存在数据库里面的数据可以按照读取频率划分为热数据和冷数据。我们可以将读取频率高的热数据缓存到Redis数据库中,提升读取速率,将读取频率较低的冷数据存在MySQL中。如下图:
Redis是将数据存在内存中,所以对使用Redis数据库存储的数据进行读/写操作更快。同时Redis还提供了RDB和AOF两种方式来将数据持久化到硬盘中,以防止重启导致数据丢失。最后Redis是一个单线程+多路复用来处理所有命令的。
2.Redis应用案例
- 连续签到:例如我们使用的掘金每日签到,用户每日有一次签到的机会,如果断签,连续签到计数将归0。连续签到的定义:每天必须在23:59:59前签到。我们就可以使用string这种数据结构来存储连续签到的值,将连续签到的过期时间expire设置到后天的0点。
- 消息通知:例如当文章更新时,将更新后的文章推送到ES,用户就能搜索到最新的文章数据。这个时候我们就可以使用Redis中的list这种数据结构来对其进行存储。
- 计数:例如我们有一篇文章,其有点赞数、阅读数、关注数等数据需要进行存储。这个时候我们就可以使用Hash这个数据结构来将文章和所涉及的数据进行存储。
- 排行榜:例如我们对某个用户的关注数进行排列,积分变化时,排名要实时变更,就可以使用zset这个数据结构来进行存储。
- 限流:要求1秒内放行的请求为N,超过N则禁止访问。我们就可以对其设置一个1s的key-value,每次请求时访问其数据,若存在则被拦截,否则可以请求以达到限流的效果。
- 分布式锁:并发场景,要求一次只能有一个协程执行。执行完成后,其它等待中的协程才能执行。可以使用redis的setnx实现,利用了两个特性:①Redis是单线程执行命令;②setnx只有未设置过才能执行成功。
3.在字节跳动,使用Redis有哪些注意事项
3.1 大Key、热Key
大Key的定义:
Key所对应的Value过大会造成:读取成本高;容易导致慢查询(过期、删除);主从复制异常,服务阻塞无法正常响应请求等危害。我们可以对其进行
拆分和压缩两种方式,以消除大Key。
热Key的定义:
用户访问一个Key的QPS特别高,导致Server实例出现CPU负载突增或者不均的情况。热key没有明确的标准,QPS超过500就有可能被识别为热Key。我们可以通过设置Localcache、拆分等方式来解决热Key带来的危害。
3.2 慢查询场景
一下情况容易导致慢查询:
- (1)批量操作一次性传入过多的key/value,如mset/hmset/sadd/zadd等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.3 缓存穿透、缓存雪崩
缓存穿透指的是热点数据查询绕过缓存,直接查询数据库。缓存雪崩指的是大量缓存同时过期。
缓存穿透的危害
- (1)查询一个一定不存在的数据 通常不会缓存不存在的数据,这类查询请求都会直接打到db,如果有系统bug或人为攻击那么容易导致db响应慢甚至宕机。
- (2)缓存过期时 在高并发场景下,一个热key如果过期,会有大量请求同时击穿至db,容易影响db性能和稳定。 同一时间有大量key集中过期时,也会导致大量请求落到db上,导致查询变慢,甚至出现db无法响应新的查询。
我们可以通过设置缓存空值和使用布隆过滤器来减少缓存穿透。通过将缓存时间分散开、热点数据设置较长的过期时间、使用Redis集群等操作来避免产生缓存雪崩。
三、课后个人总结:
通过对Redis - 大厂程序员是怎么用的的学习,我学到了Redis中的数据结构在实际场景下的使用,由于Redis是将数据存在于内存中,所以具有很快的读/写效率,最后还了解了Redis会出现的一些问题场景,如:大Key、热Key、缓存穿透、缓存雪崩等问题以及解决策略。使用Redis配合关系型数据库(如MySQL)进行项目的数据存储,可以有效提高系统对数据的存/储效率。