Redis支持的基本数据类型:String、hash、list、Set、Zset
一、String
特点
- 可以存储三种类型 int、float、string
运用场景
- 缓存:存储HTML片段、用户会话(Session)
- 计数器:网站访问量、点赞数(incr方法)。允许一定的延迟,先写入Redis再定时同步到数据库
- 限流:以访问者的IP和其他信息作为KEY,访问一次增加一次技术,超过次数返回false
- 分布式锁:通过SETNX实现简单锁机制。
二、Hash
- 特点:
- Hash用来存储多个无序的键值对。最大存储数量2^32 - 1 (40亿左右)
- 键值对集合,适合存储对象(如用户信息)。
- 支持单独操作某个字段(如 HSET user:1 age 30),避免序列化整个对象。
- 底层使用压缩列表(小数据)或哈希表(大数据),内存高效。
- 优点:
- 把所有相关的值都聚集到一个key中,节省内存空间
- 只是用一个key,减少key冲突
- 当需要批量获取值的时候,只需要使用一个命令,减少内存/IO/CPU的消耗
- 缺点:
- Field 不能单独设置过期时间
- 需要考虑数据量分布的问题(field非常多的时候,无法分布到多个节点)
- 使用场景
- String能做的Hash都能做
对象存储:用户信息、商品详情(字段可部分更新)。
配置管理:系统配置项按组存储,便于批量获取。
三、List
- 特点:
- 基于双向链表实现,支持在头部和尾部快速 插入/删除元素(时间复杂度 O(1))。
- 元素可以重复,按插入顺序排列。
- 可以通过索引访问,但是中间操作效率低(时间复杂度O(n))。
- 常用命令
- lpush + lpop = Stack (栈)
- lpush + rpop = Queue (队列)
- lpush + ltrim = Capped Collection (有限集合)
- lpush + brpop = Message Queue (消息队列)
- 阻塞的弹出操作:blpop / brpop,可以设置超时时间(单位:秒)
- blpop:blpop key1 timeout,移除并获取列表第一个元素,如果列表没有元素会阻塞列表,直到等待超时或发现可弹出元素为止。
- brpop:brpop key1 timeout,移除并获取列表最后一个元素,如果列表没有元素会阻塞列表,直到等待超时或发现可弹出元素位置。
- 使用场景
- 消息队列:生产者通过 lpush 推送消息,消费者通过 rpop 拉取(需轮询,建议使用Stream类型代替。
- 最新动态:存储用户的最新文章、评论(如 lpush+ltrim 保持固定长度)。
- 阻塞队列:使用 blpop / brpop 实现阻塞式读取。
四、Set
- 特点:
- 无序 且 元素唯一(自动去重)
- 支持集合运算(交集-sinter、并集-sunion、差集-sdiff)
- 查询元素是否存在 - 时间复杂度为O(1)。
- 使用场景
标签系统:用户兴趣标签(SADD user:1:tags tag1 tag2)。
唯一性约束:统计文章的唯一阅读用户。点赞、签到、打卡。
社交关系:共同关注(交集)、可能认识的人(差集)。
五、有序集合-Zset
- 特点
- 元素唯一,每个元素关联一个score(分数)用于排序
- 按 score 升序排列,支持范围查询(如 ZrangeByScore)。
- 底层使用跳跃表和哈希表,保证高效查询和排序。
- 使用场景
- 排行榜:游戏积分排名、热搜榜(按score排序)。
- 延迟队列:将任务到期时间作为score,定时轮询获取到期任务。
- 带权重的队列:优先处理高优先级的任务。