了解Redis|青训营笔记

52 阅读3分钟

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

1. Redis是什么

为什么需要Redis

  • 数据从单表,演进出分库分表
  • MySQL从单机演进出集群
  • 数据分冷热(热数据:经常被访问到的数据)
  • 将数据存储到内存中

Redis基本工作原理

  • 数据从内存中读写
  • 数据保存到硬盘上防止重启数据丢失
    • 增量数据保存到AOF中
    • 全量数据存储在RDB文件
  • 单线程处理所有操作命令

2. Redis应用案例

连续签到

  • Key: cc_id_11xxxxx
  • value : 252
  • expireAt: 后天0点

String数据结构 Pasted image 20230215203726.png

消息通知

当文章更新时,将更新后的文章推送到ES,使得用户能搜索到最新的文章数据,用list作为消息队列

Quicklist

Pasted image 20230215204618.png

计数

一个用户有多项计数需求,可通过hash结构存储,一次传输多个key时,可以使用pipeline提高性能

Hash数据结构dict

  • rehash: 将ht[0]中的数据全部迁移到ht[1]中。数据量小的场景下,直接将数据从ht[0]拷贝到ht[1]中速度是较快的。数据量大的场景,潜移过程将会明显阻塞用户请求
  • 渐进式rehash:每次用户访问时都会潜移少量数据,将整个迁移过程,平摊到所有的请求中,避免阻塞用户请求

Pasted image 20230215205939.png

排行榜

积分变化时,排名实时变更

zset数据结构 zskiplist

限流

要求1s内放行的请求为N,超过N则禁止访问

Key: comment_freq_limit_时间戳 对这个key调用incr,超过限制N则禁止访问

分布式锁

并发场景,要求一次只能有一个协程执行。执行完成后,其它等待中的协程才能执行。

可以使用redis的setnx实现,利用了两个特性:

  • Redis是单线程执行命令
  • setnx只有未设置过才能执行成功

3. Redis使用注意事项

大Key

大key有两种:

  1. String类型 Value的字节数大于10KB即为大Key
  2. 复杂数据结构类型,元素个数大于5000个或总value字节数大于10MB 大Key的危害
  • 读取成本高
  • 容易导致慢查询(过期,删除)
  • 主从复制异常,服务阻塞,无法正常响应请求

消除大Key的方法

  1. 拆分:将大Key拆分为若干段
  2. 压缩:将value压缩后写入redis,读取时解压后再使用
  3. 区分冷热:如榜单列表场景使用zset,只缓存前10页数据,后序数据走db

热Key

用户访问一个Key的QPS特别高,导致Server实例出现CPU负载突增或者不均的情况。热key没有明确的标准,QPS超过500就有可能被识别为热key。

解决热Key的方法

  1. 设置Localcache 在访问Redis前,在业务服务测设置Localcache,降低访问Redis的QPS。
  2. 拆分 将key:value复制写入多分,访问的适合访问多个key,但是请求被分散到不同实例上,降低了负载。代价是更新时需要更新多个,存在数据短暂不一致的风险
  3. 使用Redis代理的热key承载能力