Redis | 青训营

74 阅读2分钟

Redis

为什么需要Redis

因为

  • 数据从单表,演进出了分库分表
  • MySQL从单机演进出了集群
  • 随着业务的扩展,数据量、读写操作不断增加

Redis怎么解决的

  • 将数据分为冷数据、热数据,对于使用频率较高的数据存在内存中(热数据)
  • 将热数据存储到内存当中去
  • 1692371560020.png

那么Redis的工作原理

  • 数据从内存中读写
  • 数据保存到硬盘上防止重启数据丢失(持久化)
    • 增量数据保存到AOF文件
    • 1692371863156.png
    • 全量数据RDB文件
    • 1692371894421.png
  • 单线程处理所有操作 1692372105417.png
1692372023532.png

Redis应用案例

  1. 连续签到

    完成案例要使用 String数据结构

  • 在Redis中 String数据结构是一个数据安全的二进制数据,可以存储字符串、数字、二进制数据,通常配合expire使用(应用场景存储计数、Session)1692373484849.png

alloc表示buf有多少空间 len表示buf已经使用了多少空间

  1. 消息通知
    • 用list作为消息队列(文章更新,将更新的文章推送到ES,用户就能看到了)1692373609834.png

    • List数据结构

    • Quicklist(由一个双向链表和Listpack实现)1692373685361.png

    • Listpack1692373700625.png

  2. 计数 一个用户有多项计数需求,可通过hash结构储存(文章点赞、阅读、评论数、关注数)
  • Hash数据结构
    • 1692373859191.png
      Rehash:
      
      rehash操作是将ht[0]中的数据全部迁移到ht[1]中。
      数据量小的场景下直接将数据从ht[0]拷贝到ht[1]速度是较快的。
      数据量大的场景,例如存有上百万的KV时,迁移过程将会明显阻塞用户请求。
      
      渐进式Rehash:
      
      为避免出现这种情况,使用了rehash方案。
      基本原理就是,每次用户访问时都会迁移少量数据。将整个迁移过程,
      平摊到所有的访问用户请求过程中。
      
  1. 排行榜 积分变化时,排名需要实时变化 (结合dict后可实现通过ket操作跳表功能)

    Zset数据结构 zskiplist(跳跃表加哈希) 对于某些实时性比较高、数据量比较大的排行榜,如果采用MySQL的OrderBy命令对用户热度进行排序,再更新排行榜,那么服务器将不堪重负。对于这种场景,可以使用Redis中的ZSet数据结构

    1692374364172.png
1692374381660.png
  1. 限流 要求1秒内放行的请求为N,超过N则禁止访问 (Key: comment freq_limit_1671356046对这个Key调用incr,超过限制N则禁止访问1671356046 是当前时间戳)
1692374406465.png
  1. 分布式锁

并发场景,要求一次只能有一个协程执行执行完成后,其它等待中的协程才能执行

  • 可以使用redis的setnx实现,利用了两个特性Redis是单线程执行命令
  • setnx只有未设置过才能执行成功
1692374605123.png