这是我参与「第五届青训营 」伴学笔记创作活动的第 15 天
本文是对于掘金课程的课程笔记,针对课程内容的一些重难点、本人在学习Redis知识时候进行的简单记录。
一、本堂课的重点内容
- Redis是什么
- Redis应用案例
- Redis使用注意事项
二、详细知识点介绍
Redis是什么
为什么需要?
- 数据从单表,演进出了分库分表
- Mysql从单机演化出了集群,导致数据量增长,读写数据压力不断增加
如何解决?
- 数据分冷热(热数据:经常被访问到的数据)
- 将热数据存储到内存中
Redis基本原理
- 数据从内存中读写
- 数据保存到硬盘上防止重启数据丢失(增量数据保存到AOF文件,全量数据RDB文件)
- 单线程处理所有操作命令
Redis应用案例
连续签到
掘金每日连续签到
string 数据结构
- 可以存储字符串、数字、二进制数据
- 通常和expire配合使用
- 场景:存储计数、session
消息通知
用list作为消息队列
使用场景:消息通知,例如当文章更新时,将更新后的文章推送到ES,用户就能搜索到最新的文章数据
计数
一个用户有多项计数需求,可以通过hash结构存储
hash数据结构dict
- rehash:rehash操作是将ht[0]中的数据全部迁移到ht[1]中。数据量小的场景下,直接将数据从ht0拷贝到ht1速度是较快的。数据量大的场景,会有明显阻塞。
- 渐进式rehash:为避免这种情况,采用rehash方案。基本原理是每次用户访问时都会迁移少量数据,将整个迁移过程平摊到所有的访问。
排行榜
积分变化时,排名要实时更新
- 结合dict后,可通过key操作跳表的功能
zset数据结构zskiplist,查找数字7的路径,head,3,3,7(跳跃表),redis使用skiplist+hash
限流
要求1秒内放行的请求为n,超过n禁止访问
分布式锁
并发场景,要求一次只能有一个协程执行。执行完成后,其他等待中的协程才能执行,可以使用redis的setnx实现,两个特性:
- redis是单线程执行命令
- setnx只有未设置过才能执行成功
Redis使用注意事项
大key,热key
大key的危害:
- 读取成本高
- 容易导致慢查询
- 主从复制异常,服务阻塞
业务侧使用大key的表现:请求redis超时报错
解决大key方法:
- 拆分,将大key拆分为小key,例如一个string拆分为多个string
- 压缩,将value压缩后写入redis,读取时解压后再使用。压缩算法可以用gzip、snappy、lz4等。需要考虑解压时间。
- 集合类结构hash、list、set:拆分和冷热分离
解决热key的方法:
- 设置localcache
- 拆分
- 使用redis代理的热key承载能力
慢查询场景
- 批量操作一次性传入过多key value
- zset大部分命令都是O(log(n))
- 操作的单个value过大,超过10kb
- 对大key的delete/expire操作也可能
缓存穿透、缓存雪崩
- 缓存穿透:热点数据绕过缓存,直接查询数据库
- 缓存雪崩:大量缓存同时过期
解决缓存穿透
- 缓存空值
- 布隆过滤器
解决缓存雪崩:
- 缓存空值
- 使用缓存集群,避免单机宕机导致缓存雪崩
三、课后个人总结
Redis一直是数据存储方面的一个重要内容,想要进行高并发的项目开发我们离不开redis,本节课程重点从数据结构的角度介绍了redis的各种应用场景,然后介绍了redis的各种注意事项,问题以及解决方法。