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

Redis到底怎么改变了数据存储,平时又都用它干啥呢?

说到Redis怎么改变了数据存储,咱们得先看看以前是怎么存东西的,在Redis出现之前,大部分网站和应用的核心数据都老老实实地待在像MySQL这样的关系型数据库里,这种数据库就像一个大仓库,数据像货物一样规规矩矩地摆在货架上,你要拿取或者修改,得用一套固定的“手续”——也就是SQL语句,这套方式非常可靠,能保证数据准确无误,尤其适合处理像银行转账这种一步都不能错的事务。(来源:关系型数据库的ACID特性是其核心优势)

但问题也来了,当网站火了,访问的人越来越多,这个“大仓库”就开始吃不消了,每次用户看一个网页,可能都需要去仓库里翻箱倒柜好几次,比如查用户信息、查最新文章、查好友列表……硬盘读写的速度是有极限的,人一多,仓库门口就排起了长队,网页打开就变得特别慢,这时候,大家想了个办法:搞一个“临时小卖部”,把一些最常用、最热门的商品(数据)从大仓库里提前拿出来,放在这个小卖部里,用户刚查过的个人资料,下次再查就不用跑回大仓库了,直接在小卖部拿,速度飞快,这个小卖部,缓存”,而Redis最初就是干这个出名的。(来源:早期Redis被广泛用作缓存层以缓解数据库压力)

但Redis这个小卖部,可不是普通的小卖部,它是个“魔法小卖部”,它不像传统缓存工具那样只能简单地存个键值对(key-value),比如名字对应一个电话号码,Redis提供了好多神奇的数据结构,这让它的本事一下子变大了,这才是它真正改变游戏规则的地方。

Redis到底怎么改变了数据存储,平时又都用它干啥呢?

第一,它存东西是在内存里的。 内存的读写速度比硬盘快了几个数量级,所以Redis处理数据的速度极快,响应时间常常是微秒级别的,这就解决了“排队”的问题。

第二,它提供的花样特别多。 除了最简单的键值对,它还能存:

  • 列表(List): 像一条队伍,可以两头进两头出,这太有用了,比如用来做微信朋友圈的“时间线”,新发的消息从一头塞进去,老的消息可能就从另一头挤出去了。
  • 集合(Set): 能自动去重的一堆值,可以用来存一个文章的“所有标签”,保证标签不重复;或者存“共同好友”,轻松算出你和另一个人有哪些共同的朋友。
  • 有序集合(Sorted Set): 带分数的集合,能按分数排序,这是Redis的王牌功能之一。排行榜就是最典型的应用,比如游戏里的玩家积分榜、微博的热搜榜,每个成员(比如玩家ID)都有一个分数(比如积分),能非常高效地做出实时排名。
  • 哈希(Hash): 能存一个对象的多個属性,比如一个用户的信息(姓名、年龄、城市),可以作为一个整体存起来,取的时候也很方便。

正因为有了这些“花样”,Redis就从一个小小的“缓存小卖部”,升级成了一个功能强大的“多功能前台”,平时大家到底用它干啥呢?

Redis到底怎么改变了数据存储,平时又都用它干啥呢?

核心任务:还是当缓存(Cache) 这依然是Redis最广泛、最核心的用途,把数据库里查询慢、但又经常被访问的数据放在Redis里,比如商品详情、用户会话信息、网站首页的热门内容等,用户请求来了,先问Redis,Redis没有(这叫缓存未命中)再去查数据库,同时把结果塞给Redis备用,这样数据库的压力就小多了,网站速度嗖嗖的。

实时排行榜(Leaderboard) 就像前面说的,用有序集合能轻松搞定,每次玩家得分更新,直接设置他的新分数,排行榜瞬间就更新了,完全没有延迟,这在游戏、社交、竞赛类应用中必不可少。

计数器和限流器(Counter and Rate Limiter) 因为Redis操作是原子性的(简单理解就是操作不会被打断),所以特别适合做计数,比如文章阅读量“点赞+1”,可以非常可靠地完成,利用这个特性可以做API限流,比如限制一个IP地址一分钟内只能请求60次,超过就拒绝,防止恶意攻击或滥用。

Redis到底怎么改变了数据存储,平时又都用它干啥呢?

消息队列(Message Queue) 利用Redis的列表功能,可以实现简单的消息队列,比如在一个电商系统里,用户下单后,把订单信息作为一个消息“推”进队列,后端的库存管理、发货系统再按顺序从队列里“拉”取消息处理,这样就把前端下单和后端处理解耦了,即使处理系统暂时挂了,订单消息也会在队列里等着,不会丢失。

实时系统(Real-time System) 比如网络聊天室、直播间的弹幕,一条新消息或一条新弹幕发出后,需要立刻广播给在线的所有用户,Redis的发布/订阅(Pub/Sub) 功能就能干这个,发布者发消息,所有订阅者都能马上收到,延迟极低。

存储会话(Session Storage) 在网站集群部署时,用户的登录状态(Session)如果存在每台机器上,就会很麻烦(用户这次访问机器A,下次访问机器B就显示未登录),把Session统一存到Redis里,所有机器都来这儿查,就实现了“分布式会话”,用户无论访问哪台服务器,登录状态都在。

总结一下,Redis并没有取代MySQL这类“大仓库”式的关系型数据库,它们的关系更像是黄金搭档,Redis凭借其内存速度和丰富的数据结构,扛住了那些需要极速响应、高并发、实时性要求的场景,成为了现代应用架构中不可或缺的“高速数据层”,它把很多以前在数据库里做起来很慢、很重的事情,变得轻快而简单,这才是它最大的改变。(来源:业界普遍将Redis视为关系型数据库的补充,共同构成分层存储架构)