式解析Redis设计模式,教你打造潮流功能和实用技巧
- 问答
- 2026-01-14 16:02:12
- 2
Redis这个东西,说白了就是一个速度超快的“大字典”,你往里存东西和取东西都快得飞起,但光知道快还不够,你得会用,用对了才能解决实际问题,下面就直接说几种常见的用法和技巧,不绕弯子。
最常见的“万金油”模式:缓存(Cache)
这是Redis最基本也是最核心的用途,几乎所有人一开始都是用这个,它的思想很简单:你的网站或者应用,有些数据是从数据库(比如MySQL)里查的,但数据库读写磁盘,速度有瓶颈,如果每次请求都去查数据库,数据库压力大,用户等得也久。
怎么做? 来了一个请求,比如要查用户信息,先别急着去数据库,先去Redis里看看,有没有以user:123(假设用户ID是123)为键存的数据,如果有,直接从Redis里拿,飞快返回,如果没有,再去数据库查,查完之后,不光返回给用户,还在Redis里也存一份,并设置一个过期时间(比如30分钟),下次再有人查这个用户,命中的就是Redis缓存了。

关键技巧:
- 一定要设过期时间(TTL):这是为了防止数据在Redis里“躺”太久,和数据库的真实数据不一致,这叫“时效性”。
- 考虑缓存穿透:如果有人恶意请求一个根本不存在的数据(比如用户ID是-1),这个数据在缓存和数据库里都没有,每次请求都会打到数据库上,可能把数据库打垮,解决办法是,即使从数据库没查到,也在Redis里存一个空值(比如
user:-1: ""),并设置一个很短的过期时间(比如1分钟),这样短时间内同样的恶意请求就会命中这个空缓存。 - 考虑缓存雪崩:如果大量缓存数据在同一时间点过期,那么所有请求都会同时涌向数据库,同样可能导致数据库崩溃,解决办法是给缓存过期时间加一个随机值,比如基础30分钟,再随机加上0-5分钟,让过期时间分散开。
用来“计数”和“限流”的模式
Redis的单线程特性和原子操作(一个操作一步完成,不会被打断)非常适合做计数。

- 计数:比如文章阅读量、视频播放数,每次有人阅读,就用
INCR命令对键article:456:views进行加1操作,这个操作是原子的,所以不会出现两个人同时加1,结果只加了1个的并发问题,速度也比频繁更新数据库快得多。 - 限流:这是现在很潮流的用法,特别是防止API被刷,比如限制一个IP地址一分钟内只能请求60次。
- 怎么做? 用键
rate_limit:192.168.1.1(IP地址作为键的一部分)来计数,每次请求来了,先INCR这个键。 - 如果是第一次请求(计数结果为1),同时设置这个键的过期时间为60秒。
- 如果计数结果超过了60,就直接拒绝请求。
- 等60秒后,这个键自动过期,计数从头开始,这叫“滑动窗口限流”的简单实现。
- 怎么做? 用键
实现“排行榜”和“热门列表”
社交软件、游戏里随处可见排行榜,用Redis的有序集合(Sorted Set) 实现起来非常方便。
- 核心思想:有序集合里每个成员(比如用户ID)都有一个分数(比如用户的积分),Redis会自动根据分数排序。
- 怎么做? 用户得了分,就用
ZADD leaderboard 1000 user123命令更新分数,要取前十名,直接用ZREVRANGE leaderboard 0 9 WITHSCORES命令(按分数从高到低取),所有排序操作都是Redis在内存里完成,性能极高,即使数据量很大也很快。 - 潮流技巧:不仅可以做总榜,还可以做日榜、周榜,方法是给键名加上时间后缀,比如
leaderboard:20240521是日榜,leaderboard:202420(第20周)是周榜,定时任务在每天或每周结束时,计算新的排行榜。
用来“去重”的模式:布隆过滤器(Bloom Filter)

这是一个稍微高级但非常实用的技巧,用来解决前面提到的“缓存穿透”问题的大规模版本,比如新闻推荐系统,要判断某条新闻是否已经推荐给过用户,避免重复推荐,如果用户量巨大,新闻量也巨大,把所有关系都存下来不现实。
- 布隆过滤器是什么? 它是一个概率型数据结构,特点是:如果它说某个元素不存在,那肯定不存在;如果它说存在,那有可能存在(有极小的误判率)。
- 怎么用Redis实现? Redis有布隆过滤器的模块(需要单独安装),在用户看新闻时,先将新闻ID添加到用户的布隆过滤器中,下次推荐时,先用布隆过滤器检查候选新闻,如果过滤器说“没看过”,那这条新闻就一定没看过,可以安全推荐;如果过滤器说“可能看过”,你可以选择跳过,或者再去数据库做一次精确查询(因为这种情况是少数)。
- 好处:用极小的空间存储了海量的“是否存在”的信息,极大地减少了不必要的数据库查询。
用作“消息队列”
虽然Redis不是专业的消息队列(如Kafka、RabbitMQ),但在一些要求不高、数据量不大的场景下,可以简单顶替。
- 简单实现:使用
LPUSH命令向一个列表(List)的左边插入消息,另一个服务用BRPOP命令从列表右边阻塞地取出消息进行处理,这就实现了一个简单的先进先出(FIFO)队列。 - 潮流功能:Stream(流):Redis 5.0版本引入了更强大的Stream数据类型,它才是Redis官方推荐的用于消息队列的方案,它支持:
- 消息持久化:消息不会因为被读取而消失。
- 消费者组(Consumer Group):可以让多个消费者共同消费一个流,消息能分摊到组内不同的消费者处理,提高了处理能力,这比简单的List模式要强大和可靠得多。
最后提醒几个实用技巧:
- 键名设计:用冒号分隔,形成一种层次结构,比如
user:123:profile,order:456:items,这样清晰易懂,也方便用keys或scan命令模式查找。 - 别用
KEYS命令:在生产环境,数据量大的时候,KEYS *这个命令会阻塞Redis其他操作,非常危险,应该使用SCAN命令来渐进式地遍历键,不会阻塞服务。 - 持久化:Redis数据在内存里,重启会丢,所以要根据业务重要性配置持久化方案(RDB快照或AOF日志),做好数据备份。
Redis的玩法很多,核心是理解它丰富的数据结构和原子操作,然后结合你自己的业务场景,灵活组合这些模式,就能打造出既高效又潮流的功能。
本文由雪和泽于2026-01-14发表在笙亿网络策划,如有疑问,请联系我们。
本文链接:https://haoid.cn/wenda/80639.html
