当前位置:首页 > 问答 > 正文

Redis精华内容讲解,深入又不复杂,边学边懂的那种感觉

Redis到底是个啥?为啥它这么快?

你可以把Redis想象成一个超级厉害的“超级玛丽”里的那种小箱子,你往里面放个蘑菇,立马就能变大,Redis就是一个放在内存里的“小箱子”(来源:Redis官方文档称其为内存数据结构存储),它的所有数据都放在电脑的内存里,而不是像MySQL那样存在硬盘上,你想啊,从内存里拿东西,比从硬盘上读取要快多少倍?这就是Redis速度惊人的首要秘诀——内存存储

但光放在内存里有个大问题:万一断电了,内存里的东西不就全没了吗?Redis想到了这点,它有两种主要的“记小本本”的方式(来源:Redis持久化机制):一种叫RDB,就像是给你当前的数据状态拍张快照,存到硬盘上;另一种叫AOF,像是写日记,把你对数据的所有操作命令都记下来,这样即使断电重启,也能根据“快照”或者“回放日记”把数据恢复回来,别担心它会“失忆”。

另一个让它飞起的原因是,它是单线程的(来源:Redis核心是单线程事件循环),咦?单线程不是会慢吗?这里有个常见的误解,Redis的单线程指的是处理命令的核心模块只有一个线程,这意味着它不用像多线程程序那样,费劲地去处理复杂的锁的问题,避免了线程切换带来的开销,它就像一个极其专注的办事员,虽然一次只处理一个请求,但处理速度极快,绝不会手忙脚乱,当成千上万的请求过来时,它们会在门口排好队,这个超级办事员一个个飞快地处理掉,在网络IO处理上,它用了很高效的技术(如epoll),所以即使单线程也能同时管理很多连接。

Redis精华内容讲解,深入又不复杂,边学边懂的那种感觉

第二部分:Redis的百宝箱里都有什么宝贝?

Redis的强大,绝不仅仅是因为快,更因为它提供了丰富的数据结构,而不仅仅是简单的字符串,这才是它的精髓所在(来源:Redis数据类型)。

  1. String(字符串):这是最简单的类型,就是key-value对,你可以存一个数字,一个字符串,比如用来做缓存是最常见的:把数据库里查出来的用户信息存成JSON字符串,下次请求直接从这里拿,数据库就轻松多了,它还能对数字进行自增,用来做文章阅读量、点赞数非常方便。

    Redis精华内容讲解,深入又不复杂,边学边懂的那种感觉

  2. Hash(哈希):这个就像Java里的Map或者Python里的字典,一个key下面可以存好多对字段和值,比如要存用户信息,与其把一个用户的所有信息(姓名、年龄、城市)拼成一个大的JSON字符串用String存,不如用Hash,key是用户ID,字段是name、age、city,这样你想单独修改用户年龄时,直接改age字段就行了,不用动整个字符串,非常灵活高效。

  3. List(列表):就是一个双向链表,你可以从左边或者右边插入、弹出元素,这能干嘛呢?最典型的就是做消息队列(虽然现在有更专业的MQ,但Redis简单场景下很好用),用户下单后,把订单信息从左边推进一个List,后台的库存处理程序从右边把这个订单信息取走处理,实现了简单的异步和解耦,还可以做朋友圈的时间线,新发的消息从左边推进List,展示的时候直接按顺序取。

  4. Set(集合):集合的特点就是元素不重复,而且支持求交集、并集、差集,这功能可太有用了!你可以把一个人的所有好友ID存成一个Set,把另一个人的好友ID也存成一个Set,然后一条命令就能求出他俩的共同好友(交集),微博的“共同关注”就是这个原理。

    Redis精华内容讲解,深入又不复杂,边学边懂的那种感觉

  5. Sorted Set(有序集合):这是Set的升级版,每个元素都关联一个分数(score),Redis会根据分数自动给元素排序,这简直就是为排行榜而生的!比如做一个游戏积分榜,玩家ID是元素,积分是分数,你可以轻松地取出前十名,或者查看某个玩家的排名,实现一个实时排行榜可能只需要一两行命令。

第三部分:Redis在实际中怎么用?举个简单的例子

假设我们做一个文章网站。

  • 缓存文章内容:我们用String类型,key是 article:文章ID,value是文章的JSON内容,大大减轻数据库压力。
  • 记录文章点赞数:用String的自增功能,key是 article_like:文章ID,每点一次赞,这个数字就加1。
  • 文章评论列表:用List,key是 article_comment:文章ID,每次有新评论,就从左边推进List,显示评论时按顺序取。
  • 文章标签:一篇文章有多个标签,用Set来存最合适,key是 article_tag:文章ID,值就是标签名的集合,可以方便地求有相同标签的文章(交集)。
  • 本周热文排行榜:用Sorted Set,key是 week_rank,元素是文章ID,分数是本周的阅读量或综合热度,轻松获取TOP10。

你看,一个简单的应用,Redis的几种数据结构就几乎全用上了,它就像一个多功能的瑞士军刀,不同的场景掏出不同的工具,简单又高效。

希望这个聊天能让你对Redis有一个直观又不失深度的理解,它不仅仅是快,更是一个灵活的数据结构工具箱,用好它,能解决很多高性能场景下的难题。