Redis笔记 | 青训营

76 阅读6分钟

Redis是什么

  • 关系型和非关系型数据库的差异

关系型和非关系型数据库的主要差异是数据存储的方式。关系型数据天然就是表格式的,因此存储在数据表的行和列中。数据表可以彼此关联协作存储,也很容易提取数据。 与其相反,非关系型数据不适合存储在数据表的行和列中,而是大块组合在一起。非关系型数据通常存储在数据集中,就像文档、键值对或者图结构。你的数据及其特性是选择数据存储和提取方式的首要影响因素。

  • 关系型数据库的发展

在Web应用发展的初期,关系型数据库得到了广泛应用,因为那时的Web站点访问量和并发性较低,交互也较少。然而,随着访问量的增加,使用关系型数据库的Web站点开始在性能上遇到瓶颈,主要原因是磁盘I/O的限制。随着互联网技术的进一步发展,出现了各种类型的应用,而在当前云计算和大数据盛行的时代,对性能有了更高的需求,主要体现在以下四个方面:

  1. 低延迟的读写速度
  2. 支持海量数据和流量
  3. 大规模集群的管理
  4. 庞大的运营成本考量

为了解决这些方面的问题,我们需要考虑数据的冷热,即哪些数据是需要较多的交互的,需要较高的读写速度。而将这些热数据存储在内存中能够拥有更快的访问速度:内存的读写速度远高于磁盘。将热数据存储在内存中可以大大减少数据访问的延迟。

同样能够提升系统吞吐量,内存具有较高的并发访问能力。将热数据存储在内存中可以支持更高的并发读写操作,提高系统的吞吐量。内存的并发读写速度较快,可以同时处理多个请求,有效地减少并发访问时的竞争和瓶颈。

相对的,数据存储在内存中将热数据存储在内存中可以减少对磁盘I/O的需求。磁盘I/O是相对较慢的操作,而内存的访问速度更快。通过将热数据存储在内存中,可以减少频繁的磁盘读写操作,降低系统的磁盘I/O负载,从而提高整体的系统性能。

需要注意的是,内存是有限的资源,成本较高。因此,通常会根据数据的访问模式和需求将热数据和冷数据进行合理的存储和管理,以实现性能和资源的平衡。冷数据可以存储在磁盘等持久化存储介质中,以节省内存空间和成本。

image.png

image.png

Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)。

Redis应用案例

  1. 连续签到
    当你连续签到,连续签到数据会+1,如果断签,连续签到数将归零。每天必须在23:59:59前签到
  • 业务逻辑
    key:用户id
    value:连续签到数
    expireAt:后天0点
    如果用户点击签到,那么Redis会根据key使用Incr来使value+1,然后设置expireAt为后天0点。如果用户没有点击签到,那么Redis的数据将在后天0点过期。那么连续签到数就会归零。

  • string数据结构
    Redis的string是二进制安全的。可以存储字符串、数字、二进制。

image.png

  1. 消息通知 当文章更新时,将更新的文章推送到ES,用户就能搜索到最新的文章数据
  • 业务逻辑
    把文章lpush到消息队列,当文章通过审核后,循环下,使用rpop逐条消费队列中的信息,数据从队列中移除。 image.png
  • list数据结构 通过双向列表和listpack实现 image.png

image.png

  1. 计数 每个用户都有多项计数需求,可以通过hash数据结构存储,文章被点赞数,文章被访问数,数据量太大数据库没法抗衡。
  • 业务逻辑 我们通过redis从内存中返回将大大加快速度,缓解数据库压力,并且页面的计数需求可能多样化,我们可以使用hash数据类型将多个计数打包在一个结构中同时返回。

  • hash数据结构
    Redis hash 是一个键值(key=>value)对集合。
    Redis hash 是一个 string 类型的 field 和 value 的映射表,hash 特别适合用于存储对象。

image.png

  • pipeline
    将多条记录打包,减少网络上的传输,一次性传输
  1. 排行榜
    积分变化时,排行榜要实时变更,当有大量用户访问,将数据进行倒排序,性能会有所下降的,同时对数据进行order_by操作对数据压力太大。
  • 业务逻辑 使用zset有序集合来返回数据,内含双向链表,轻易倒排。
    Redis Zadd 命令用于将一个或多个成员元素及其分数值加入到有序集当中。
    Redis Zscore 命令返回有序集中,成员的分数值。
    Redis Zincrby 命令对有序集合中指定成员的分数加上增量 increment

  • zset数据结构 image.png zset使用了跳跃表+hash

    image.png
  1. 限流 要求1s内放行的次数为N,超过N就禁止访问
  • 业务逻辑
    key:时间戳
    每秒对key进行incr,如果超过N,就禁止访问
  1. 分布式锁 并发场景,要求每次只能有一个协程执行,执行完成后,其他等待中的协程才能执行,比如秒杀。
  • 业务逻辑
    Redis是单线程的,setnx只有未设置过才能执行成功

image.png

分布式锁可能遇到的问题:
锁超时
锁主库写进去,从库没写进去
redis集群脑裂,出现多个主节点

Redis使用注意事项

  1. 大Key的危害
  • 读取成本高
  • 容易导致慢查询
  • 主从复制异常,服务阻塞无法正常响应

消除大Key的办法

  • 拆分
  • 压缩
  • 集合类结构,使用hash、list、set
    • 拆分
    • 冷热分离
  1. 热Key的危害

用户访问一个key的QPS特别高,导致Server实例出现CPU负载突增或者不均

image.png

解决热Key的方法 设置Localcache 拆分 使用Redis代理的热Key承载能力

image.png

image.png

  1. 缓存穿透、缓存雪崩
  • 缓存穿透:热点数据查询绕过缓存,直接查询数据库
  • 缓存雪崩:大量缓存同时过期