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

Redis 组件其实挺多,能帮你解决不少缓存和数据存储的麻烦,简单聊聊它都有哪些功能吧

Redis这东西,说白了,它就是一个速度飞快的“多功能记事本”,只不过这个记事本是放在你的服务器内存里的,因为数据主要放在内存里,所以它读写的速度比那些传统的硬盘数据库(比如MySQL)要快太多了,简直是天壤之别,你别看它简单,它能帮你解决的麻烦可真不少,远不止是做个简单的缓存那么简单,咱们就一样一样来聊。

最核心的功能:缓存。 这是Redis的看家本领,也是大多数人最开始用它的原因,想象一下,你的网站有个页面,每次打开都需要从数据库里吭哧吭哧查很多数据,比如热门文章列表、用户排行榜什么的,如果每次有用户访问都去查数据库,数据库压力大,页面打开也慢,这时候就可以用Redis了,你可以把这些查询结果暂时“记”在Redis里,设置一个过期时间,比如5分钟,那么在接下来的5分钟内,所有用户来访问这个页面,你都直接从Redis里拿现成的数据,速度飞快,等5分钟到了,数据可能旧了,Redis会自动删掉它,下次再有请求时,程序再去数据库查新的,然后重新塞回Redis,这样既保证了速度,又保证了数据不会太旧,这就像是给数据库前面加了一个超高速的“前台”,把最常用的东西放在手边,随用随取。

Redis 组件其实挺多,能帮你解决不少缓存和数据存储的麻烦,简单聊聊它都有哪些功能吧

它是个灵活的“数据结构”仓库。 这才是Redis真正强大的地方,让它超越了普通缓存,普通的缓存可能只能存简单的“键值对”,就像一个只能写“姓名=张三”的本子,但Redis的本子高级多了,它支持好几种结构:

Redis 组件其实挺多,能帮你解决不少缓存和数据存储的麻烦,简单聊聊它都有哪些功能吧

  1. 字符串: 这是最基础的,就是存一个键对应一个值,可以是个数字,也可以是一段文本,比如存个用户的验证码、某个商品的库存数量。
  2. 列表: 就像一个排队队伍,数据一个接一个按顺序放进去,你可以从左边塞进去,也可以从右边塞进去,这个特性特别适合做“消息队列”,用户下了单,你不是立刻处理,而是把订单信息作为一个“消息”塞到Redis的列表里,然后后台有专门的程序从这个列表里按顺序一个一个取出来处理,这样就实现了程序的“削峰填谷”,高峰期订单涌进来也不怕,排队等着处理就行,还可以做最新消息列表,比如最新10条微博,用列表就能轻松实现。
  3. 集合: 集合的特点是不能有重复的成员,而且里面的成员是无序的,这有什么用呢?举个典型的例子:给文章点赞,一篇文章,一个用户只能点赞一次,用集合来存储这篇文章的所有点赞用户ID就非常合适,因为集合自动保证不重复,你想检查某个用户是否点过赞,直接查这个集合里有没有他的ID就行了,速度极快,还可以对集合做交集、并集运算,找出我和我好朋友共同关注的人”,就可以用我们俩的关注集合取交集。
  4. 有序集合: 这是集合的升级版,它给每个成员都关联了一个分数,然后根据这个分数来排序,这简直就是为“排行榜”量身定做的功能!比如游戏玩家的积分排行榜,玩家ID是成员,积分就是分数,你可以非常快速地取出排名前十的玩家,或者查询某个玩家的具体排名。
  5. 哈希: 这个结构可以理解成一个小型的数据表,一个键下面可以存多个字段和对应的值,比如存储用户信息,用户ID是主键,然后这个键下面可以存字段:name=“张三”,age=28,city=“北京”,这样要获取或修改用户的某个信息就很方便,不用像字符串那样把整个用户信息打包存取。

它还能干一些“持久化”的活儿。 你可能担心了,数据都放内存里,万一服务器重启或者断电了,数据不就全没了吗?Redis也考虑了这个问题,它提供了两种“持久化”机制,可以把内存里的数据定期写到硬盘上备份,一种是快照方式,隔一段时间把整个数据拍个照存下来;另一种是记录日志方式,把所有的写操作命令都记下来,这样即使Redis重启,也能从硬盘上恢复数据,虽然可能会丢失最近几秒的数据(取决于配置),但对于很多场景来说已经足够了,这让Redis在某些要求不高的场合,甚至可以当作一个主数据库来用。

还有一些杂七杂八但很实用的功能:

  • 过期自动删除: 这是缓存功能的基础,你可以给任何数据设置一个存活时间,比如短信验证码设置5分钟过期,Redis到时候会自动把它删掉,省得你自己写代码去清理。
  • 发布/订阅: 这像一个简单的消息广播系统,有个新闻网站,一旦有突发新闻发布,就通过Redis发布一条消息,所有订阅了这个频道的用户客户端(比如打开着网页的用户)就能立刻收到这个消息,页面上的新闻列表可以实时更新,这为实现简单的实时通信提供了可能。

所以你看,Redis这个组件,表面上是个缓存,但因为它丰富的数据结构和这些贴心的小功能,它的用武之地非常广,从加速网站访问,到实现消息队列、排行榜、好友关系、会话共享,再到简单的实时通知,它都能插上一手,确实能帮开发者解决很多数据存储和处理的麻烦,是一个非常得力的帮手。