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

Redis带来的那些意想不到的改变,真没想到redis还能这么用

Redis带来的那些意想不到的改变,真没想到redis还能这么用

很多人最开始接触Redis,就觉得它是个“快”的内存缓存,用来存点会话、热点数据,但玩着玩着,发现这家伙简直是个“瑞士军刀”,能干的事儿多得离谱,完全颠覆了最初的想象。

Redis带来的那些意想不到的改变,真没想到redis还能这么用

当成实时排行榜,游戏里用得风生水起 最早让我惊掉下巴的,是发现它居然能直接做排行榜,以前觉得这玩意儿得专门设计数据库结构,频繁计算,结果Redis一个有序集合(Sorted Set)全搞定,玩家的分数就是分值,自动排好序,查全球排名、查你前后几名的人,都是毫秒级响应,像微信步数排行榜、直播间的送礼榜单、游戏里的战力榜,底层很多直接用Redis搞定的,知乎上有个高赞回答就提到,当年看《王者荣耀》的技术分享,他们实时排行榜的核心就是Redis,这才恍然大悟,原来身边天天看的东西是这么来的。

消息队列?好像也能凑合顶一下 Redis的列表(List)结构,有个BLPOP/BRPOP命令,能阻塞着等消息,这特性就被很多人盯上了,拿它当个轻量级的消息队列用,虽然没专业消息队列(比如RabbitMQ、Kafka)那么功能强大可靠,但架不住它简单、快啊!在业务量不是天量、允许偶尔丢点消息的场景里,比如发个系统通知、同步个不那么关键的状态,直接用Redis就上了,省得再部署维护一套复杂系统,Github上很多小项目、初创公司的早期阶段,都能看到这种用法,堪称“穷人的消息队列”。

Redis带来的那些意想不到的改变,真没想到redis还能这么用

地理位置“附近的人”,居然也归它管? 这个更绝,Redis 3.2版本之后,居然直接内置了GEO功能,你把带经纬度的地理位置信息存进去,它就能直接查“我附近5公里内所有的人”、“离我最近的10个加油站”,原理底层还是用有序集合巧妙实现的,想想以前要实现“附近的人”,得在数据库里算球面距离,麻烦得要死,现在几条Redis命令就出结果,很多社交软件、外卖软件找附近商家、共享单车找附近的车,早期或快速原型阶段,都用这个功能顶上去的,速度快得飞起,记得有个技术博客讲“陌陌”早期技术选型,就重点提过Redis的GEO功能帮了大忙。

限流和秒杀的“守门员” 对付像秒杀这种瞬间超高并发的场景,Redis成了关键“闸口”,利用它单线程执行命令原子性的特点,可以轻松实现精确的限流,比如用INCR命令,一个用户一秒内只能请求一次,超过就拒绝;或者用令牌桶算法控制总流量,在秒杀时,先把商品库存预存在Redis里,用户抢购时直接执行DECR扣减,减到0就卖完,防止超卖,因为所有请求都在内存里操作,速度极快,能顶住最初的海量冲击,把大部分无效请求直接挡在外面,保护后面脆弱的数据库,很多电商大厂的秒杀方案分享里,Redis都是绝对的主角。

Redis带来的那些意想不到的改变,真没想到redis还能这么用

实时统计和计数,简单到不像话 各种需要实时累加、快速查询的数据,用Redis做起来太顺手了,比如文章阅读量(每刷新一次就INCR一下)、网站当天的独立访客数(用HyperLogLog结构,占用空间极小)、用户动态的点赞数、转发数,这些数据如果频繁去改数据库,数据库根本受不了,用Redis先扛着,再定时同步到数据库,是通用做法,它的丰富数据结构,比如哈希(Hash)存对象、集合(Set)存标签/好友关系,用起来非常灵活。

会话共享和分布式锁的“老本行”升级 这俩算是经典用法,但深入下去也有意想不到的玩法,分布式会话让用户在集群里随便访问哪台服务器,登录状态都在,这已经是Web应用的标配,而分布式锁,用Redis的SETNX命令实现,是保证分布式系统数据一致性的重要工具,但后来人们发现实现一个靠谱的分布式锁并不简单,于是社区出现了Redlock这样的算法讨论,引发了大规模的技术辩论(比如Redis作者和分布式系统专家Martin Kleppmann的著名论战),这反过来又推动了大家对分布式系统共识问题的理解,没想到一个锁能引出这么深的学问。

甚至还能做轻量级数据库和时间序列存储 对于一些对持久化要求不那么高、但需要极高性能的临时数据存储,有人直接把Redis当主数据库用,利用它的RDB或AOF持久化机制,更让人想不到的是,在物联网(IoT)领域,Redis因为其高性能和丰富数据结构,常被用来做时间序列数据的存储和初步分析,比如存储设备上传的实时温度、压力数据点,然后快速查询最近一小时的曲线,虽然有更专业的时序数据库,但Redis在简单场景下又是一把“快刀”。

说到底,Redis这些“意想不到”的用法,都源于它设计上的几个精髓:纯内存操作带来的极致速度、丰富灵活的数据结构、以及原子操作保证的线程安全,它就像编程世界里的“乐高积木”,开发者们根据自己奇思妙想,把这些简单的原语组合起来,竟然能搭建出如此多样和强大的应用场景,远远超出了最初“缓存”的定位,这也许就是优秀开源工具的魔力:它给你的是工具,但创造的价值,取决于使用者的想象力。