这是我参与「第五届青训营 」伴学笔记创作活动的第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集群部署,然后将热点数据都分配到不同的节点上,这样就可以有效的防止雪崩的出现