Redis | 青训营笔记

86 阅读2分钟

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

  在没有 Redis 的时代,后端应用直接和 MySQL 打交道,但随着互联网的发展,后端面临的压力越来越大,便需要缓存来降低数据库的压力。

Redis 简介

  Redis 客户端使用 RESP 协议与服务端建立连接。

  Redis 以键值对的形式将数据存储到内存中并将其持久化为 RDB 文件。RDB 文件保存了 Redis 中所有的数据。也可根据需要启用 AOF(Append Only File) 文件,AOF 文件记录了 所有对数据的操作。

  Redis 采用单线程+多路复用的方式处理请求,其事务只保证一段操作在执行上的连续性。

应用案例

连续签到

  每次签到对特定的 key 自增并更新其过期时间为操作时刻的 24 小时内,可记录签到天数并做到“不连续签到ui会导致签到失效”的效果。

消息通知

  产生新消息时将其索引存入 Redis,程序定时查询其更新情况。常用的数据结构为 quicklist 和 Listpack。

计数

  对于文章浏览数、视频点赞数等读远大于写、数据量很大且多个数据与与某个实体对应的数据,可直接使用 hash 在 Redis 中存储。

  Hash 在使用过程中难免出现 Hash 碰撞的情况,这会严重降低 Hash 的效率,因此应该进行 Rehash,即开辟更大的空间存储数据。为了避免阻塞,应将该过程·平摊到多次用户操作之间。

排行榜

  排行榜可使用 zset 进行存储并通过zrevrangerange快读获得排序信息。

限流

  构建包含请求时的时间戳的 key,其 value 为受到的请求数,当其达到阈值则停止后续请求。

分布式锁

  利用 Redis 的单线程处理和setnx的幂等性,实现加锁与加锁测试的统一。

注意事项

大 key 与 热 key

  value 超过 10KB 的 string 和元素超过5000个或value 超过10MB 的其他数据类型的 key 即为大 key,大 key 会严重影响 Redis 的效率,应采用拆分、压缩(gzip、lz4、snappy等)、使用 MessagePack 处理 JSON 等方法避免。

  热 key 没有明确的标准,可使用 LocalCache 等方式缓解问题。

慢查询

  慢查询有很多原因,比如:

  • 一次操作大量(>100)个 key
  • zset 太大(5k)
  • value 太大(10k)
  • 大 key 删除

缓存穿透、缓存击穿和缓存雪崩

本文若有不足之处,欢迎纠正(≧^.^≦)喵~

我的其他笔记,可在掘金或 Github( github.com/DoudiNCer/I… )阅读