Redis | 青训营笔记

64 阅读2分钟

Redis | 青训营笔记

这是我参与「第五届青训营」笔记创作活动的第15天。

Redis是什么

随着 MySQL 从单机演化为集群,数据量不断增长,读写数据的压力不断增加,而数据分冷热,所以是否可以把热数据存储到内存中提高数据读写速率呢?Redis也就这样应运而生了,Redis数据从内存中读写,数据保存到硬盘上以防止重启数据丢失(其中增量数据保存到 AOF 文件,全量数据保存到 RDB 文件),单线程处理所有指令。

Redis应用案例

String 数据结构:sds

image.png

List数据结构:Quicklist

image.png image.png

Hash数据结构:dict

rehash: rehash操作是将ht[0]中的数据全部迁移到ht[1]中。数据量小的场景下直接将数据从ht[O]拷贝到ht[1]速度是较快的。数据量大的场景,例如存有上百万的KV时,迁移过程将会明显阻塞用户请求。

渐进式rehash: 为避免出现这种情况,使用了rehash方案。基本原理就是,每次用户访问时都会迁移少量数据。将整个迁移过程,平摊到所有的用户访问请求过程中。

image.png

zset数据结构:zskiplist

image.png image.png

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

缓存穿透解决方法:

  • 缓存空值
  • 布隆过滤器

缓存雪崩解决方法:

  • 缓存空值
  • 使用缓存集群,避免单机宕机造成的缓存雪崩