Redis:数据库语法速查表 / 全景梳理

Redis 是一款高性能的内存数据结构服务器,广泛应用于缓存、消息队列、分布式锁、实时分析等场景。本文以速查表的形式,从全局命令、数据类型(String、Hash、List、Set、Sorted Set、Bitmap、HyperLogLog、GEO、Stream)到高级功能(事务、Lua脚本、发布订阅、管道),进行全景式梳理。
核心速记: Redis 是"数据结构服务器",每个数据类型都有特定的使用场景。SET/GET 只是开始,ZADDSINTERBITCOUNT 才是精华。

一、全局通用命令

命令 作用 示例
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:1001hash
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:abc3600
PTTL key 查看剩余存活时间(毫秒) PTTL session:abc3600000
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)
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` 在指定元素前后插入
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]`
`ZINTERSTORE destination numkeys key [key ...] [WEIGHTS weight] [AGGREGATE SUM MIN MAX]`

七、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 是一款以内存为核心、数据结构为基础的数据库服务器。

相关推荐
Devlive 开源社区1 小时前
Nebula 1.6.0 发布:跨区域桶自动路由、秒传、文本/PDF 预览一次到位
数据库·sql
这个DBA有点耶2 小时前
导个数据中文全变问号?字符集这事儿真没那么简单
数据库·mysql·代码规范
Alluxio2 小时前
Alluxio + Anyscale Ray框架,实现跨区域训练数据读取速度20倍提升
人工智能·分布式·机器学习·缓存·ai
wuqingshun3141592 小时前
MYSQL中如果发生死锁应该如何解决?
数据库·mysql
DO_Community2 小时前
Weaviate 托管数据库现已在 DigitalOcean 上开放公测
数据库·人工智能·开源·向量数据库·weaviate
报错小能手3 小时前
索引常见面试题
数据库
Database_Cool_3 小时前
时序数据库选型:阿里云 Lindorm 时序引擎 vs InfluxDB 全维度对比
数据库·阿里云·时序数据库
其实防守也摸鱼3 小时前
渗透--损坏的对象级别鉴权漏洞(Broken Object Level Authorization, BOLA)
大数据·网络·数据库·学习·tcp/ip·安全·安全威胁分析
hehelm3 小时前
IO 多路复用 — Reactor
linux·服务器·网络·数据库·c++