Redis是什么 | 青训营笔记

94 阅读3分钟

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

Redis是什么

什么是Redis

为什么需要Redis

数据从单表,演进出了分库分表

MySQL从残疾演进出了集群,这就导致了数据量增加,读写数据的压力不断增加

数据又分冷热:热数据就是经常被访问到的数据

Redis能将热数据存储到内存中,极大的优化了效率

基本工作原理

  • 让数据从内存中读写来
  • 同时也让数据保存到硬盘中防止重启数据丢失
    • 增量数据:AOF文件
    • 全量数据:RDB文件
  • 单线程的处理所有操作命令

应用案例

  • 连续签到
  • 消息通知
  • 技术
  • 排行榜
  • 限流
  • 分布式锁

连续签到

string数据结构

  • 可以存储字符串,数字,二进制数据
  • 通常和expire配合使用
  • 场景:存储技术,Session

消息通知

用list作为消息队列

  • 使用场景:消息通知
  • 文章更新时就将更新后的文章推送到ES,用户就能搜索到最新的文章数据

数据结构

  • QuickList------由一个双向链表和listpack实现

计数

可以通过hash结构存储

hash数据结构dict

  • rehash
    • 数据量大时,迁移过程会明显阻塞用户请求
  • 渐进式rehash
    • 每次用户访问是都会迁移少量数据,将整个迁移过程平摊到所有的访问用不请求过程中

排行榜

关键在于积分变化时,排名要实施变更

  • 结合dict后,可实现通过key操作跳表的功能

ZSET数据结构zskiplist

  • 结合dict

限流

- 要求一秒内放行的请求为N,超过N则禁止访问

分布式锁

并发场景,要求一次只能由一个协程执行

执行完成后,其他等待中的协程才能执行

  • 用setnx实现!利用了两个特性
    • redis是单线程执行命令
    • setnx只有未设置过才能执行成功

使用注意事项

大Key,热Key

  • 什么是大Key?
    • string标准下,是value的字节数大于10kb即为大Key
    • Hash/Set/Zest/list等复杂数据结构类型标准下,要求元素大于5000个或总字节数大于10MB即为大Key
    • 危害:
      • 读取成本高
      • 导致查询慢
    • 表现:
      • 请求Redis超时报错
    • 消除方法
      • 将大Key查分成小Key
      • 压缩:将value用压缩算法压缩后再写入redis
      • 区分冷热
  • 什么是热Key
    • 当用户访问一个Key的Qps特别高,导致Server实例出现CPU负载突增或者不均的情况,一般QPS超过500就可判定为热KEY
    • 解决方法:
      • 设置localCache
      • 拆分
      • 用Redis代理的热Key承载能力
  • 慢查询场景如下
    • 批量操作一次性传入过多的key/value
    • 单个value过大
    • 对大key的delete和expire操作

缓存穿透,缓存雪崩

  • 缓存穿透:热点数据查询绕过缓存,直接查询数据库
    • 危害:
    • 查询一个一定不存在的数据,db容易响应慢或者宕机
    • 解决:
    • 缓存空值,布隆过滤器
  • 缓存雪崩:大量缓存同时过期
    • 缓存过期时会有大量请求同时击穿db,容易影响db性能和稳定,出现db无法相应新的查询
    • 解决:魂村空值,使用缓存集群,避免单机宕机造成的缓存雪崩