Redis除了缓存还能玩啥?那些你没想到的奇怪用法和另类玩法分享
- 问答
- 2025-12-25 02:25:05
- 2
综合自网络技术社区博客、开发者论坛讨论及Redis官方文档的民间解读)
很多人一提到Redis,脑子里蹦出来的第一个词就是“缓存”,没错,把常用的、耗时的数据库查询结果丢进Redis,让下次请求直接从这里拿数据,又快又省力,这确实是它最广为人知的用法,但如果你觉得Redis只是个高级缓存,那可就太小看它了,它内置的那些数据结构,就像是乐高积木,能让你搭出各种意想不到的玩意儿,今天我们就来聊聊Redis那些奇奇怪怪、另辟蹊径的玩法。
做个简单的“消息队列”
这可能是除了缓存之外,最“正经”的另类用法了,虽然市面上有Kafka、RabbitMQ这些专业的消息队列大哥,但如果你只是想实现一个轻量级的、对可靠性要求没那么高的任务排队功能,Redis完全能胜任。
怎么玩呢?主要用它的列表(List)结构,你可以用 LPUSH 命令把一个个任务(给用户A发送邮件”、“处理图片B的缩略图”)从列表左边塞进去,然后另一边用 BRPOP 命令阻塞地等待并从右边取出任务来处理。BRPOP 的好处是,如果列表里没任务,它会一直等着,直到有任务进来或超时,这样你的处理程序就不用傻傻地不停轮询,浪费资源,一些框架如Celery的后端就支持Redis,就是利用了这个原理,它不像专业队列有消息持久化、复杂的路由确认机制,胜在简单快捷。
实现一个“实时排行榜”
这个功能在游戏和社交应用里太常见了,比如游戏里的玩家积分榜、视频的点击量排行,用数据库做排序和分页,数据量一大就容易慢,Redis的“有序集合”(Sorted Set)简直就是为排行榜量身定做的。
你可以把每个用户的ID作为成员(member),把他的积分、分数作为分值(score)存进去。ZADD 命令可以添加或更新分数,ZREVRANGE 命令可以直接取出排名前N的用户,速度快得飞起,更妙的是,你还能轻松查某个用户的排名(ZREVRANK),或者查他前后左右的玩家是谁,这种实时性,是传统数据库很难轻易做到的。
充当一个“频率限制器”
防止恶意刷接口、短信验证码被滥发,频率限制是刚需,Redis的过期时间和计数功能能优雅地解决这个问题。
你想限制某个IP地址一分钟内只能请求10次登录接口,你可以把这个IP地址作为key,把请求次数作为value,每次请求过来,就用 INCR 命令给这个key的值加1,如果是第一次请求(key不存在),在加1的同时,用 EXPIRE 命令给这个key设置一个60秒的过期时间,然后判断一下,INCR 后的值大于10了,就拒绝请求,一分钟过后,这个key自动消失,计数从头开始,这种方法非常高效,而且能精准地控制时间窗口。

玩出花的“地理位置”查询
你可能用过一些App,能查找你附近的餐厅、加油站,Redis的“地理空间”(GEO)功能就能干这个,它的底层也是基于有序集合实现的。
你可以把一个个地点(比如商店)的经纬度通过 GEOADD 命令存进去,神奇的就来了,你可以用 GEORADIUS 命令,指定一个中心点(比如你当前的经纬度)和一个半径(比如5公里),它瞬间就能把范围内的所有地点找出来,还能算出距离你多远,虽然比不上专业的GIS系统,但对于大多数“附近的人”、“附近的店”这种需求,已经是杀鸡用牛刀,简单高效。
模拟一个“社交关系”系统
关注/粉丝、共同好友这类功能,用Redis的“集合”(Set)来模拟非常合适。
把每个用户的关注列表和粉丝列表分别存成两个集合,用户A关注了用户B,就往A的关注集合里加B,同时往B的粉丝集合里加A,判断A是否关注了B,用 SISMEMBER 命令一秒搞定,更厉害的是,求A和B的共同关注,直接用 SINTER 命令对两个集合取交集,速度快到没朋友,这些操作在关系数据库里可能涉及复杂的联表查询,在Redis里就是一行命令的事。

做个独特的“布隆过滤器”
这个听起来有点高级,但其实概念很简单,它用来解决一个问题:快速判断某个东西“一定不存在”或者“可能存在”于一个巨大的集合里,新闻客户端要过滤掉你已经读过的新闻ID,防止重复推送,如果把所有读过的ID都存下来,量太大,布隆过滤器用一种巧妙的方法,用很小的空间就能实现。
虽然Redis原生不支持,但可以通过它提供的位图(Bitmap)和一些自定义算法来实现,或者用RedisModules扩展,当你读过一篇新闻,就用几个不同的哈希函数把新闻ID映射到位图的几个位上,把这些位都设为1,下次判断一篇新新闻是否读过,就看它映射的那几个位是否都是1,如果有一个是0,那这篇新闻肯定没读过;如果全是1,那它可能读过(有极小的误判率),这在需要快速去重的场景下非常有用。
实现“分布式锁”
当多个服务或者多个进程要同时操作一个共享资源时(比如秒杀商品库存),就需要一把锁来保证同一时间只有一个人能操作,Redis可以用来实现一个简单的分布式锁。
核心命令是 SET 命令的一个特殊用法:SET key value NX PX 30000,意思是,只有当key不存在时(NX)才设置它,并设置一个30秒的过期时间(PX),哪个客户端成功执行了这个命令,就相当于抢到了锁,操作完成后,再删除这个key来释放锁,过期时间是为了防止客户端崩溃导致锁永远无法释放,这比用数据库实现锁要轻量和快速得多,要实现一个健壮的分布式锁还有很多细节要注意,但Redis提供了很好的基础。
看到这里,你是不是对Redis刮目相看了?它就像一个多功能的瑞士军刀,远不止缓存那么简单,它的价值在于那些灵活的数据结构,让我们能用很简单的方式,解决很多看似复杂的问题,下次当你遇到需要高性能、实时性的小功能时,不妨先想想:“能不能用Redis来搞一下?”说不定就有惊喜。
本文由钊智敏于2025-12-25发表在笙亿网络策划,如有疑问,请联系我们。
本文链接:https://www.haoid.cn/wenda/67902.html
