前言
Redis(Remote Dictionary Server)是一个开源的、基于内存的高性能键值对数据库。它支持多种数据结构,包括字符串、哈希、列表、集合、有序集合等。本文将详细介绍 Redis 的基本指令和命令,帮助读者全面掌握 Redis 的使用方法。
一、连接与服务器相关命令
1.1 连接 Redis
bash
# 连接本地 Redis 服务器
redis-cli
# 连接远程 Redis 服务器
redis-cli -h <host> -p <port>
# 带密码连接
redis-cli -h <host> -p <port> -a <password>
# 连接后进行密码认证
AUTH <password>
1.2 服务器信息命令
bash
# 查看服务器信息
INFO
# 查看特定部分的信息
INFO server
INFO clients
INFO memory
INFO stats
INFO replication
INFO cpu
INFO keyspace
# 查看当前数据库中键的数量
DBSIZE
# 查看服务器时间
TIME
# 查看客户端连接列表
CLIENT LIST
# 获取当前客户端名称
CLIENT GETNAME
# 设置当前客户端名称
CLIENT SETNAME <name>
# 关闭客户端连接
CLIENT KILL <ip:port>
# 查看配置
CONFIG GET <parameter>
CONFIG GET *
# 设置配置
CONFIG SET <parameter> <value>
# 重写配置文件
CONFIG REWRITE
# 重置统计信息
CONFIG RESETSTAT
1.3 数据库操作
bash
# 选择数据库(默认16个数据库,编号0-15)
SELECT <index>
# 清空当前数据库
FLUSHDB
# 清空所有数据库
FLUSHALL
# 同步保存数据到磁盘
SAVE
# 异步保存数据到磁盘
BGSAVE
# 返回最近一次成功保存的时间戳
LASTSAVE
# 关闭服务器
SHUTDOWN
SHUTDOWN SAVE
SHUTDOWN NOSAVE
二、键(Key)操作命令
2.1 基本键操作
bash
# 查看所有键(生产环境慎用)
KEYS *
# 使用模式匹配查看键
KEYS pattern*
KEYS *pattern
KEYS ?ey
KEYS [abc]*
# 检查键是否存在
EXISTS <key>
EXISTS <key1> <key2> <key3> # 返回存在的键数量
# 删除键
DEL <key>
DEL <key1> <key2> <key3>
# 异步删除键(非阻塞)
UNLINK <key>
# 获取键的类型
TYPE <key>
# 重命名键
RENAME <key> <newkey>
# 仅当新键不存在时重命名
RENAMENX <key> <newkey>
# 随机返回一个键
RANDOMKEY
# 序列化键的值
DUMP <key>
# 反序列化并恢复键值
RESTORE <key> <ttl> <serialized-value>
2.2 键的过期时间
bash
# 设置过期时间(秒)
EXPIRE <key> <seconds>
# 设置过期时间(毫秒)
PEXPIRE <key> <milliseconds>
# 设置过期时间点(Unix时间戳,秒)
EXPIREAT <key> <timestamp>
# 设置过期时间点(Unix时间戳,毫秒)
PEXPIREAT <key> <milliseconds-timestamp>
# 查看剩余生存时间(秒)
TTL <key>
# 返回值:-1 表示永不过期,-2 表示键不存在
# 查看剩余生存时间(毫秒)
PTTL <key>
# 移除过期时间,使键永久有效
PERSIST <key>
2.3 键的迁移与复制
bash
# 将键移动到另一个数据库
MOVE <key> <db>
# 将键复制到另一个 Redis 实例
MIGRATE <host> <port> <key> <destination-db> <timeout> [COPY] [REPLACE]
# 复制键(Redis 6.2+)
COPY <source> <destination> [DB destination-db] [REPLACE]
2.4 SCAN 命令(推荐用于生产环境)
bash
# 增量迭代键
SCAN <cursor> [MATCH pattern] [COUNT count] [TYPE type]
# 示例
SCAN 0 MATCH user:* COUNT 100
SCAN 0 TYPE string
三、字符串(String)命令
3.1 基本操作
bash
# 设置键值
SET <key> <value>
# 设置键值并指定过期时间(秒)
SET <key> <value> EX <seconds>
SETEX <key> <seconds> <value>
# 设置键值并指定过期时间(毫秒)
SET <key> <value> PX <milliseconds>
PSETEX <key> <milliseconds> <value>
# 仅当键不存在时设置
SET <key> <value> NX
SETNX <key> <value>
# 仅当键存在时设置
SET <key> <value> XX
# 设置值并返回旧值
GETSET <key> <value> # 已废弃
SET <key> <value> GET # Redis 6.2+
# 获取值
GET <key>
# 获取值的子字符串
GETRANGE <key> <start> <end>
# 覆盖字符串的一部分
SETRANGE <key> <offset> <value>
# 获取字符串长度
STRLEN <key>
# 追加值到字符串末尾
APPEND <key> <value>
3.2 批量操作
bash
# 批量设置
MSET <key1> <value1> <key2> <value2> ...
# 批量设置(仅当所有键都不存在时)
MSETNX <key1> <value1> <key2> <value2> ...
# 批量获取
MGET <key1> <key2> <key3> ...
3.3 数值操作
bash
#增1
INCR <key>
# 自增指定整数
INCRBY <key> <increment>
# 自增指定浮点数
INCRBYFLOAT <key> <increment>
# 自减1
DECR <key>
# 自减指定整数
DECRBY <key> <decrement>
3.4 位操作
bash
# 设置指定位的值
SETBIT <key> <offset> <value>
# 获取指定位的值
GETBIT <key> <offset>
# 统计被设置为1的位数
BITCOUNT <key> [start end]
# 位运算
BITOP <operation> <destkey> <key1> <key2> ...
# operation: AND, OR, XOR, NOT
# 查找第一个设置为指定值的位
BITPOS <key> <bit> [start] [end]
# 位域操作
BITFIELD <key> [GET type offset] [SET type offset value] [INCRBY type offset increment]
四、哈希(Hash)命令
4.1 基本操作
bash
# 设置单个字段
HSET <key> <field> <value>
# 设置多个字段
HSET <key> <field1> <value1> <field2> <value2> ...
HMSET <key> <field1> <value1> <field2> <value2> ... # 已废弃,使用 HSET
# 仅当字段不存在时设置
HSETNX <key> <field> <value>
# 获取单个字段值
HGET <key> <field>
# 获取多个字段值
HMGET <key> <field1> <field2> ...
# 获取所有字段和值
HGETALL <key>
# 获取所有字段名
HKEYS <key>
# 获取所有字段值
HVALS <key>
# 获取字段数量
HLEN <key>
# 检查字段是否存在
HEXISTS <key> <field>
# 删除字段
HDEL <key> <field1> <field2> ...
# 获取字段值的字符串长度
HSTRLEN <key> <field>
4.2 数值操作
bash
# 字段值自增整数
HINCRBY <key> <field> <increment>
# 字段值自增浮点数
HINCRBYFLOAT <key> <field> <increment>
4.3 迭代操作
bash
# 增量迭代哈希字段
HSCAN <key> <cursor> [MATCH pattern] [COUNT count]
4.4 随机操作(Redis 6.2+)
bash
# 随机返回字段
HRANDFIELD <key> [count [WITHVALUES]]
五、列表(List)命令
5.1 插入操作
bash
# 从左侧插入
LPUSH <key> <value1> <value2> ...
# 从右侧插入
RPUSH <key> <value1> <value2> ...
# 仅当列表存在时从左侧插入
LPUSHX <key> <value>
# 仅当列表存在时从右侧插入
RPUSHX <key> <value>
# 在指定元素前/后插入
LINSERT <key> BEFORE|AFTER <pivot> <value>
# 设置指定索引的值
LSET <key> <index> <value>
5.2 获取操作
bash
# 获取指定索引的元素
LINDEX <key> <index>
# 获取指定范围的元素
LRANGE <key> <start> <stop>
# 获取所有元素
LRANGE <key> 0 -1
# 获取列表长度
LLEN <key>
5.3 删除操作
bash
# 从左侧弹出
LPOP <key>
LPOP <key> <count> # Redis 6.2+
# 从右侧弹出
RPOP <key>
RPOP <key> <count> # Redis 6.2+
# 删除指定数量的元素
LREM <key> <count> <value>
# count > 0: 从头到尾删除
# count < 0: 从尾到头删除
# count = 0: 删除所有匹配元素
# 保留指定范围的元素
LTRIM <key> <start> <stop>
5.4 阻塞操作
bash
# 阻塞式左侧弹出
BLPOP <key1> <key2> ... <timeout>
# 阻塞式右侧弹出
BRPOP <key1> <key2> ... <timeout>
# 阻塞式弹出并推入另一个列表
BRPOPLPUSH <source> <destination> <timeout> # 已废弃
BLMOVE <source> <destination> LEFT|RIGHT LEFT|RIGHT <timeout> # Redis 6.2+
5.5 移动操作
bash
# 从一个列表弹出并推入另一个列表
RPOPLPUSH <source> <destination> # 已废弃
LMOVE <source> <destination> LEFT|RIGHT LEFT|RIGHT # Redis 6.2+
# 获取指定位置的元素(Redis 6.2+)
LPOS <key> <element> [RANK rank] [COUNT num-matches] [MAXLEN len]
六、集合(Set)命令
6.1 基本操作
bash
# 添加成员
SADD <key> <member1> <member2> ...
# 获取所有成员
SMEMBERS <key>
# 检查成员是否存在
SISMEMBER <key> <member>
# 检查多个成员是否存在(Redis 6.2+)
SMISMEMBER <key> <member1> <member2> ...
# 获取成员数量
SCARD <key>
# 删除成员
SREM <key> <member1> <member2> ...
# 随机弹出成员
SPOP <key>
SPOP <key> <count>
# 随机获取成员(不删除)
SRANDMEMBER <key>
SRANDMEMBER <key> <count>
# 移动成员到另一个集合
SMOVE <source> <destination> <member>
6.2 集合运算
bash
# 交集
SINTER <key1> <key2> ...
# 交集并存储
SINTERSTORE <destination> <key1> <key2> ...
# 交集的基数(Redis 7.0+)
SINTERCARD <numkeys> <key1> <key2> ... [LIMIT limit]
# 并集
SUNION <key1> <key2> ...
# 并集并存储
SUNIONSTORE <destination> <key1> <key2> ...
# 差集
SDIFF <key1> <key2> ...
# 差集并存储
SDIFFSTORE <destination> <key1> <key2> ...
6.3 迭代操作
bash
# 增量迭代集合成员
SSCAN <key> <cursor> [MATCH pattern] [COUNT count]
七、有序集合(Sorted Set)命令
7.1 基本操作
bash
# 添加成员
ZADD <key> <score1> <member1> <score2> <member2> ...
# 添加选项
ZADD <key> [NX|XX] [GT|LT] [CH] [INCR] <score> <member>
# NX: 仅添加新成员
# XX: 仅更新已存在的成员
# GT: 仅当新分数大于当前分数时更新
# LT: 仅当新分数小于当前分数时更新
# CH: 返回被修改的成员数量
# INCR: 类似 ZINCRBY
# 获取成员分数
ZSCORE <key> <member>
# 获取多个成员分数(Redis 6.2+)
ZMSCORE <key> <member1> <member2> ...
# 获取成员数量
ZCARD <key>
# 获取指定分数范围内的成员数量
ZCOUNT <key> <min> <max>
# 获取指定字典范围内的成员数量
ZLEXCOUNT <key> <min> <max>
# 增加成员分数
ZINCRBY <key> <increment> <member>
# 删除成员
ZREM <key> <member1> <member2> ...
# 删除指定排名范围的成员
ZREMRANGEBYRANK <key> <start> <stop>
# 删除指定分数范围的成员
ZREMRANGEBYSCORE <key> <min> <max>
# 删除指定字典范围的成员
ZREMRANGEBYLEX <key> <min> <max>
7.2 范围查询
bash
# 按排名获取成员(升序)
ZRANGE <key> <start> <stop> [WITHSCORES]
# 按排名获取成员(降序)
ZREVRANGE <key> <start> <stop> [WITHSCORES]
# 按分数获取成员(升序)
ZRANGEBYSCORE <key> <min> <max> [WITHSCORES] [LIMIT offset count]
# 按分数获取成员(降序)
ZREVRANGEBYSCORE <key> <max> <min> [WITHSCORES] [LIMIT offset count]
# 按字典序获取成员
ZRANGEBYLEX <key> <min> <max> [LIMIT offset count]
ZREVRANGEBYLEX <key> <max> <min> [LIMIT offset count]
# 统一的范围查询命令(Redis 6.2+)
ZRANGE <key> <start> <stop> [BYSCORE|BYLEX] [REV] [LIMIT offset count] [WITHSCORES]
7.3 排名查询
bash
# 获取成员排名(升序,从0开始)
ZRANK <key> <member>
# 获取成员排名(降序)
ZREVRANK <key> <member>
7.4 集合运算
bash
# 交集并存储
ZINTERSTORE <destination> <numkeys> <key1> <key2> ... [WEIGHTS weight1 weight2 ...] [AGGREGATE SUM|MIN|MAX]
# 并集并存储
ZUNIONSTORE <destination> <numkeys> <key1> <key2> ... [WEIGHTS weight1 weight2 ...] [AGGREGATE SUM|MIN|MAX]
# 差集并存储(Redis 6.2+)
ZDIFFSTORE <destination> <numkeys> <key1> <key2> ...
# 交集(Redis 6.2+)
ZINTER <numkeys> <key1> <key2> ... [WEIGHTS weight1 weight2 ...] [AGGREGATE SUM|MIN|MAX] [WITHSCORES]
# 并集(Redis 6.2+)
ZUNION <numkeys> <key1> <key2> ... [WEIGHTS weight1 weight2 ...] [AGGREGATE SUM|MIN|MAX] [WITHSCORES]
# 差集(Redis 6.2+)
ZDIFF <numkeys> <key1> <key2> ... [WITHSCORES]
7.5 弹出操作
bash
# 弹出最小分数的成员
ZPOPMIN <key> [count]
# 弹出最大分数的成员
ZPOPMAX <key> [count]
# 阻塞式弹出最小分数的成员
BZPOPMIN <key1> <key2> ... <timeout>
# 阻塞式弹出最大分数的成员
BZPOPMAX <key1> <key2> ... <timeout>
# 随机获取成员(Redis 6.2+)
ZRANDMEMBER <key> [count [WITHSCORES]]
7.6 迭代操作
bash
# 增量迭代有序集合成员
ZSCAN <key> <cursor> [MATCH pattern] [COUNT count]
八、HyperLogLog 命令
HyperLogLog 是一种用于基数统计的概率数据结构,可以用极小的内存统计大量数据的不重复元素数量。
bash
# 添加元素
PFADD <key> <element1> <element2> ...
# 获取基数估算值
PFCOUNT <key1> <key2> ...
# 合并多个 HyperLogLog
PFMERGE <destkey> <sourcekey1> <sourcekey2> ...
九、地理位置(Geo)命令
bash
# 添加地理位置
GEOADD <key> <longitude1> <latitude1> <member1> <longitude2> <latitude2> <member2> ...
# 获取位置坐标
GEOPOS <key> <member1> <member2> ...
# 计算两点距离
GEODIST <key> <member1> <member2> [m|km|ft|mi]
# 获取位置的 Geohash
GEOHASH <key> <member1> <member2> ...
# 查询指定范围内的成员
GEORADIUS <key> <longitude> <latitude> <radius> <m|km|ft|mi> [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count] [ASC|DESC] [STORE key] [STOREDIST key]
# 查询指定成员范围内的其他成员
GEORADIUSBYMEMBER <key> <member> <radius> <m|km|ft|mi> [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count] [ASC|DESC] [STORE key] [STOREDIST key]
# 统一的地理搜索命令(Redis 6.2+)
GEOSEARCH <key> FROMMEMBER <member>|FROMLONLAT <longitude> <latitude> BYRADIUS <radius> <m|km|ft|mi>|BYBOX <width> <height> <m|km|ft|mi> [ASC|DESC] [COUNT count [ANY]] [WITHCOORD] [WITHDIST] [WITHHASH]
# 地理搜索并存储(Redis 6.2+)
GEOSEARCHSTORE <destination> <source> FROMMEMBER <member>|FROMLONLAT <longitude> <latitude> BYRADIUS <radius> <m|km|ft|mi>|BYBOX <width> <height> <m|km|ft|mi> [ASC|DESC] [COUNT count [ANY]] [STOREDIST]
十、Stream 命令
Stream 是 Redis 5.0 引入的数据结构,用于消息队列场景。
10.1 基本操作
bash
# 添加消息
XADD <key> <ID|*> <field1> <value1> <field2> <value2> ...
# * 表示自动生成 ID
# 添加消息(带选项)
XADD <key> [NOMKSTREAM] [MAXLEN|MINID [=|~] threshold [LIMIT count]] <ID|*> <field> <value> ...
# 获取消息数量
XLEN <key>
# 获取 Stream 信息
XINFO STREAM <key> [FULL [COUNT count]]
XINFO GROUPS <key>
XINFO CONSUMERS <key> <groupname>
# 删除消息
XDEL <key> <ID1> <ID2> ...
# 裁剪 Stream
XTRIM <key> MAXLEN|MINID [=|~] <threshold> [LIMIT count]
10.2 读取消息
bash
# 读取消息
XREAD [COUNT count] [BLOCK milliseconds] STREAMS <key1> <key2> ... <ID1> <ID2> ...
# 范围读取
XRANGE <key> <start> <end> [COUNT count]
XREVRANGE <key> <end> <start> [COUNT count]
10.3 消费者组
bash
# 创建消费者组
XGROUP CREATE <key> <groupname> <ID|$> [MKSTREAM] [ENTRIESREAD entries_read]
# 销毁消费者组
XGROUP DESTROY <key> <groupname>
# 设置消费者组的最后递送 ID
XGROUP SETID <key> <groupname> <ID|$> [ENTRIESREAD entries_read]
# 删除消费者
XGROUP DELCONSUMER <key> <groupname> <consumername>
# 从消费者组读取消息
XREADGROUP GROUP <groupname> <consumername> [COUNT count] [BLOCK milliseconds] [NOACK] STREAMS <key1> <key2> ... <ID1> <ID2> ...
# 确认消息
XACK <key> <groupname> <ID1> <ID2> ...
# 查看待处理消息
XPENDING <key> <groupname> [[IDLE min-idle-time] <start> <end> <count> [consumer]]
# 转移消息所有权
XCLAIM <key> <groupname> <consumername> <min-idle-time> <ID1> <ID2> ... [IDLE ms] [TIME ms-unix-time] [RETRYCOUNT count] [FORCE] [JUSTID]
# 自 <groupname> <consumername> <min-idle-time> <start> [COUNT count] [JUSTID]
十一、发布订阅(Pub/Sub)命令
bash
# 订阅频道
SUBSCRIBE <channel1> <channel2> ...
# 订阅模式
PSUBSCRIBE <pattern1> <pattern2> ...
# 取消订阅
UNSUBSCRIBE [channel1 channel2 ...]
# 取消模式订阅
PUNSUBSCRIBE [pattern1 pattern2 ...]
# 发布消息
PUBLISH <channel> <message>
# 查看订阅信息
PUBSUB CHANNELS [pattern]
PUBSUB NUMSUB [channel1 channel2 ...]
PUBSUB NUMPAT
十二、事务命令
bash
# 开始事务
MULTI
# 执行事务
EXEC
# 取消事务
DISCARD
# 监视键(乐观锁)
WATCH <key1> <key2> ...
# 取消监视
UNWATCH
事务示例
bash
WATCH balance
MULTI
DECRBY balance 100
INCRBY savings 100
EXEC
十三、脚本命令
13.1 Lua 脚本
bash
# 执行 Lua 脚本
EVAL <script> <numkeys> <key1> <key2> ... <arg1> <arg2> ...
# 执行已缓存的脚本
EVALSHA <sha1> <numkeys> <key1> <key2> ... <arg1> <arg2> ...
# 加载脚本到缓存
SCRIPT LOAD <script>
# 检查脚本是否存在
SCRIPT EXISTS <sha1> <sha2> ...
# 清空脚本缓存
SCRIPT FLUSH [ASYNC|SYNC]
# 终止正在执行的脚本
SCRIPT KILL
# 调试脚本
SCRIPT DEBUG YES|SYNC|NO
13.2 函数(Redis 7.0+)
bash
# 加载函数库
FUNCTION LOAD <engine> <library-name> [REPLACE] [DESCRIPTION description] <function-code>
# 调用函数
FCALL <function> <numkeys> <key1> <key2> ... <arg1> <arg2> ...
FCALL_RO <function> <numkeys> <key1> <key2> ... <arg1> <arg2> ...
# 列出函数
FUNCTION LIST [LIBRARYNAME library-name-pattern] [WITHCODE]
# 删除函数库
FUNCTION DELETE <library-name>
# 清空所有函数
FUNCTION FLUSH [ASYNC|SYNC]
# 导出函数
FUNCTION DUMP
# 导入函数
FUNCTION RESTORE <serialized-value> [FLUSH|APPEND|REPLACE]
十四、持久化相关命令
bash
# 同步保存 RDB 快照
SAVE
# 异步保存 RDB 快照
BGSAVE
# 异步重写 AOF 文件
BGREWRITEAOF
# 查看最后一次保存时间
LASTSAVE
# 调试:模拟崩溃
DEBUG SEGFAULT
# 调试:休眠
DEBUG SLEEP <seconds>
十五、复制相关命令
bash
# 设置为从节点
REPLICAOF <host> <port>
SLAVEOF <host> <port> # 已废弃
# 取消复制,成为主节点
REPLICAOF NO ONE
SLAVEOF NO ONE # 已废弃
# 查看复制信息
INFO replication
# 等待从节点同步
WAIT <numreplicas> <timeout>
十六、集群相关命令
bash
# 查看集群信息
CLUSTER INFO
# 查看集群节点
CLUSTER NODES
# 查看槽位分配
CLUSTER SLOTS
# 查看键所属的槽位
CLUSTER KEYSLOT <key>
# 查看槽位中的键数量
CLUSTER COUNTKEYSINSLOT <slot>
# 获取槽位中的键
CLUSTER GETKEYSINSLOT <slot> <count>
# 添加节点
CLUSTER MEET <ip> <port>
# 分配槽位
CLUSTER ADDSLOTS <slot1> <slot2> ...
# 删除槽位
CLUSTER DELSLOTS <slot1> <slot2> ...
# 设置节点为从节点
CLUSTER REPLICATE <node-id>
# 故障转移
CLUSTER FAILOVER [FORCE|TAKEOVER]
# 重置集群
CLUSTER RESET [HARD|SOFT]
# 设置配置纪元
CLUSTER SET-CONFIG-EPOCH <config-epoch>
# 忘记节点
CLUSTER FORGET <node-id>
# 保存集群配置
CLUSTER SAVECONFIG
十七、慢查询日志
bash
# 获取慢查询日志
SLOWLOG GET [count]
# 获取慢查询日志长度
SLOWLOG LEN
# 重置慢查询日志
SLOWLOG RESET
# 配置慢查询阈值(微秒)
CONFIG SET slowlog-log-slower-than <microseconds>
# 配置慢查询日志最大长度
CONFIG SET slowlog-max-len <length>
十八、内存管理命令
bash
# 查看内存使用情况
MEMORY USAGE <key> [SAMPLES count]
# 查看内存统计
MEMORY STATS
# 查看内存医生诊断
MEMORY DOCTOR