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

61 阅读4分钟

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

本节课重点内容

  • Redis基本工作原理
  • Redis应用案例
  • Redis使用注意事项

本节课详细内容

redis基本工作原理有哪些?

RESP协议

什么是 RESP?

是基于TCP的应用层协议 RESP(REdis Serialization Protocol);
RESP底层采用的是TCP的连接方式,通过tcp进行数据传输,然后根据解析规则解析相应信息

RESP协议是在Redis 1.2中引入的,但它成为了与Redis 2.0中的Redis服务器通信的标准方式。这是所有Redis客户端都要遵循的协议,我们甚至可以基于此协议,开发实现自己的Redis客户端。
RESP实际上是一个支持以下数据类型的序列化协议:简单字符串,错误类型,整数,批量字符串和数组。

RESP有哪些内容

  • 数据从内存中读写
  • 数据保存到硬盘上防止重启丢失
  • 单线程处理顺序处理所有操作命令

Redis应用案例

  • 连续签到

    • 引出string数据结构,可以存储字符串、数字、二进制数据
  • 消息通知

    • 使用list作为消息队列
  • 计数

    • 一个用户有多项需求时,可以用hash按键值分别存储
  • 排行榜

  • 限流

  • 分布式锁

Redis使用的注意事项

避免大KEY

什么是大key

string类型中value的字节数大于10KB即为大key,Hash/Set等复杂数据结构类型 元素个数大于5000个或者总value字节数大于10MB即为大Key

大Key的危害

  • 读取成本高
  • 容易导致慢查询(过期、删除)
  • 主从复制异常、服务阻塞 无法正常响应请求

消除大key的方法

  • 拆分:将大key拆分为多个小key,如string可以进行拆分,可以用对hash取余的方式决定放在哪个key中。
  • 压缩:将value压缩后写入redis,读取时解压后再使用。可以用gzip,snappy等算法

减少热key

什么是热key

热key没有明确的划分标准,用户访问一个key的QPS特别高则称为热key。

减少热key危害的方法

  • 设置localcache : 一个精简版本地缓存组件,缓存达到容量上限时基于LRU策略来移除缓存元素,缓存达到容量上限时基于LRU策略来移除缓存元素
  • 拆分 将一个key拆成多个key

避免缓存穿透

什么是缓存穿透

缓存穿透:热点数据查询绕过缓存,直接查询数据库

在高并发场景下,一个热key如果过期,会有大量请求同时击穿至db,容易影响db性能和稳定。同一时间有大量key过期时,也会导致大量请求落到db上,导致查询变慢,甚至出现db无法响应新的查询。

查询一个不存在的数据,如果数据库也没有,就难以加载缓存,导致大量查询落在数据库上

如何解决?

首先最基本的就是要做参数校验,非法的参数就直接return

当请求的数据在穿过Redis后,数据库也返回空,这样的数据也可以存入到缓存中,然后过期时间可以设置一个比较短的时间,这样能够在一定程度上保障后端数据库的安全

避免缓存击穿

什么是缓存击穿

同一时刻从数据库中获取了大量数据,并且设置了相同的过期时间,这些缓存就会在同一时刻失效,这样就造成了缓存击穿的问题。

解决方案:

一些热点的数据,我们可以设置永不过期;或者是在访问数据的时候延长过期时间。 也可以用消息队列,如RabbitMQ等对业务进行消峰,降低db收到的请求量

避免缓存雪崩

缓存击穿后将数据库打垮的情况就叫做缓存雪崩。

解决方案:

批量存入缓存的数据,我们可以为这些数据分别配置比较合理的过期时间,即使是随机分配过期时间也可以,避免同一时间失效。

当数据库缓存出问题时,可以采用降级措施,保证某些数据在同一时刻只能有一个线程在查询数据库和写缓存,不至于把数据库给搞崩了。

还可以将Redis集群部署,然后将热点数据都分配到不同的节点上,这样就可以有效的防止雪崩的出现