Redis数据类型分为5大基础数据类型和扩展数据类型,本文仅详细讲讲5大基础数据类型和4个常用的数据类型
一、基础数据类型
1.字符串(String)
定义:字符串是Redis 最基础的类型,是二进制安全的字符串(可存储任意数据,如文本、数字、二进制内容),最大存储容量 512MB。
其核心特性主要有:
1.支持字符串 / 数字操作(自增、自减、拼接);
2.支持按位操作(Bit 级);
3.支持过期时间设置。
而常用命令则有:
1.增改:SET key value [EX 秒] [PX 毫秒](设置值,可扩展设置过期时间)APPEND key str(将str和key对应的vue拼接);
2.查询:GET key(根据key获取vue)、STRLEN key(根据key获取长度);
3.数字操作:INCR key(自增 1)、DECRBY key num(自减指定值)、INCRBYFLOAT key num(浮点自增);
4.位操作:SETBIT key offset value(设置位)、GETBIT key offset(获取位)、BITCOUNT key(统计 1 的位数)。
其适用场景主要有:
1.缓存简单数据(如用户 Token、商品详情 JSON);
2.计数器(如文章阅读量、接口请求量);
3.分布式锁(SET key value NX EX);
4.位图统计(如用户签到、活跃用户标记)。
2.哈希(Hash)
定义:键值对的集合(类似 "对象"),每个 Hash 可包含多个 field-value 字段,field 和 value 都是字符串。
核心特性:
可单独操作某个字段(无需修改整个 Hash),底层是压缩列表(小数据)或哈希表(大数据)。
常用命令:
1.增改:HSET key field value(单个字段)、HMSET key field1 val1 field2 val2(多个字段);
2.查询:HGET key field、HMGET key field1 field2(多个字段)、HGETALL key(所有字段)、HLEN key(字段数);
3.删除:HDEL key field1 field2;
4.判断:HEXISTS key field(字段是否存在)。
适用场景:
1.存储对象类数据(如用户信息:user:100 {name:"张三", age:20});
2.部分字段更新(如仅修改用户的手机号,无需重写整个对象)。
3.列表(List)
定义:有序的字符串链表,元素可重复,支持两端插入 / 弹出,底层是压缩列表(小数据)或双向链表(大数据)。
核心特性:其是有序(按插入顺序),支持范围查询、阻塞操作。
常用命令:
1.插入:LPUSH key val1 val2(左插)、RPUSH key val1 val2(右插);
2.弹出:LPOP key(左弹)、RPOP key(右弹)、BRPOP key 超时时间(阻塞右弹);
3.查询:LRANGE key start end(范围获取,0 -1 表示所有)、LLEN key(长度);
4.修改:LSET key index value(指定索引设值);
5.删除:LREM key count value(删除 count 个值为 value 的元素)。
适用场景:
1.消息队列(基于 LPUSH + BRPOP 实现简单队列);
2.最新消息列表(如 "用户最新评论",LPUSH 新增 +LRANGE 取前 N 条);
3.栈 / 队列结构(左插左弹是栈,左插右弹是队列)。
4.集合(Set)
定义:无序、唯一的字符串集合,底层是哈希表。
核心特性:其可以自动去重,支持交集、并集、差集等集合运算。
常用命令:
1.增删:SADD key val1 val2(添加)、SREM key val1 val2(删除);
2.查询:SMEMBERS key(所有元素)、SCARD key(元素数)、SISMEMBER key val(是否存在);
3.集合运算:SINTER key1 key2(交集)、SUNION key1 key2(并集)、SDIFF key1 key2(差集);
4.随机操作:SRANDMEMBER key [count](随机取 count 个元素)、SPOP key [count](随机删 count 个元素)。
适用场景:
1.标签系统(如 "用户喜欢的标签",自动去重);
2.共同好友 / 兴趣统计(如 SINTER user:100:follows user:200:follows 取共同关注);
3.抽奖系统(SPOP 随机抽取中奖者)。
5.有序集合(ZSet)
定义:类似 Set,但每个元素关联一个 "分值(score,double 类型)",按 score 从小到大排序(score 相同则按元素字典序排序),底层是压缩列表(小数据)或跳表 + 哈希表(大数据)。
核心特性:其也是有序(按 score),支持按排名 / 分值范围查询,也支持分值更新。
常用命令:
1.增改:ZADD key score1 val1 score2 val2(添加 / 更新);
查询:
2.按排名:ZRANGE key start end [WITHSCORES](升序取排名区间)、ZREVRANGE key start end(降序);
3.按分值:ZRANGEBYSCORE key min max [WITHSCORES](取分值区间);
4.排名 / 分值:ZRANK key val(升序排名)、ZSCORE key val(获取分值);
5.删除:ZREM key val1 val2(按元素删)、ZREMRANGEBYRANK key start end(按排名删);
6.统计:ZCARD key(元素数)、ZCOUNT key min max(分值区间内的元素数)。
适用场景:
1.排行榜(如 "商品销量榜",ZADD 存销量为 score,ZREVRANGE 取 Top N);
2.延时队列(ZADD 存任务 + 超时时间为 score,定时 ZRANGEBYSCORE 取到期任务);
3.范围统计(如 "分值在 80-100 的用户")。
二、扩展数据类型
1.HyperLogLog
定义:用于基数统计的概率型数据结构,不存储具体元素,仅记录 "不重复元素的近似数量",误差率约 0.81%。
核心特性:其内存占用极低(无论数据量多大,仅需约 12KB),不过其结果是近似值,非精确值。
常用命令:
1.PFADD key val1 val2(添加元素);
2.PFCOUNT key1 key2(统计基数);
3.PFMERGE destkey src1 src2(合并多个 HyperLogLog)。
适用场景:
1.独立访客(UV)统计(如 "网站每日 UV");
2.搜索关键词去重计数。
2.Geo(地理位置)
定义:Geo是基于 ZSet 实现的地理位置存储类型,可存储经纬度,并支持距离计算、范围查询。
核心特性:
其底层复用 ZSet(将经纬度编码为 score);支持球面距离计算。
常用命令:
1.增:GEOADD key 经度 纬度 地点名(如 GEOADD city 116.40 39.90 beijing);
2.查:GEOPOS key 地点名(获取经纬度)、GEODIST key 地点1 地点2 [unit](计算距离,unit 可选 m/km/mi/ft);
3.范围查询:GEORADIUS key 经度 纬度 半径 unit [WITHCOORD] [WITHDIST](根据坐标查范围内的地点);
4.基于地点查范围:GEORADIUSBYMEMBER key 地点名 半径 unit。
适用场景:
1.附近的人 / 商家(如 "查找我附近 5km 的餐厅");
2.地理位置关联服务(如物流轨迹)。
3.Stream
定义:Redis 5.0+ 新增的消息队列类型,支持持久化、消费组、消息确认等特性,是更完善的队列实现。
核心特性:其支持消息持久化(写入 RDB/AOF),且其也支持消费组(多消费者协同消费,避免重复);其消息 ID 自增(格式为 时间戳-序列号);拥有消息确认机制(ACK 机制,保证消费成功)。
常用命令:
1.生产消息:XADD key * field1 val1 field2 val2(* 表示自动生成消息 ID);
2.消费消息(单个消费者):XREAD COUNT 数量 BLOCK 超时时间 STREAMS key 起始ID(0 表示从开头读,$ 表示从最新读);
3.创建消费组:XGROUP CREATE key 组名 起始ID [MKSTREAM](MKSTREAM 表示若 Stream 不存在则创建);
4.消费组消费:XREADGROUP GROUP 组名 消费者名 COUNT 数量 STREAMS key >(> 表示消费未被消费的消息);
5.确认消息:XACK key 组名 消息ID1 消息ID2;
6.查看未确认消息:XPENDING key 组名。
适用场景:
1.高可靠的消息队列(如订单通知、日志同步);
2.分布式系统的异步通信(如微服务间的事件通知)。
4.Bitmap(位图)
定义:本质是 String 类型的扩展,将字符串的每个字节视为二进制位,通过位操作实现高效的布尔值存储。
核心特性:其使用内存高效(1MB 可存储 800 多万个布尔值),支持位与 / 或 / 异或等操作。
常用命令:
1.SETBIT key offset value(设置某一位的值,value 为 0/1);
2.GETBIT key offset(获取某一位的值);
3.BITCOUNT key [start end](统计 1 的位数);
4.BITOP op destkey key1 key2(位运算:op 可选 AND/OR/XOR/NOT);
5.BITPOS key value [start end](查找第一个值为 value 的位的位置)。
适用场景:
1.用户签到(如 sign:user:100 中,offset 为日期,1 表示签到,0 表示未签);
2.活跃用户标记(如 "统计 7 天内连续活跃的用户");
3.权限标记(如每个位代表一个权限,1 表示拥有)。