Redis 是一款高性能的内存数据结构服务器,广泛应用于缓存、消息队列、分布式锁、实时分析等场景。本文以速查表的形式,从全局命令、数据类型(String、Hash、List、Set、Sorted Set、Bitmap、HyperLogLog、GEO、Stream)到高级功能(事务、Lua脚本、发布订阅、管道),进行全景式梳理。
核心速记:Redis 是“数据结构服务器”,每个数据类型都有特定的使用场景。
SET/GET只是开始,ZADD、SINTER、BITCOUNT才是精华。
一、全局通用命令
| 命令 | 作用 | 示例 |
|---|---|---|
KEYS pattern | 查找所有匹配的 key(生产环境慎用,可能阻塞) | KEYS user:* |
SCAN cursor [MATCH pattern] [COUNT count] | 推荐,迭代 key,不阻塞 | SCAN 0 MATCH user:* COUNT 100 |
EXISTS key [key ...] | 判断 key 是否存在 | EXISTS user:1001 |
TYPE key | 查看 key 的数据类型 | TYPE user:1001→hash |
DEL key [key ...] | 删除一个或多个 key | DEL user:1001 |
UNLINK key [key ...] | 异步删除(非阻塞) | UNLINK big:key |
EXPIRE key seconds | 设置过期时间(秒) | EXPIRE session:abc 3600 |
PEXPIRE key milliseconds | 设置过期时间(毫秒) | PEXPIRE session:abc 3600000 |
TTL key | 查看剩余存活时间(秒) | TTL session:abc→3600 |
PTTL key | 查看剩余存活时间(毫秒) | PTTL session:abc→3600000 |
PERSIST key | 移除过期时间,使 key 永久有效 | PERSIST session:abc |
RENAME key newkey | 重命名 key | RENAME old:user new:user |
RENAMENX key newkey | 仅当新 key 不存在时重命名 | RENAMENX old:user new:user |
DBSIZE | 返回当前数据库 key 的数量 | DBSIZE |
FLUSHDB | 清空当前数据库 | FLUSHDB |
FLUSHALL | 清空所有数据库 | FLUSHALL |
SELECT index | 切换数据库(0-15,默认 16 个) | SELECT 1 |
INFO [section] | 获取 Redis 服务器信息 | INFO memory |
二、String(字符串)
本质:存储二进制安全的字符串(最大 512MB),支持整数自增/自减、位操作。是 Redis 最基础的数据结构。
| 命令 | 作用 | 示例 |
|---|---|---|
SET key value [EX seconds] [PX ms] [NX|XX] | 设置字符串(支持过期时间和 NX/XX) | SET user:1001:name "张三" EX 600 |
GET key | 获取字符串 | GET user:1001:name |
MSET key value [key value ...] | 批量设置 | MSET user:1001:name "张三" user:1001:age 28 |
MGET key [key ...] | 批量获取 | MGET user:1001:name user:1001:age |
SETNX key value | 仅当 key 不存在时设置(用于分布式锁) | SETNX lock:order:1001 1 |
SETEX key seconds value | 设置值并指定过期时间(秒) | SETEX session:abc 3600 "user_id=1001" |
PSETEX key ms value | 设置值并指定过期时间(毫秒) | PSETEX session:abc 3600000 "user_id=1001" |
GETSET key value | 设置新值,返回旧值(原子操作) | GETSET counter 10 |
INCR key | 自增 1 | INCR page:view:home |
INCRBY key increment | 自增指定数值 | INCRBY product:stock:1001 5 |
DECR key | 自减 1 | DECR product:stock:1001 |
DECRBY key decrement | 自减指定数值 | DECRBY product:stock:1001 3 |
INCRBYFLOAT key increment | 浮点数自增 | INCRBYFLOAT account:balance 0.5 |
APPEND key value | 追加内容 | APPEND user:1001:desc ",有 5 年经验" |
STRLEN key | 获取字符串长度 | STRLEN user:1001:name |
GETRANGE key start end | 获取子字符串 | GETRANGE user:1001:name 0 3 |
三、Hash(哈希)
本质:存储对象的字段-值映射(类似 Java 的 HashMap),适合存储对象结构(如用户信息、商品信息),支持对单个字段的增删改查。
| 命令 | 作用 | 示例 |
|---|---|---|
HSET key field value [field value ...] | 设置 hash 字段 | HSET user:1001 name "张三" age 28 city "北京" |
HGET key field | 获取单个字段 | HGET user:1001 name |
HGETALL key | 获取所有字段和值 | HGETALL user:1001 |
HMGET key field [field ...] | 批量获取字段 | HMGET user:1001 name age |
HMSET key field value [field value ...] | 批量设置(已弃用,用 HSET 替代) | — |
HINCRBY key field increment | 字段自增 | HINCRBY user:1001 age 1 |
HINCRBYFLOAT key field increment | 字段浮点数自增 | HINCRBYFLOAT user:1001 salary 500.5 |
HDEL key field [field ...] | 删除字段 | HDEL user:1001 age |
HEXISTS key field | 判断字段是否存在 | HEXISTS user:1001 name |
HLEN key | 获取字段数量 | HLEN user:1001 |
HKEYS key | 获取所有字段名 | HKEYS user:1001 |
HVALS key | 获取所有字段值 | HVALS user:1001 |
HSCAN key cursor [MATCH pattern] [COUNT count] | 迭代 hash 字段 | HSCAN user:1001 0 MATCH name* |
四、List(列表)
本质:有序的字符串列表(双向链表/压缩列表),适合消息队列、最新消息列表、历史记录等场景。支持左右两端操作。
| 命令 | 作用 | 示例 |
|---|---|---|
LPUSH key value [value ...] | 左侧(头部)插入一个或多个元素 | LPUSH logs "2026-01-01 10:00:00" |
RPUSH key value [value ...] | 右侧(尾部)插入一个或多个元素 | RPUSH logs "2026-01-01 10:00:00" |
LPOP key [count] | 左侧弹出元素 | LPOP logs |
RPOP key [count] | 右侧弹出元素 | RPOP logs |
LRANGE key start stop | 获取指定范围元素 | LRANGE logs 0 9(最新 10 条) |
LINDEX key index | 获取指定索引元素 | LINDEX logs 0 |
LSET key index value | 设置指定索引的值 | LSET logs 0 "new message" |
LINSERT key BEFORE|AFTER pivot value | 在指定元素前后插入 | LINSERT logs BEFORE "old" "new" |
LLEN key | 获取列表长度 | LLEN logs |
LREM key count value | 移除指定数量的指定值 | LREM logs 2 "error"(移除 2 个 error) |
LTRIM key start stop | 裁剪列表(保留指定范围) | LTRIM logs 0 99(保留前 100 条) |
RPOPLPUSH source destination | 从右弹出,从左插入(原子操作) | RPOPLPUSH queue:processing queue:done |
BLPOP key [key ...] timeout | 阻塞式左侧弹出 | BLPOP queue:tasks 30(等待 30 秒) |
BRPOP key [key ...] timeout | 阻塞式右侧弹出 | BRPOP queue:tasks 30 |
五、Set(集合)
本质:无序、不重复的字符串集合(哈希表/整数集合),适合标签系统、共同好友、抽奖、去重等场景。
| 命令 | 作用 | 示例 |
|---|---|---|
SADD key member [member ...] | 添加一个或多个成员 | SADD tags:article:1001 "redis" "database" |
SREM key member [member ...] | 移除一个或多个成员 | SREM tags:article:1001 "database" |
SMEMBERS key | 获取所有成员 | SMEMBERS tags:article:1001 |
SISMEMBER key member | 判断是否集合成员 | SISMEMBER tags:article:1001 "redis" |
SCARD key | 获取集合基数(元素数量) | SCARD tags:article:1001 |
SPOP key [count] | 随机弹出元素 | SPOP lucky:draw |
SRANDMEMBER key [count] | 随机获取成员(不删除) | SRANDMEMBER lucky:draw 3 |
SINTER key [key ...] | 交集 | SINTER tags:article:1001 tags:article:1002 |
SUNION key [key ...] | 并集 | SUNION tags:article:1001 tags:article:1002 |
SDIFF key [key ...] | 差集 | SDIFF tags:article:1001 tags:article:1002 |
SINTERSTORE destination key [key ...] | 交集存储到新 key | SINTERSTORE common:tags tags:a tags:b |
SSCAN key cursor [MATCH pattern] [COUNT count] | 迭代 set 成员 | SSCAN tags:article:1001 0 MATCH redis* |
六、Sorted Set(有序集合)
本质:带分数的有序集合(跳表+哈希表),适合排行榜、延迟队列、按分数排序的集合等场景。
| 命令 | 作用 | 示例 |
|---|---|---|
ZADD key score member [score member ...] | 添加成员(指定分数) | ZADD rank 100 "Alice" 95 "Bob" |
ZREM key member [member ...] | 移除成员 | ZREM rank "Bob" |
ZSCORE key member | 获取成员分数 | ZSCORE rank "Alice" |
ZINCRBY key increment member | 成员分数增加 | ZINCRBY rank 5 "Alice" |
ZCARD key | 获取成员数量 | ZCARD rank |
ZCOUNT key min max | 统计分数区间成员数 | ZCOUNT rank 90 100 |
ZRANK key member | 获取排名(升序,0 开始) | ZRANK rank "Alice" |
ZREVRANK key member | 获取排名(降序) | ZREVRANK rank "Alice" |
ZRANGE key start stop [WITHSCORES] | 按排名范围获取成员(升序) | ZRANGE rank 0 2 WITHSCORES |
ZREVRANGE key start stop [WITHSCORES] | 按排名范围获取成员(降序) | ZREVRANGE rank 0 2 WITHSCORES |
ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count] | 按分数范围获取成员 | ZRANGEBYSCORE rank 90 100 WITHSCORES |
ZREVRANGEBYSCORE key max min [WITHSCORES] | 按分数范围获取(降序) | ZREVRANGEBYSCORE rank 100 90 WITHSCORES |
ZREMRANGEBYRANK key start stop | 按排名范围移除 | ZREMRANGEBYRANK rank 0 1 |
ZREMRANGEBYSCORE key min max | 按分数范围移除 | ZREMRANGEBYSCORE rank 80 85 |
ZUNIONSTORE destination numkeys key [key ...] [WEIGHTS weight] [AGGREGATE SUM|MIN|MAX] | 多个有序集合的并集 | ZUNIONSTORE all:rank 2 rank:day1 rank:day2 |
ZINTERSTORE destination numkeys key [key ...] [WEIGHTS weight] [AGGREGATE SUM|MIN|MAX] | 多个有序集合的交集 | ZINTERSTORE common:rank 2 rank:2025 rank:2026 |
七、Bitmap(位图)
本质:对字符串按位操作,适合签到统计、在线状态、布隆过滤器等场景。每个 key 最大支持 2^32 位(512MB)。
| 命令 | 作用 | 示例 |
|---|---|---|
SETBIT key offset value | 设置某一位为 0/1 | SETBIT sign:user:1001:2026-01 0 1 |
GETBIT key offset | 获取某一位的值 | GETBIT sign:user:1001:2026-01 0 |
BITCOUNT key [start end] | 统计 1 的个数 | BITCOUNT sign:user:1001:2026-01 |
BITPOS key bit [start] [end] | 查找第一个 0/1 的位置 | BITPOS sign:user:1001:2026-01 0 |
BITOP operation destkey key [key ...] | 位运算(AND/OR/XOR/NOT) | BITOP AND week:active active:mon active:tue |
八、HyperLogLog(基数统计)
本质:概率数据结构,误差约 0.81%,适合独立访客数(UV)统计等需要去重计数的场景。每个 key 固定占用约 12KB 内存。
| 命令 | 作用 | 示例 |
|---|---|---|
PFADD key element [element ...] | 添加元素 | PFADD uv:2026-01-01 "user1001" "user1002" |
PFCOUNT key [key ...] | 获取基数(去重计数) | PFCOUNT uv:2026-01-01 |
PFMERGE destkey sourcekey [sourcekey ...] | 合并多个 HyperLogLog | PFMERGE uv:week uv:mon uv:tue uv:wed |
九、GEO(地理空间)
本质:基于 Sorted Set 封装的地理位置功能,适合附近的人、LBS 服务等场景。
| 命令 | 作用 | 示例 |
|---|---|---|
GEOADD key longitude latitude member [longitude latitude member ...] | 添加地理位置 | GEOADD locations 116.397 39.907 "天安门" |
GEOPOS key member [member ...] | 获取位置坐标 | GEOPOS locations "天安门" |
GEODIST key member1 member2 [unit] | 计算两位置距离(m/km/mi/ft) | GEODIST locations "天安门" "故宫" km |
GEORADIUS key longitude latitude radius unit [WITHCOORD] [WITHDIST] [COUNT count] | 查询半径内的成员 | GEORADIUS locations 116.397 39.907 5 km WITHDIST |
GEORADIUSBYMEMBER key member radius unit [WITHCOORD] [WITHDIST] [COUNT count] | 以成员为中心查询 | GEORADIUSBYMEMBER locations "天安门" 5 km |
十、Stream(消息流)
本质:Redis 5.0 引入的持久化消息队列,支持消费者组、消息确认、消息回溯,是 Redis 中最完善的消息队列方案。
| 命令 | 作用 | 示例 |
|---|---|---|
XADD key ID field value [field value ...] | 添加消息(*表示自动生成 ID) | XADD events * type "login" user "1001" |
XLEN key | 获取 Stream 长度 | XLEN events |
XRANGE key start end [COUNT count] | 查询消息范围 | XRANGE events - + COUNT 10 |
XREVRANGE key end start [COUNT count] | 反向查询消息 | XREVRANGE events + - COUNT 10 |
XREAD COUNT count STREAMS key ID | 读取消息(阻塞/非阻塞) | XREAD BLOCK 0 STREAMS events $ |
XGROUP CREATE key group ID [MKSTREAM] | 创建消费者组 | XGROUP CREATE events processors 0 |
XREADGROUP GROUP group consumer COUNT count STREAMS key ID | 消费者组读取 | XREADGROUP GROUP processors c1 STREAMS events > |
XACK key group ID [ID ...] | 确认消息已处理 | XACK events processors 123456-0 |
十一、高级功能
11.1 事务(Transactions)
| 命令 | 作用 | 示例 |
|---|---|---|
MULTI | 开启事务 | MULTI |
EXEC | 执行事务 | EXEC |
DISCARD | 取消事务 | DISCARD |
WATCH key [key ...] | 监视 key(乐观锁) | WATCH user:1001:balance |
UNWATCH | 取消监视 | UNWATCH |
redis
MULTI SET user:1001:name "张三" SET user:1001:age 28 EXEC
11.2 Lua 脚本
| 命令 | 作用 | 示例 |
|---|---|---|
EVAL script numkeys key [key ...] arg [arg ...] | 执行 Lua 脚本 | EVAL "return redis.call('GET', KEYS[1])" 1 user:1001:name |
EVALSHA sha1 numkeys key [key ...] arg [arg ...] | 执行缓存的脚本 | EVALSHA "sha1" 1 user:1001:name |
SCRIPT LOAD script | 加载脚本到缓存 | SCRIPT LOAD "return redis.call('GET', KEYS[1])" |
典型 Lua 脚本(原子扣减库存):
lua
-- 扣减库存脚本 -- KEYS[1]: 库存 key -- ARGV[1]: 要扣减的数量 local stock = redis.call('GET', KEYS[1]) if stock and tonumber(stock) >= tonumber(ARGV[1]) then redis.call('DECRBY', KEYS[1], ARGV[1]) return 1 else return 0 end
11.3 发布订阅(Pub/Sub)
| 命令 | 作用 | 示例 |
|---|---|---|
PUBLISH channel message | 发布消息 | PUBLISH news "Hello World" |
SUBSCRIBE channel [channel ...] | 订阅频道 | SUBSCRIBE news |
PSUBSCRIBE pattern [pattern ...] | 订阅符合模式的频道 | PSUBSCRIBE news.* |
UNSUBSCRIBE [channel ...] | 取消订阅 | UNSUBSCRIBE news |
PUBSUB CHANNELS [pattern] | 查看活跃频道 | PUBSUB CHANNELS |
11.4 管道(Pipeline)
管道不是 Redis 命令,而是客户端的技术。它允许一次性发送多条命令,减少网络往返次数(RTT)。
使用效果对比:
| 场景 | 普通模式 | Pipeline 模式 |
|---|---|---|
| 100 条命令执行 | 100 次网络往返 | 1 次网络往返 |
| 性能提升 | — | 约提升 5-10 倍 |
十二、开发场景速查对照表
| 应用场景 | 推荐数据结构 | 原因 |
|---|---|---|
| 缓存对象(用户信息、商品信息) | Hash | 可单独修改字段,无需整体重新设置 |
| 简单缓存(短字符串、Token、Session) | String | 最轻量、最快、支持过期时间 |
| 计数器(阅读数、点赞数、库存) | String(INCR/DECR) | 原子操作,无需加锁 |
| 排行榜(积分榜、销量榜) | Sorted Set | 按分数自动排序,支持 Top N 查询 |
| 最新消息列表(评论、通知) | List(LPUSH + LRANGE) | 有序,可控制保留条数(LTRIM) |
| 消息队列(异步任务、日志) | List(BLPOP/BRPOP)或 Stream | 阻塞式弹出,支持生产者-消费者模式 |
| 标签系统、共同好友、去重 | Set | 去重自动,支持交集/并集/差集 |
| 签到、在线状态、布隆过滤器 | Bitmap | 节省内存(1 个用户/天只需 1 bit) |
| 独立访客数(UV)统计 | HyperLogLog | 亿级基数,极小内存(每个 key 约 12KB) |
| 附近的人、LBS 服务 | GEO | 内置地理距离计算和半径查询 |
| 分布式锁 | String(SET NX PX) | 原子设置 + 过期时间,防死锁 |
| 可靠消息队列(需持久化、ACK) | Stream | 支持消费者组、消息确认、回溯 |
十三、总结
| 数据类型 | 一句话用途 | 常用命令 | 典型场景 |
|---|---|---|---|
| String | 最通用的键值对 | SET/GET/INCR | 缓存、计数器、分布式锁 |
| Hash | 对象存储 | HSET/HGET/HGETALL | 用户信息、商品信息 |
| List | 有序列表 | LPUSH/RPOP/LRANGE | 消息队列、最新列表 |
| Set | 去重集合 | SADD/SMEMBERS/SINTER | 标签、共同好友、抽奖 |
| Sorted Set | 带排序的集合 | ZADD/ZRANGE/ZREVRANGE | 排行榜、延迟队列 |
| Bitmap | 位操作 | SETBIT/GETBIT/BITCOUNT | 签到、在线状态 |
| HyperLogLog | 基数统计 | PFADD/PFCOUNT | UV 统计 |
| GEO | 地理空间 | GEOADD/GEORADIUS | 附近的人 |
| Stream | 持久化消息队列 | XADD/XREAD/XGROUP | 可靠消息队列 |
| 事务 | 批量原子执行 | MULTI/EXEC/WATCH | 转账、库存扣减 |
| Lua 脚本 | 复杂原子操作 | EVAL/EVALSHA | 限流、分布式锁(复杂版) |
| Pipeline | 批量命令(减少网络往返) | 客户端支持 | 大量写入/读取场景 |
十四、所以 Redis 是一款高性能的内存数据结构服务器 还是数据库
Redis 既是“高性能的内存数据结构服务器”,也是“数据库”。
这两个描述并不矛盾,而是从不同维度对 Redis 的定位进行定义。“数据结构服务器”强调它的设计哲学和技术形态,“数据库”强调它的功能角色和产品定位。
Redis 的官方定义是“数据结构服务器”,因为它围绕数据结构提供丰富的操作能力;但从功能角色看,它具备数据库的所有核心特征,完全可以作为数据库使用。更准确的说法是:Redis 是一款以内存为核心、数据结构为基础的数据库服务器。