redis实践 | 青训营笔记

41 阅读3分钟

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

Redis

概述

为什么需要Redis

  • mysql数据量增加
  • 读写压力不断增大

数据分冷热数据

  • 冷数据:不则么访问
  • 热数据:经常访问

要将热数据存储到内存中

image.png

Redis基本工作原理

image.png

redis是单线程处理所有操作命令,比如命令1比命令2先到达,那么命令1就会比命令2先执行

image.png

Redis应用案例

签到

image.png

String数据结构

image.png

消息通知

image.png

List数据结构

image.png

listpack实际就是将多个数据压缩到一个节点上

image.png

计数

image.png

用redis可以提高性能,承受更多的访问量

当需要增加点赞数时,可以用redis的hincrby指定某个字段进行增加

Hash数据结构dict

image.png

排行榜

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

image.png

可以使用zset实现

  • ZINCRBY myzset 2 Alex
  • ZSCORE myzset "Alex":倒排序

zset数据结构

image.png

zset实际上是跳跃表+hash的数据结构

image.png

因为有tail和backword因此可以方便实现按分值倒排

限流

image.png

这是限制每秒系统总体请求数,就是用当前时间的秒值做为key,在这1秒钟内,每来一个请求key的值就+1,当值超过阈值后,就阻断请求

分布式锁

image.png

sexnx无法保证高可用的分布式锁,

  1. 可能出现业务执行超时而自动解锁,导致并发问题。业务执行时间超过锁超时时间
  2. redis主备切换临界点问题。主备切换后,A持有的锁还未同步到新的主节点时,B可在新主节点获取锁,导致并发问题。
  3. redis集群脑裂,导致出现多个主节点

Redis使用注意事项

大Key

定义

image.png

大Key的危害

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

业务侧使用大Key的表现

  • 请求Redis超时报错

image.png

因为redis是单线程执行,因此如果一个key很大导致读写时间很长,就会阻塞后面命令的执行

消除大key方法

image.png

拆分时,先在第一个分key的值上写入被拆成了几个key-value

image.png

热key

定义

解决热key方法

  1. 设置localcache

image.png

  1. 拆分

image.png

  1. 使用redis代理的热key承载能力

    本质就是多了一层中间层,将原本客户端需要做的,让中间层做了

image.png

慢查询场景

image.png

缓存穿透,缓存雪崩

image.png

如何减少缓存穿透

  1. 缓存空值:如一个不存在的userlD。这个id在缓存和数据库中都不存在。则可以缓存一个空值,下次再查缓存直接反空值。
  2. 布隆过滤器:通过bloom filter算法来存储合法Key,得益于该算法超高的压缩率,只需占用极小的空间就能存储大量key值

如何避免缓存雪崩

  1. 缓存空值:将缓存失效时间分散开,比如在原有的失效时间基础上增加一个随机值,例如不同Key过期时间,可以设置为10分1秒过期,10分23秒过期,10分8秒过期。单位秒部分就是随机时间,这样过期时间就分散了。
  2. 对于热点数据,过期时间尽量设置得长一些,冷门的数据可以相对设置过期时间短一些。
  3. 使用缓存集群,避免单机宕机造成的缓存雪崩。