Redis-大厂程序员是怎么用的 | 青训营

60 阅读4分钟

Redis(全称为Remote Dictionary Server)是一个开源的高性能键值对存储系统,具有快速、灵活和可扩展的特性。它是一个基于内存的数据结构存储系统,可以用作数据库、缓存和消息代理。

Redis是什么

数据从单表,演进出了分库分表,MySQL从单机演进出了集群。

随着数据量的增长,读写数据压力的不断增加。

数据分为冷数据和热数据:热数据即经常被访问到的数据,可以将热数据存储到内存中。

但是一般来说,内存数据一旦重启,就会丢失。那样要怎么处理呢?

Redis能在服务器上做到持久化。本工作原理如下

  • 数据从内存中读写
  • 数据保存到硬盘上防止重启数据丢失
  • 增量数据保存到AOF文件
  • 单进程处理

一些应用场景

  • 连续签到:例如掘金每日签到,用户每日有一次签到的机会,如果断签,连续签到计数将归0。就可以使用string这种数据结构来存储连续签到的值,将连续签到的过期时间expire设置到后天的0点。

  • 消息通知:例如当文章更新时,将更新后的文章推送到ES,用户就能搜索到最新的文章数据。可以使用Redis中的list这种数据结构来对其进行存储。

  • 计数:有一篇文章,其有点赞数、阅读数、关注数等数据需要进行存储。可以使用Hash这个数据结构来将文章和所涉及的数据进行存储。

  • 排行榜:对某个用户的关注数进行排列,积分变化时,排名要实时变更,可以使用zset这个数据结构来进行存储。

  • 限流:要求1秒内放行的请求为N,超过N则禁止访问。可以对其设置一个1s的key-value,每次请求时访问其数据,若存在则被拦截,否则可以请求以达到限流的效果。

  • 分布式锁:并发场景,要求一次只能有一个协程执行。执行完成后,其它等待中的协程才能执行。可以使用redis的setnx实现,利用了两个特性:①Redis是单线程执行命令;②setnx只有未设置过才能执行成功。

使用Redis的注意事项

大Key、热Key

大Key的定义:

QQ截图20230830212806.png

Key所对应的Value过大会造成:读取成本高;容易导致慢查询(过期、删除);主从复制异常,服务阻塞无法正常响应请求等危害。我们可以对其进行拆分和压缩两种方式,以消除大Key。

热Key的定义:

用户访问一个Key的QPS特别高,导致Server实例出现CPU负载突增或者不均的情况。热key没有明确的标准,QPS超过500就有可能被识别为热Key。我们可以通过设置Localcache、拆分等方式来解决热Key带来的危害。

慢查询场景

(1)批量操作一次性传入过多的key/value,如mset/hmset/sadd/zadd等O(n)操作,建议单批次不要超过100,超过100之后性能下降明显

(2)zset大部分命令都是O(log(n)),当大小超过5k以上时,简单的zadd/zrem也可能导致慢查询

(3)操作的单个value过大,超过10KB。也即,避免使用大Key

(4)对大key的delete/expire操作也可能导致慢查询,Redis4.0之前不支持异步删除unlink,大key删除会阻塞Redis

缓存穿透、缓存雪崩

缓存穿透指的是热点数据查询绕过缓存,直接查询数据库。

缓存雪崩指的是大量缓存同时过期。

缓存穿透的危害

(1)查询一个一定不存在的数据

通常不会缓存不存在的数据,这类查询请求都会直接打到db,如果有系统bug或人为攻击那么容易导致db响应慢甚至宕机。

(2)缓存过期

在高并发场景下,一个热key如果过期,会有大量请求同时击穿至db,容易影响db性能和稳定。

同一时间有大量key集中过期时,也会导致大量请求落到db上,导致查询变慢,甚至出现db无法响应新的查询。

可以通过设置缓存空值和使用布隆过滤器来减少缓存穿透。

通过将缓存时间分散开、热点数据设置较长的过期时间、使用Redis集群等操作来避免产生缓存雪崩。