Redis | 青训营笔记
这是我参与「第五届青训营」笔记创作活动的第15天。
Redis是什么
随着 MySQL 从单机演化为集群,数据量不断增长,读写数据的压力不断增加,而数据分冷热,所以是否可以把热数据存储到内存中提高数据读写速率呢?Redis也就这样应运而生了,Redis数据从内存中读写,数据保存到硬盘上以防止重启数据丢失(其中增量数据保存到 AOF 文件,全量数据保存到 RDB 文件),单线程处理所有指令。
Redis应用案例
String 数据结构:sds
List数据结构:Quicklist
Hash数据结构:dict
rehash: rehash操作是将ht[0]中的数据全部迁移到ht[1]中。数据量小的场景下直接将数据从ht[O]拷贝到ht[1]速度是较快的。数据量大的场景,例如存有上百万的KV时,迁移过程将会明显阻塞用户请求。
渐进式rehash: 为避免出现这种情况,使用了rehash方案。基本原理就是,每次用户访问时都会迁移少量数据。将整个迁移过程,平摊到所有的用户访问请求过程中。
zset数据结构:zskiplist
Redis使用注意事项
大Key解决方法:
- 拆分
- 压缩
- 对于集合类结构:拆分、区分冷热
热Key解决方法:
- 设置 Localcache
- 拆分
- 使用 Redis 代理的热 Key 承载能力
容易导致慢查询的操作:
- 批量操作一次性传入过多的key/value,如mset/hmset/sadd/zadd等O(n)操作。建议单批次不要超过100,超过100之后性能下降明显
- zset大部分命令都是O(log(n),当大小超过5k以上时,简单的zadd/zrem也可能导致慢查询
- 操作的单个value过大,超过10KB。也即,避免使用大Key
- 对大key的delete/expire操作也可能导致慢查询,Redis4.0之前不支持异步删除unlink, 大Key删除会阴塞Redis
缓存穿透解决方法:
- 缓存空值
- 布隆过滤器
缓存雪崩解决方法:
- 缓存空值
- 使用缓存集群,避免单机宕机造成的缓存雪崩