redis数据的使用
Redis 作为高性能的键值存储数据库,提供了 8种核心数据结构,每种结构都有独特的底层实现、特性和适用场景,核心设计目标是“兼顾性能与内存效率”。以下从 数据结构定义、底层原理、核心命令、使用场景 四个维度,逐一详细解析:
一、String(字符串):Redis 最基础的数据结构
1. 数据结构定义
String 是 Redis 最核心、最常用的数据结构,本质是 二进制安全的动态字符串(可存储文本、图片二进制、序列化对象等),单个 String 最大容量为 512MB。
特性:键值对映射(1个键对应1个值)、支持原子操作(如自增/自减)。
2. 底层原理:简单动态字符串(SDS)
Redis 没有使用 C 语言原生字符串(以 \0
结尾的字符数组),而是自定义了 SDS(Simple Dynamic String) 结构,解决 C 字符串的缺陷:
struct sdshdr {int len; // 已使用字节数(字符串长度)int free; // 未使用字节数(剩余空间)char buf[]; // 存储字符串的字节数组(二进制安全,无需\0结尾)
};
SDS 的核心优势:
- 动态扩容:当字符串追加(
APPEND
)时,若free
不足,会按“当前 len 的 2 倍(len<1MB)或 +1MB(len≥1MB)”扩容,避免频繁内存分配。 - 二进制安全:不依赖
\0
识别字符串结尾,可存储图片、视频等二进制数据。 - 高效获取长度:直接读取
len
字段(O(1)),无需遍历字符数组(C 字符串为 O(n))。
3. 核心命令
命令 | 功能描述 | 示例 |
---|---|---|
SET key value | 设置键值对(覆盖旧值) | SET name "zhangsan" |
GET key | 获取键对应的值 | GET name → “zhangsan” |
INCR key | 对数值类型的 String 原子自增 1(仅支持整数) | INCR count → 若原是 5,返回 6 |
DECR key | 原子自减 1 | DECR count → 5 |
APPEND key str | 追加字符串到原值末尾 | APPEND name "123" → “zhangsan123” |
SET key value NX EX t | 仅当键不存在时设置(NX ),并设置过期时间 t 秒(EX ),用于分布式锁 | SET lock 1 NX EX 5 |
4. 使用场景
- 缓存热点数据:存储高频访问的简单数据(如商品详情、用户昵称),减轻数据库压力。
例:SET product:1001 "{\"name\":\"手机\",\"price\":3999}" EX 3600
(缓存商品1001的信息1小时)。 - 计数器:实现接口调用次数、点赞数、阅读量等原子计数。
例:用户点赞时执行INCR like:article:2024
,查看点赞数时GET like:article:2024
。 - 分布式锁:利用
SET NX EX
命令实现分布式锁(确保同一时间只有一个线程执行临界区代码)。 - 存储二进制数据:存储小图片、序列化后的对象(如 Java 的
Serializable
对象)。
二、Hash(哈希):适合存储“对象型数据”
1. 数据结构定义
Hash 是 键值对的集合(类似 Java 的 HashMap
),1个 Hash 键对应多个“字段-值”对(Field-Value),适合存储结构化对象(如用户、商品)。
特性:可单独操作某个字段(无需更新整个对象)、节省内存(相比多个 String 键)。
2. 底层原理:压缩列表(ziplist)+ 哈希表(dict)
Redis 会根据 Hash 中 字段数量 和 字段/值的大小 自动切换底层实现:
- 场景1:小数据量(字段数 ≤ 512 且每个字段/值 ≤ 64B):使用 压缩列表(ziplist)。
压缩列表是连续内存的紧凑结构,无哈希表的指针开销,内存效率极高。结构为:[prev_len][len][data][prev_len][len][data]...
(前一个元素长度 + 当前元素长度 + 数据)。 - 场景2:大数据量(字段数 > 512 或字段/值 > 64B):切换为 哈希表(dict)。
哈希表由“数组 + 链表”组成(解决哈希冲突),支持 O(1) 级别的字段查询/插入/删除,但内存开销比压缩列表大。
3. 核心命令
命令 | 功能描述 | 示例 |
---|---|---|
HSET key field value | 给 Hash 键设置“字段-值”对(覆盖旧字段) | HSET user:100 name "zhangsan" age 20 |
HGET key field | 获取 Hash 键中某个字段的值 | HGET user:100 name → “zhangsan” |
HMGET key f1 f2 | 批量获取多个字段的值 | HMGET user:100 name age → [“zhangsan”, “20”] |
HDEL key field | 删除 Hash 键中的某个字段 | HDEL user:100 age |
HGETALL key | 获取 Hash 键的所有“字段-值”对(大数据量慎用,会阻塞线程) | HGETALL user:100 → [“name”,“zhangsan”] |
HLEN key | 获取 Hash 键的字段总数 | HLEN user:100 → 1 |
4. 使用场景
- 存储结构化对象:存储用户信息、商品详情等,避免创建多个 String 键(如
user:100:name
、user:100:age
)。
例:HSET user:100 name "lisi" gender "male" phone "13800138000"
,更新手机号时仅需HSET user:100 phone "13900139000"
。 - 购物车:以用户 ID 为 Hash 键,商品 ID 为字段,商品数量为值。
例:用户100的购物车:HSET cart:100 prod:1001 2 prod:2002 1
(2个商品1001,1个商品2002),修改数量时HINCRBY cart:100 prod:1001 1
。 - 配置项存储:存储服务的多维度配置(如数据库连接池的
maxSize
、timeout
)。
三、List(列表):有序、可重复的“链表”
1. 数据结构定义
List 是 有序、可重复的元素集合(类似 Java 的 LinkedList
),支持从两端插入/删除元素,底层是双向链表,可实现“栈”“队列”“阻塞队列”。
特性:有序(按插入顺序排列)、可重复、支持索引访问(但效率低,O(n))。
2. 底层原理:快速列表(quicklist)
Redis 3.2 前,List 底层是“压缩列表(小数据)+ 双向链表(大数据)”;3.2 后统一为 快速列表(quicklist),是“双向链表 + 压缩列表”的结合体:
- 快速列表的每个节点是一个 压缩列表(存储多个元素),节点间通过双向指针连接。
- 优势:既保留双向链表的“高效两端操作”,又通过压缩列表减少节点间的指针开销,平衡性能与内存效率。
3. 核心命令
命令 | 功能描述 | 示例 |
---|---|---|
LPUSH key elem | 从 List 左侧(头部)插入元素 | LPUSH list1 a b → [b,a] |
RPUSH key elem | 从 List 右侧(尾部)插入元素 | RPUSH list1 c → [b,a,c] |
LPOP key | 从左侧弹出元素(删除并返回) | LPOP list1 → “b”,List 变为 [a,c] |
RPOP key | 从右侧弹出元素 | RPOP list1 → “c”,List 变为 [a] |
LRANGE key start end | 获取索引从 start 到 end 的元素(end=-1 表示最后一个) | LRANGE list1 0 -1 → [“a”] |
BLPOP key timeout | 阻塞式从左侧弹出元素(若 List 为空,等待 timeout 秒后返回,timeout=0 表示永久等待) | BLPOP list1 0 (永久等待,直到有元素插入) |
4. 使用场景
- 消息队列(MQ):利用
LPUSH + BRPOP
实现阻塞队列(生产者LPUSH
插入消息,消费者BRPOP
阻塞获取消息),避免轮询消耗 CPU。
例:订单消息队列:LPUSH order:queue "order1001"
(生产者),BRPOP order:queue 0
(消费者阻塞获取)。 - 最新列表:存储“最新 N 条数据”(如新闻feed、用户最近浏览记录),利用
LPUSH + LTRIM
限制长度。
例:用户100的最近浏览:LPUSH view:100 prod:1001
,再LTRIM view:100 0 9
(只保留前10条)。 - 栈/队列实现:
LPUSH + LPOP
实现栈(先进后出),LPUSH + RPOP
实现队列(先进先出)。
四、Set(集合):无序、不可重复的“哈希集合”
1. 数据结构定义
Set 是 无序、不可重复的元素集合(类似 Java 的 HashSet
),支持集合运算(交集、并集、差集),适合“去重”和“关系计算”。
特性:元素唯一(自动去重)、无序(无法通过索引访问)、支持 O(1) 级别的元素判断。
2. 底层原理:整数集合(intset)+ 哈希表(dict)
Redis 根据 Set 中 元素类型 和 数量 切换底层实现:
- 场景1:元素全为整数且数量 ≤ 512:使用 整数集合(intset)。
整数集合是连续内存的紧凑结构(存储有序整数),无哈希表的指针开销,内存效率极高。 - 场景2:元素含非整数或数量 > 512:使用 哈希表(dict)。
哈希表的“键”存储 Set 元素,“值”固定为NULL
,利用哈希表的“键唯一”特性实现 Set 的去重。
3. 核心命令
命令 | 功能描述 | 示例 |
---|---|---|
SADD key elem | 向 Set 中添加元素(重复元素会自动忽略) | SADD set1 a b c |
SMEMBERS key | 获取 Set 中的所有元素(大数据量慎用) | SMEMBERS set1 → [“a”,“b”,“c”] |
SISMEMBER key elem | 判断元素是否在 Set 中(O(1)) | SISMEMBER set1 a → 1(存在) |
SINTER key1 key2 | 求两个 Set 的交集(共同元素) | SADD set2 b c d ,SINTER set1 set2 → [“b”,“c”] |
SUNION key1 key2 | 求两个 Set 的并集(所有元素去重) | SUNION set1 set2 → [“a”,“b”,“c”,“d”] |
SREM key elem | 从 Set 中删除元素 | SREM set1 a → 1(删除成功) |
SRANDMEMBER key n | 随机获取 Set 中的 n 个元素(不删除) | SRANDMEMBER set1 2 → [“b”,“c”] |
4. 使用场景
- 去重:存储不重复的数据(如用户标签、文章关键词)。
例:文章2024的标签:SADD tag:2024 "java" "redis" "mysql"
,自动去重。 - 好友关系计算:求共同好友(交集)、好友推荐(并集-差集)。
例:用户100的好友SADD friend:100 101 102 103
,用户101的好友SADD friend:101 102 103 104
,共同好友SINTER friend:100 friend:101
→ [102,103]。 - 抽奖:利用
SRANDMEMBER
或SPOP
(随机删除并返回)实现公平抽奖。
例:抽奖用户SADD lottery 1001 1002 1003
,抽1人SPOP lottery
→ 1002。 - 黑名单/白名单:判断用户是否在黑名单(
SISMEMBER blacklist:user 100
),O(1) 效率。
五、Sorted Set(ZSet,有序集合):带“分数”的有序集合
1. 数据结构定义
ZSet 是 有序、不可重复的元素集合,每个元素关联一个“分数(score,浮点数)”,Redis 按分数从小到大排序。
特性:元素唯一、按分数有序、支持按分数范围/排名查询。
2. 底层原理:压缩列表(ziplist)+ 跳表(skiplist)+ 哈希表(dict)
ZSet 底层是“跳表 + 哈希表”的组合(小数据量时用压缩列表):
- 跳表(skiplist):实现“按分数有序”和“范围查询”。跳表是多层有序链表,通过“索引层”减少查询时的遍历次数,查询/插入/删除效率为 O(log n)(类似红黑树,但实现更简单)。
- 哈希表(dict):存储“元素 → 分数”的映射,实现 O(1) 级别的“元素查分数”“元素是否存在”判断。
- 两者共享元素数据(跳表存元素和分数,哈希表存元素和分数的指针),确保数据一致性。
3. 核心命令
命令 | 功能描述 | 示例 |
---|---|---|
ZADD key score elem | 向 ZSet 中添加元素(指定分数,重复元素会更新分数) | ZADD rank 95 "zhangsan" 88 "lisi" |
ZRANGE key start end | 按分数升序获取索引 start 到 end 的元素(WITHSCORES 显示分数) | ZRANGE rank 0 -1 WITHSCORES → [“lisi”,88,“zhangsan”,95] |
ZREVRANGE key start end | 按分数降序获取元素 | ZREVRANGE rank 0 -1 → [“zhangsan”,“lisi”] |
ZSCORE key elem | 获取元素的分数 | ZSCORE rank zhangsan → 95 |
ZINCRBY key incr elem | 给元素的分数增加 incr (可负) | ZINCRBY rank 2 zhangsan → 97 |
ZRANGEBYSCORE key min max | 按分数范围获取元素((min 表示不包含 min) | ZRANGEBYSCORE rank 90 100 → [“zhangsan”] |
ZRank key elem | 获取元素的升序排名(从0开始) | ZRank rank lisi → 0 |
4. 使用场景
- 排行榜:按分数排序(如考试成绩、游戏积分、接口调用量)。
例:学生成绩排行榜:ZADD score:rank 98 "wangwu" 95 "zhangsan"
,查前3名ZREVRANGE score:rank 0 2
。 - 延迟队列:以“时间戳”为分数,元素为任务ID,通过
ZRANGEBYSCORE key 0 当前时间
获取到期任务。
例:10秒后执行的任务:ZADD delay:queue 1717245600 "task1001"
(1717245600是10秒后的时间戳),定时任务每秒执行ZRANGEBYSCORE delay:queue 0 1717245599
获取到期任务。 - 范围查询:按分数筛选数据(如筛选积分在 100-200 之间的用户)。
例:ZRANGEBYSCORE user:score 100 200
→ 积分符合的用户ID。
六、其他高频数据结构(HyperLogLog、Geo、BitMap)
1. HyperLogLog:基数统计(去重计数)
- 定义:用于“基数统计”(即“不重复元素的个数”),特点是 内存效率极高(统计10亿个数据仅需约12KB),但有 0.81% 的误差。
- 原理:基于“概率算法”,通过统计哈希值的“前导零个数”估算基数(无需存储所有元素)。
- 核心命令:
PFADD key elem
(添加元素)、PFCOUNT key
(统计基数)、PFMERGE dest key1 key2
(合并两个 HyperLogLog)。 - 场景:UV统计(网站独立访客)、搜索关键词去重计数、用户行为次数去重(如“用户今日点击商品的不重复次数”)。
2. Geo:地理信息存储(LBS服务)
- 定义:存储经纬度(如纬度39.9042,经度116.4074),支持距离计算、范围查询。
- 原理:底层是 ZSet,将经纬度通过“GeoHash 算法”编码为一个 64 位整数(作为 ZSet 的分数),利用 ZSet 的有序性实现地理查询。
- 核心命令:
GEOADD key 经度 纬度 地点
(添加地点)、GEODIST key 地点1 地点2
(计算距离)、GEORADIUS key 经度 纬度 半径 单位
(查询半径内的地点)。 - 场景:附近的人(查询用户周围1公里的其他用户)、商家定位(查询附近的餐厅)、LBS游戏(如“ Pokemon GO ”的地图定位)。
3. BitMap:位存储(高效状态标记)
- 定义:将 String 作为“位数组”,每个 bit 代表一个状态(0/1),适合存储“布尔型”数据(如是否签到、是否在线)。
- 原理:String 的底层是字节数组,1个字节 = 8个 bit,通过
SETBIT
操作指定位置的 bit。 - 核心命令:
SETBIT key offset value
(设置第offset
位的 bit 值,0/1)、GETBIT key offset
(获取第offset
位的 bit 值)、BITCOUNT key
(统计 bit 为1的个数)。 - 场景:签到(用户100在2024年5月1日签到:
SETBIT sign:100:202405 0 1
,0是5月1日的偏移量)、用户在线状态(SETBIT online:user 100 1
表示用户100在线)、布隆过滤器(结合多个 BitMap 实现高效去重)。
七、数据结构选择总结
选择 Redis 数据结构的核心是 “匹配业务需求与数据结构特性”,以下是决策指南:
业务需求 | 推荐数据结构 | 核心原因 |
---|---|---|
简单键值映射、缓存、计数器 | String | 基础、高效、支持原子操作 |
结构化对象(用户、商品) | Hash | 单独操作字段、节省内存 |
有序列表(消息队列、最新列表) | List | 两端操作高效、支持阻塞队列 |
去重、集合运算(好友关系) | Set | 自动去重、支持交集/并集 |
排序、排名、范围查询 | ZSet | 按分数有序、支持排名和范围筛选 |
基数统计(UV、去重计数) | HyperLogLog | 内存效率极高、支持海量数据 |
地理信息(附近的人) | Geo | 支持经纬度存储和距离计算 |
布尔状态(签到、在线) | BitMap | 位存储、内存效率极高 |
结尾交付物提议
要不要我帮你整理一份 “Redis 数据结构选型与核心命令速查表”?表格会清晰列出每种数据结构的特性、适用场景、核心命令和注意事项,方便你日常开发中快速查阅和选型。
Redis 提供了丰富的命令用于操作不同数据结构,以下按 8种核心数据结构 分类整理了常用及重要命令,包含命令语法、功能描述和示例,方便全面查阅。
一、String(字符串)命令
String 是最基础的键值对结构,支持字符串、数字等多种类型操作。
命令语法 | 功能描述 | 示例 | 返回值/效果示例 |
---|---|---|---|
SET key value [NX|XX] [EX seconds|PX milliseconds] | 设置键值对,NX (仅不存在时)、XX (仅存在时),EX/PX 设置过期时间 | SET name "redis" EX 3600 | OK |
GET key | 获取键对应的值 | GET name | “redis” |
GETSET key value | 设置新值并返回旧值 | GETSET name "new-redis" | “redis”(旧值) |
INCR key | 对数值类型键原子自增1(非数值会报错) | INCR count (原value=5) | 6 |
INCRBY key increment | 原子自增指定数值 | INCRBY count 3 (原=6) | 9 |
DECR key / DECRBY key decrement | 原子自减1 / 自减指定数值 | DECR count (原=9) | 8 |
APPEND key value | 追加字符串到原值末尾 | APPEND name "db" (原=“redis”) | 7(新长度) |
STRLEN key | 获取字符串长度 | STRLEN name (值为"redisdb") | 7 |
SUBSTR key start end | 截取字符串(start/end为索引,负数表示倒数) | SUBSTR name 0 2 (值为"redisdb") | “red” |
SETNX key value | 仅当键不存在时设置(等价于SET key value NX ) | SETNX lock "1" | 1(成功)/ 0(失败) |
SETEX key seconds value | 设置键值并指定过期时间(等价于SET key value EX seconds ) | SETEX temp 60 "data" | OK |
二、Hash(哈希)命令
Hash 用于存储“字段-值”对集合,适合结构化数据。
命令语法 | 功能描述 | 示例 | 返回值/效果示例 |
---|---|---|---|
HSET key field value [field2 value2 ...] | 设置哈希表的字段值(支持批量) | HSET user:1 name "tom" age 20 | 2(成功设置的字段数) |
HGET key field | 获取哈希表中指定字段的值 | HGET user:1 name | “tom” |
HMGET key field1 [field2 ...] | 批量获取多个字段的值 | HMGET user:1 name age | [“tom”, “20”] |
HGETALL key | 获取哈希表中所有字段和值(大哈希慎用) | HGETALL user:1 | [“name”,“tom”,“age”,“20”] |
HDEL key field1 [field2 ...] | 删除哈希表中的字段 | HDEL user:1 age | 1(成功删除的字段数) |
HLEN key | 获取哈希表的字段总数 | HLEN user:1 (剩余name字段) | 1 |
HEXISTS key field | 判断字段是否存在于哈希表中 | HEXISTS user:1 name | 1(存在)/ 0(不存在) |
HKEYS key | 获取哈希表中所有字段名 | HKEYS user:1 | [“name”] |
HVALS key | 获取哈希表中所有字段值 | HVALS user:1 | [“tom”] |
HINCRBY key field increment | 对哈希表中字段的数值原子自增(仅支持整数) | HINCRBY user:1 age 5 (原=20) | 25 |
三、List(列表)命令
List 是有序可重复的元素集合,支持两端操作。
命令语法 | 功能描述 | 示例 | 返回值/效果示例 |
---|---|---|---|
LPUSH key element [element2 ...] | 从列表左侧(头部)插入一个或多个元素 | LPUSH fruits "apple" "banana" | 2(列表长度) |
RPUSH key element [element2 ...] | 从列表右侧(尾部)插入一个或多个元素 | RPUSH fruits "orange" | 3(列表长度) |
LPOP key | 从列表左侧弹出元素(删除并返回) | LPOP fruits | “banana” |
RPOP key | 从列表右侧弹出元素 | RPOP fruits | “orange” |
LRANGE key start end | 获取列表中索引从start 到end 的元素(end=-1 表示最后一个) | LRANGE fruits 0 -1 (剩余[“apple”]) | [“apple”] |
LLEN key | 获取列表长度 | LLEN fruits | 1 |
LREM key count value | 从列表中删除count 个值为value 的元素(count>0 从左,<0 从右,=0 全删) | LREM fruits 1 "apple" | 1(删除数量) |
LSET key index value | 设置列表中指定索引的元素值(索引越界报错) | LSET fruits 0 "grape" | OK |
LTRIM key start end | 截取列表,只保留start 到end 的元素(删除其他元素) | LTRIM fruits 0 0 (保留首元素) | OK |
BLPOP key [key2 ...] timeout | 阻塞式从左侧弹出元素(列表为空时等待timeout 秒,0表示永久) | BLPOP fruits 10 | 若超时返回nil,否则返回[key, value] |
BRPOP key [key2 ...] timeout | 阻塞式从右侧弹出元素 | BRPOP fruits 10 | 同上 |
四、Set(集合)命令
Set 是无序不可重复的元素集合,支持集合运算。
命令语法 | 功能描述 | 示例 | 返回值/效果示例 |
---|---|---|---|
SADD key member [member2 ...] | 向集合中添加元素(重复元素自动忽略) | SADD tags "java" "redis" | 2(成功添加的元素数) |
SMEMBERS key | 获取集合中所有元素(大集合慎用) | SMEMBERS tags | [“java”, “redis”] |
SISMEMBER key member | 判断元素是否在集合中 | SISMEMBER tags "java" | 1(存在)/ 0(不存在) |
SREM key member [member2 ...] | 从集合中删除元素 | SREM tags "java" | 1(删除数量) |
SCARD key | 获取集合元素总数 | SCARD tags (剩余[“redis”]) | 1 |
SPOP key [count] | 随机删除并返回集合中的count 个元素(默认1个) | SPOP tags 1 | “redis” |
SRANDMEMBER key [count] | 随机返回集合中的count 个元素(不删除) | SRANDMEMBER tags 1 (若有元素) | “redis” |
SINTER key1 [key2 ...] | 求多个集合的交集(共同元素) | SADD set1 1 2 3 ,SADD set2 2 3 4 ,SINTER set1 set2 | [2, 3] |
SUNION key1 [key2 ...] | 求多个集合的并集(所有元素去重) | SUNION set1 set2 | [1, 2, 3, 4] |
SDIFF key1 [key2 ...] | 求集合1与其他集合的差集(只在1中存在的元素) | SDIFF set1 set2 | [1] |
SINTERSTORE dest key1 [key2 ...] | 将交集结果存储到dest 集合 | SINTERSTORE inter set1 set2 | 2(交集元素数) |
五、ZSet(有序集合)命令
ZSet 是按“分数”排序的无序不可重复集合。
命令语法 | 功能描述 | 示例 | 返回值/效果示例 |
---|---|---|---|
ZADD key score member [score2 member2 ...] | 向有序集合添加元素(指定分数,重复元素更新分数) | ZADD rank 90 "alice" 85 "bob" | 2(成功添加的元素数) |
ZRANGE key start end [WITHSCORES] | 按分数升序返回索引start 到end 的元素(WITHSCORES 带分数) | ZRANGE rank 0 -1 WITHSCORES | [“bob”, “85”, “alice”, “90”] |
ZREVRANGE key start end [WITHSCORES] | 按分数降序返回元素 | ZREVRANGE rank 0 -1 | [“alice”, “bob”] |
ZSCORE key member | 获取元素的分数 | ZSCORE rank "alice" | “90” |
ZINCRBY key increment member | 为元素的分数原子增减increment (支持负数) | ZINCRBY rank 5 "alice" | “95” |
ZREM key member [member2 ...] | 从有序集合中删除元素 | ZREM rank "bob" | 1(删除数量) |
ZCARD key | 获取有序集合元素总数 | ZCARD rank (剩余alice) | 1 |
ZRANK key member | 返回元素的升序排名(从0开始) | ZRANK rank "alice" (分数95) | 0 |
ZREVRANK key member | 返回元素的降序排名 | ZREVRANK rank "alice" | 0 |
ZRANGEBYSCORE key min max [LIMIT offset count] | 按分数范围返回元素((min 表示不包含,+inf 表示正无穷) | ZRANGEBYSCORE rank 80 100 | [“alice”] |
ZCOUNT key min max | 统计分数在min 到max 之间的元素数 | ZCOUNT rank 80 100 | 1 |
六、HyperLogLog 命令
HyperLogLog 用于高效基数统计(不重复元素个数)。
命令语法 | 功能描述 | 示例 | 返回值/效果示例 |
---|---|---|---|
PFADD key element [element2 ...] | 向HyperLogLog添加元素 | PFADD uv:20240501 "user1" "user2" | 1(至少添加1个新元素)/ 0 |
PFCOUNT key [key2 ...] | 统计基数(不重复元素个数) | PFCOUNT uv:20240501 | 2 |
PFMERGE destkey key1 [key2 ...] | 合并多个HyperLogLog到destkey | PFMERGE uv:202405 uv:20240501 uv:20240502 | OK |
七、Geo(地理信息)命令
Geo 用于存储经纬度并支持地理查询。
命令语法 | 功能描述 | 示例 | 返回值/效果示例 |
---|---|---|---|
GEOADD key longitude latitude member [longitude2 latitude2 member2 ...] | 添加地理坐标(经度、纬度、地点名) | GEOADD cities 116.4074 39.9042 "beijing" 121.4737 31.2304 "shanghai" | 2(添加的地点数) |
GEODIST key member1 member2 [unit] | 计算两个地点的距离(单位:m/km/mi/ft,默认m) | GEODIST cities beijing shanghai km | “1318.3821”(公里) |
GEOPOS key member [member2 ...] | 获取地点的经纬度 | GEOPOS cities beijing | [[116.40740096569061, 39.90420249027864]] |
GEORADIUS key longitude latitude radius unit [WITHCOORD] [WITHDIST] [COUNT count] | 查找指定经纬度半径内的地点(WITHCOORD 带坐标,WITHDIST 带距离,COUNT 限制数量) | GEORADIUS cities 116.4 39.9 100 km COUNT 1 | 符合条件的地点列表 |
GEORADIUSBYMEMBER key member radius unit ... | 以指定地点为中心查找半径内的地点(参数同GEORADIUS) | GEORADIUSBYMEMBER cities beijing 100 km | 北京周边100公里内的地点 |
八、BitMap(位图)命令
BitMap 以位为单位存储状态(0/1)。
命令语法 | 功能描述 | 示例 | 返回值/效果示例 |
---|---|---|---|
SETBIT key offset value | 设置第offset 位的值(0或1,offset从0开始) | SETBIT sign:user1 0 1 (第0位设为1) | 0(原位置的值) |
GETBIT key offset | 获取第offset 位的值 | GETBIT sign:user1 0 | 1 |
BITCOUNT key [start end] | 统计位值为1的数量(start/end 为字节索引,默认全量) | BITCOUNT sign:user1 | 1 |
BITOP operation destkey key1 [key2 ...] | 对多个位图执行位运算(AND/OR/XOR/NOT ),结果存到destkey | BITOP OR sign:all sign:user1 sign:user2 | 运算后结果的字节数 |
BITPOS key value [start] [end] | 查找第一个值为value (0或1)的位位置 | BITPOS sign:user1 1 | 0 |
九、通用命令(适用于所有数据结构)
命令语法 | 功能描述 | 示例 | 返回值/效果示例 |
---|---|---|---|
KEYS pattern | 查找匹配pattern 的所有键(生产环境慎用,会阻塞) | KEYS user:* | [“user:1”, “user:2”] |
EXISTS key [key2 ...] | 判断键是否存在 | EXISTS name | 1(存在)/ 0(不存在) |
DEL key [key2 ...] | 删除键 | DEL name | 1(删除的键数) |
EXPIRE key seconds | 设置键的过期时间(秒) | EXPIRE name 60 | 1(成功)/ 0(键不存在) |
PEXPIRE key milliseconds | 设置过期时间(毫秒) | PEXPIRE name 60000 | 同上 |
TTL key | 查看键的剩余过期时间(秒,-1=永不过期,-2=已过期) | TTL name | 50(剩余50秒) |
PTTL key | 查看剩余过期时间(毫秒) | PTTL name | 50000 |
PERSIST key | 移除键的过期时间(设为永不过期) | PERSIST name | 1(成功)/ 0(键不存在或无过期) |
TYPE key | 查看键的数据结构类型 | TYPE name | “string” |
RENAME key newkey | 重命名键(若newkey存在则覆盖) | RENAME name username | OK |
SCAN cursor [MATCH pattern] [COUNT count] | 渐进式遍历键(替代KEYS,非阻塞) | SCAN 0 MATCH user:* COUNT 10 | [新cursor, 键列表] |
使用说明
- 命令大小写:Redis命令不区分大小写(如
SET
和set
等效),但键和值区分大小写。 - 性能注意:标记“慎用”的命令(如
HGETALL
、SMEMBERS
)在数据量大时会阻塞Redis,建议用渐进式命令(如HSCAN
、SSCAN
)替代。 - 版本差异:部分命令在Redis不同版本中有细微差异(如
GEO
命令在3.2+支持),建议结合官方文档确认。
如需某类命令的详细使用场景或性能优化建议,可以进一步说明。