这是我参与「第五届青训营」伴学笔记创作活动的第 16 天
一、本堂课重点内容
本节课程主要分为三个方面:
- Redis基本工作原理
- Redis应用案例
- 使用Redis的注意事项
二、详细知识点介绍
1 Redis基本工作原理
- 为什么需要Redis
- 数据从单表演进出了分库分表,MySQL从单机演进出了集群,数据量增长,读写数据的压力增加。
- 数据分冷热:热数据为经常被访问的数据,存储到内存中,加快读取速度。
- 数据持久化原理
- 增量数据保存到AOF文件。
- 全量数据RDB文件。
- 单线程处理命令
2 Redis应用案例
-
连续签到
- key:用户id
- value:连续签到天数
- expireAt:设置过期时间为后天0点,实现如果第二天没有签到就过期的功能
-
String数据结构
- 可以存储字符串、数字、二进制数据。
- 通常和expire配合使用
- 场景:存储技术、session
-
消息通知
- 用list作为消息队列。
- list数据结构quicklist:由双向链表和listpack实现。
-
计数
-
用户的计数需求可以通过hash结构存储。
-
hash数据结构dict:rehash、渐进式rehash。
-
-
排行榜:实现积分变化时排名实时变更的功能
- 使用zest:首先它是一个 set,这保证了内部 value 值的唯一性,其次它给每个 value 添加了一个 score(分值)属性,通过对分值的排序实现了有序化。
- zest数据结构zskiplist:跳表。
-
限流:要求1秒内放行的请求为N,超过N则禁止访问
- key:limit值
- 对key调用incr,超过限制N则禁止访问。
-
分布式锁
- 并发场景中要求一次只能有一个协程执行,使用redis的setnx实现。
- 利用的特性
- redis是单线程执行命令。
- setnx只有未设置过才能执行成功。
3 使用Redis的注意事项
-
大Key、热Key
- 大Key的定义:字节数大于一定值。
- 大Key的危害:
-
读取成本高。
-
容易导致慢查询。
-
主从复制异常,服务阻塞,无法正常响应请求。
-
- 消除大Key的方法:
-
将大Key拆分为小Key。
-
压缩value。
-
- 热Key的定义:访问这个Key的QPS较高。
- 消除热Key的方法:
- 设置Localcache。
- 将一个热Key复制写入多份,更新时需要更新多个Key。
-
避免慢查询场景
-
缓存穿透、缓存雪崩
- 缓存穿透:热点数据查询绕过缓存,直接查询数据库。
- 缓存雪崩:大量缓存同时过期。
- 避免缓存穿透:
- 缓存空值。
- bloom filter算法。
- 避免缓存雪崩:
- 缓存空值。
- 使用缓存集群,避免单机宕机造成的缓存雪崩。