深入理解Redis| 青训营笔记

61 阅读3分钟

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

本文是对于掘金课程的课程笔记,针对课程内容的一些重难点、本人在学习Redis知识时候进行的简单记录。

一、本堂课的重点内容

  1. Redis是什么
  2. Redis应用案例
  3. Redis使用注意事项

二、详细知识点介绍

Redis是什么

为什么需要?

  • 数据从单表,演进出了分库分表
  • Mysql从单机演化出了集群,导致数据量增长,读写数据压力不断增加

如何解决?

  • 数据分冷热(热数据:经常被访问到的数据)
  • 将热数据存储到内存中

Redis基本原理

  • 数据从内存中读写
  • 数据保存到硬盘上防止重启数据丢失(增量数据保存到AOF文件,全量数据RDB文件)
  • 单线程处理所有操作命令

Redis应用案例

连续签到

掘金每日连续签到

string 数据结构

  • 可以存储字符串、数字、二进制数据
  • 通常和expire配合使用
  • 场景:存储计数、session

消息通知

用list作为消息队列

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

计数

一个用户有多项计数需求,可以通过hash结构存储

hash数据结构dict

  • rehash:rehash操作是将ht[0]中的数据全部迁移到ht[1]中。数据量小的场景下,直接将数据从ht0拷贝到ht1速度是较快的。数据量大的场景,会有明显阻塞。
  • 渐进式rehash:为避免这种情况,采用rehash方案。基本原理是每次用户访问时都会迁移少量数据,将整个迁移过程平摊到所有的访问。

排行榜

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

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

zset数据结构zskiplist,查找数字7的路径,head,3,3,7(跳跃表),redis使用skiplist+hash

限流

要求1秒内放行的请求为n,超过n禁止访问

分布式锁

并发场景,要求一次只能有一个协程执行。执行完成后,其他等待中的协程才能执行,可以使用redis的setnx实现,两个特性:

  • redis是单线程执行命令
  • setnx只有未设置过才能执行成功

Redis使用注意事项

大key,热key

大key的危害:

  • 读取成本高
  • 容易导致慢查询
  • 主从复制异常,服务阻塞

业务侧使用大key的表现:请求redis超时报错

解决大key方法:

  • 拆分,将大key拆分为小key,例如一个string拆分为多个string
  • 压缩,将value压缩后写入redis,读取时解压后再使用。压缩算法可以用gzip、snappy、lz4等。需要考虑解压时间。
  • 集合类结构hash、list、set:拆分和冷热分离

解决热key的方法:

  • 设置localcache
  • 拆分
  • 使用redis代理的热key承载能力

慢查询场景

  • 批量操作一次性传入过多key value
  • zset大部分命令都是O(log(n))
  • 操作的单个value过大,超过10kb
  • 对大key的delete/expire操作也可能

缓存穿透、缓存雪崩

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

解决缓存穿透

  • 缓存空值
  • 布隆过滤器

解决缓存雪崩:

  • 缓存空值
  • 使用缓存集群,避免单机宕机导致缓存雪崩

三、课后个人总结

Redis一直是数据存储方面的一个重要内容,想要进行高并发的项目开发我们离不开redis,本节课程重点从数据结构的角度介绍了redis的各种应用场景,然后介绍了redis的各种注意事项,问题以及解决方法。