Redis(远程字典服务器)是技术栈中最多用途的数据存储之一——它对多种不同目的都真正有用。风险是将它用于一切,这会导致混乱和滥用。以下是它擅长的地方和不擅长的地方。
Redis是什么(以及不是什么)
Redis是一个内存数据结构存储:所有数据保存在RAM中(可选择性地持久化到磁盘)。这使其极快(亚毫秒级操作),但受可用内存限制。它支持大多数数据库没有的数据结构:字符串、哈希、列表(有序,O(1)推/弹)、集合(无序,O(1)成员测试)、有序集合(带分数,高效范围查询)和位图/HyperLogLog。它不是关系数据库的替代品——它缺乏连接、复杂查询和数据库级别的ACID事务(它在单操作级别有事务)。内存无法容纳的数据是个问题;需要复杂查询的数据是个问题。
Redis用于什么:标准用例
缓存:最常见的用例。存储昂贵的数据库查询、API调用或渲染内容的结果,带有TTL(生存时间)。`SET key value EX 300`存储一个值300秒。缓存失效策略(缓存中最难的问题):基于时间的过期(简单,可能提供过时数据)、基于事件的失效(当底层数据改变时删除缓存键——更复杂但保持最新),或旁路缓存(应用程序检查缓存,未命中时查询DB并写入缓存)。会话存储:用与会话超时匹配的TTL在Redis中存储用户会话数据——快速,跨应用程序实例共享,自动过期。速率限制:使用Redis的原子增量(INCR)和过期来计算每用户每时间窗口的请求。`INCR ratelimit:user:123`,然后检查计数是否超过限制——即使在并发负载下也原子地正确工作。发布/订阅:Redis的发布/订阅系统允许应用程序组件之间的实时消息传递——通知系统和实时功能的基本用例,尽管对于严肃的消息队列,专用队列(RabbitMQ、Kafka)更合适。排行榜:有序集合(ZADD、ZRANGE、ZRANK)使排行榜实现变得微不足道——添加分数、检索前N名、获取排名——全部O(log N)操作。
数据持久化:常见误解
Redis可以将数据持久化到磁盘(RDB快照或AOF仅追加文件),但它不是为关键数据的主要数据存储设计的。RDB快照:定期数据集快照——如果Redis崩溃,快照之间可能会有一些数据丢失。AOF:记录每个写操作——更持久,但更大且更慢。正确的模型:Redis是缓存或辅助存储;你的PostgreSQL(或其他关系/文档数据库)是事实来源。如果Redis数据丢失或损坏,你应该能够从主存储重建它。对于任何丢失数据不可接受的情况,使用Redis作为主数据库是对工具的滥用。



