以下是Redis常用命令的表格整理,包含命令、功能、参数说明和使用例子。表格按功能分类,方便查阅,基于Redis 7.x版本。

分类命令功能参数说明使用例子
键管理SET key value [EX seconds][NX XX]设置键值对,可加过期或条件EX seconds: 过期时间(秒)
NX: 键不存在时设置
XX: 键存在时设置
SET name "小明"
SET age 18 EX 60
SET lock "1" NX
GET key获取键的值SET name "小明"
GET name → “小明”
DEL key [key ...]删除一个或多个键可多个键DEL name
DEL name age
EXISTS key [key ...]检查键是否存在可多个键EXISTS name → 1
EXISTS age → 0
EXPIRE key seconds设置键过期时间seconds: 秒数SET code "1234"
EXPIRE code 300
TTL code → 300
KEYS pattern查找匹配模式的键pattern: 通配符(如*KEYS user:*["user:1", "user:2"]
字符串INCR key键值(数字)加1SET count 10
INCR count → 11
DECR key键值(数字)减1SET count 10
DECR count → 9
MSET key value [key value ...]批量设置多个键值对多对键值MSET name "小明" age 18
GET name → “小明”
MGET key [key ...]批量获取多个键的值可多个键MGET name age["小明", "18"]
列表LPUSH key value [value ...]从列表左端插入值可多个值LPUSH tasks "task1" "task2"
LRANGE tasks 0 -1["task2", "task1"]
RPUSH key value [value ...]从列表右端插入值可多个值RPUSH tasks "task3"
LRANGE tasks 0 -1["task2", "task1", "task3"]
LPOP key从列表左端移除并返回值LPOP tasks → “task2”
RPOP key从列表右端移除并返回值RPOP tasks → “task3”
LRANGE key start stop获取列表指定范围元素start, stop: 索引(0起,-1末尾)LRANGE tasks 0 1["task2", "task1"]
集合SADD key member [member ...]向集合添加元素(去重)可多个元素SADD hobbies "跑步" "游泳"
SMEMBERS hobbies["跑步", "游泳"]
SREM key member [member ...]从集合移除元素可多个元素SREM hobbies "游泳" → 1
SMEMBERS key返回集合所有元素SMEMBERS hobbies["跑步"]
SINTER key [key ...]返回多个集合的交集可多个集合SINTER set1 set2["b"]
有序集合ZADD key score member [score member ...]添加带分数的元素score: 分数
member: 元素
ZADD scores 90 "小明" 85 "小红"
ZRANGE scores 0 -1["小红", "小明"]
ZRANGE key start stop [WITHSCORES]按分数从小到大返回元素start, stop: 范围
WITHSCORES: 带分数
ZRANGE scores 0 1 WITHSCORES["小红", "85", "小明", "90"]
ZREM key member [member ...]移除有序集合元素可多个元素ZREM scores "小红" → 1
ZINCRBY key increment member增加元素的分数increment: 增量ZINCRBY scores 5 "小明" → 95
哈希HSET key field value [field value ...]设置哈希表字段值field: 字段
value: 值
HSET user:1 name "小明" age 18
HGET user:1 name → “小明”
HGET key field获取哈希表字段值field: 字段HGET user:1 age → “18”
HGETALL key返回哈希表所有字段和值HGETALL user:1["name", "小明", "age", "18"]
HDEL key field [field ...]删除哈希表字段可多个字段HDEL user:1 age → 1
事务/订阅MULTI / EXEC / DISCARD开启/执行/取消事务MULTI
SET a 1
SET b 2
EXEC
PUBLISH channel message向频道发布消息channel: 频道
message: 消息
PUBLISH news "新消息"
SUBSCRIBE channel [channel ...]订阅频道接收消息可多个频道SUBSCRIBE news
持久化/信息SAVE同步保存数据到磁盘SAVE → “OK”
BGSAVE异步保存数据到磁盘BGSAVE
INFO [section]查看Redis状态信息section: 可选(如MEMORY, KEYSPACE)INFO MEMORY
INFO KEYSPACE

说明:本文写作于Redis7发布后,所以在标题中加入了7这个标记作为区分,后面如Redis更新加入了新功能,本文可能就不适用,但也可作为参考,对于小于7的版本,本文也不保证完全适用,但只要不是太老的版本,基本问题不大。

第一部分:Redis入门基础

1. 什么是Redis?

  • Redis全称是 Remote Dictionary Server(远程字典服务器)。
  • 它是一个内存数据库,数据存储在内存中,所以读写速度非常快,比传统硬盘数据库(像MySQL)快很多。
  • 比喻:你可以把Redis想象成一个超级快的“记事本”,随时记东西、查东西。

2. Redis的特点

  • 速度快:因为数据在内存里,读写延迟几乎为0。
  • 键值对存储:数据以“键-值”(Key-Value)的形式保存,比如“name”对应“张三”。
  • 支持多种数据结构:不仅仅是简单的字符串,还支持列表、集合、哈希等。
  • 用途广泛:可以用作缓存、排行榜、会话存储,甚至简单队列。

3. 安装和启动Redis

  • 下载最新版Redis(官网 redis.io),Windows可以用WSL或虚拟机,Linux/Mac直接安装。
  • 启动命令:redis-server(启动服务端),redis-cli(进入客户端)。
  • 测试:输入PING,返回PONG,说明Redis跑起来了。

4. 最基本操作:键值对

  • 存数据SET key value,比如SET name "张三"
  • 取数据GET key,比如GET name,返回“张三”。
  • 删除数据DEL key,比如DEL name
  • 通俗理解:就像在手机通讯录里存名字和号码,随时查随时删。

第二部分:核心数据结构

Redis不仅仅是存字符串,它支持多种数据类型,理解这些是掌握Redis的关键。

1. 字符串(String)

  • 最简单的数据类型,就是键值对。
  • 示例:
    • SET age 18
    • GET age → “18”
  • 还能做数字操作:
    • INCR age → 19(自增1)
  • 用处:存用户ID、计数器(比如网站访问量)。

2. 列表(List)

  • 像一个有序的队列,可以从两端操作。
  • 示例:
    • LPUSH friends "小明"(左边加)
    • RPUSH friends "小红"(右边加)
    • LRANGE friends 0 -1 → [“小明”, “小红”]
  • 用处:消息队列、最新评论列表。

3. 集合(Set)

  • 无序、不重复的元素集合。
  • 示例:
    • SADD hobbies "跑步" "游泳"
    • SADD hobbies "跑步"(重复不会加)
    • SMEMBERS hobbies → [“跑步”, “游泳”]
  • 用处:去重,比如统计唯一访客。

4. 有序集合(Sorted Set)

  • 集合+分数,自动按分数排序。
  • 示例:
    • ZADD scores 90 "小明" 85 "小红"
    • ZRANGE scores 0 -1 → [“小红”, “小明”]
  • 用处:排行榜(比如游戏分数排名)。

5. 哈希(Hash)

  • 像一个小表格,存键值对的集合。
  • 示例:
    • HSET user1 name "小明" age 20
    • HGET user1 name → “小明”
  • 用处:存对象信息(比如用户信息)。

第三部分:进阶功能

1. 持久化

  • Redis是内存存储,但可以把数据保存到硬盘。
  • RDB:快照方式,定时保存内存数据到文件。
  • AOF:记录每条写操作日志,恢复更精确。
  • 配置:在redis.conf里设置,比如save 60 1000(60秒内1000次写就保存)。

2. 过期时间

  • 给键设置“保质期”,到期自动删除。
  • 示例:SETEX key 10 "value"(10秒后过期)
  • 用处:缓存临时数据,比如验证码。

3. 发布/订阅(Pub/Sub)

  • 像一个简单的广播系统。
  • 示例:
    • SUBSCRIBE channel1(订阅频道)
    • PUBLISH channel1 "hello"(发布消息)
  • 用处:实时消息通知。

4. 事务

  • 一组命令要么全执行,要么全失败。
  • 示例:
    • MULTI(开始事务)
    • SET a 1
    • SET b 2
    • EXEC(执行)
  • 用处:保证操作原子性。

第四部分:高级应用与优化

1. Redis集群(Cluster)

  • 把数据分散到多个节点,适合大数据量。
  • 配置:用redis-cli --cluster create创建。
  • 用处:高可用、大规模部署。

2. Lua脚本

  • 在Redis里运行自定义脚本。
  • 示例:EVAL "return redis.call('SET',KEYS[1],ARGV[1])" 1 key value
  • 用处:复杂逻辑处理。

3. 内存管理

  • Redis内存用满咋办?
    • 设置maxmemory(最大内存)
    • 配置淘汰策略:maxmemory-policy,比如LRU(最近最少使用)。

4. 最新特性(Redis 7.x)

  • Redis Functions:可以用脚本定义函数。
  • ACL改进:更细致的权限控制。
  • 性能优化:多线程I/O支持(配置io-threads)。

Redis在实际开发中的应用

1. 缓存(Cache)

  • 功能:把频繁访问的数据存在Redis中,减少直接查数据库的压力。
  • 例子:电商网站的用户信息(ID、用户名等),每次访问不用查MySQL,直接从Redis拿。
  • 实现
    • SET存:SET user:1 '{"id":1,"name":"小明"}'
    • GET取:GET user:1
    • 设置过期:EXPIRE user:1 3600(1小时后过期)
  • 好处:数据库压力降低,页面加载快。

2. 会话管理(Session Storage)

  • 功能:保存用户登录状态(Session),替代传统的服务器内存或Cookie。
  • 例子:用户登录后,把Session ID和用户信息存到Redis。
  • 实现
    • HSET session:abc123 user_id 1 login_time "2025-03-09"
    • 检查:HGET session:abc123 user_id
  • 好处:分布式系统下多个服务器共享Session,速度快。

3. 排行榜(Leaderboard)

  • 功能:用有序集合(Sorted Set)实现实时排名。
  • 例子:游戏分数排行榜,显示前10名玩家。
  • 实现
    • ZADD leaderboard 100 "小明" 90 "小红"
    • ZRANGE leaderboard 0 9 WITHSCORES(取前10名)
  • 好处:自动排序,查询超快。

4. 计数器(Counter)

  • 功能:统计访问量、点赞数等,原子操作保证准确。
  • 例子:文章的阅读量。
  • 实现
    • SET article:100:views 0
    • 每次访问:INCR article:100:views
  • 好处:高并发下不会出错。

5. 消息队列(Message Queue)

  • 功能:用列表(List)实现简单的任务队列。
  • 例子:后台任务处理,比如发送邮件。
  • 实现
    • 生产者:LPUSH tasks "send_email_to_user1"
    • 消费者:RPOP tasks
  • 好处:轻量级,适合简单场景(复杂场景用RabbitMQ/Kafka)。

6. 分布式锁(Distributed Lock)

  • 功能:防止多个进程同时操作同一资源。
  • 例子:抢购商品时,避免超卖。
  • 实现
    • 加锁:SET lock:product:1 "locked" NX EX 10(NX确保唯一,10秒过期)
    • 解锁:DEL lock:product:1
  • 好处:跨服务器同步,高并发安全。

7. 实时分析

  • 功能:用集合、HyperLogLog统计唯一数据。
  • 例子:统计网站日活跃用户(DAU)。
  • 实现
    • PFADD daily_users "user1" "user2"
    • PFCOUNT daily_users(估算唯一数)
  • 好处:内存占用小,速度快。

Redis与关系型数据库的搭配

关系型数据库(RDBMS)和Redis各有优劣,实际开发中通常是“互补”关系。以下是搭配的思路和具体方法:

1. 数据分工

  • 关系型数据库
    • 存储核心业务数据(订单、用户信息等)。
    • 处理复杂查询(多表联查、事务)。
    • 持久化存储,确保数据不丢。
  • Redis
    • 存热点数据(经常访问的子集)。
    • 处理高并发读写。
    • 临时数据(缓存、Session)。

2. 典型搭配模式

  • 缓存模式
    • 用户请求先查Redis,若没有(缓存未命中),再查数据库,然后把结果存到Redis。
    • 例子:查用户信息。
      1. GET user:1
      2. 如果没数据,SELECT * FROM users WHERE id=1,然后SET user:1 "结果" EX 3600
  • 写回模式
    • 数据先写Redis,再异步同步到数据库。
    • 例子:点赞数。
      1. INCR post:100:likes
      2. 定时任务把Redis的计数更新到MySQL。
  • 主从模式
    • 数据库存全量数据,Redis存增量或热点数据。
    • 例子:订单状态。
      • MySQL存完整订单表,Redis存“待支付”订单的ID集合(SADD pending_orders "order123")。

3. 实际案例

  • 电商系统
    • 商品详情页:MySQL存商品表,Redis缓存热门商品(用Hash存储)。
    • 库存扣减:Redis用分布式锁+计数器,成功后再更新MySQL。
  • 社交平台
    • 用户动态:MySQL存历史帖子,Redis用List存最新10条。
    • 关注列表:Redis用Set存每个用户的关注者。
  • 实时监控
    • 日志数据:MySQL存全量日志,Redis用Sorted Set存异常事件排行。

4. 注意事项

  • 一致性:Redis和数据库可能不同步,比如缓存过期或更新延迟。解决办法:
    • 设置合理过期时间。
    • 更新数据库后主动删除Redis缓存(DEL key),下次查时重新加载。
  • 内存管理:Redis内存有限,需设置maxmemory和淘汰策略(LRU等)。
  • 事务需求:复杂事务还是交给数据库,Redis的事务(MULTI/EXEC)功能较弱。

Redis多数据库的特点

Redis默认提供16个数据库(编号从0到15),这些数据库是通过SELECT命令切换的逻辑隔离空间,类似于一个Redis实例内的“命名空间”。

  1. 逻辑隔离
    • 每个数据库有独立的键空间,比如在数据库0里SET key1 "value1",数据库1里看不到这个键。
    • 比喻:16个数据库就像16个不同的笔记本,内容互不干扰。
  2. 共享实例
    • 所有数据库共享同一个Redis实例的内存和性能资源,不是物理隔离。
    • 也就是说,16个数据库加起来不能超过实例的总内存(比如maxmemory设为10GB)。
  3. 默认配置
    • Redis配置文件(redis.conf)里databases 16定义了数量,可以改(比如改成32,但重启生效)。
    • 默认使用数据库0:SELECT 0

开发中如何分配16个数据库

Redis的多数据库功能在实际开发中用得不多,尤其是集群模式下(集群只支持数据库0)。但在单机或主从模式下,合理分配可以简化开发。

原则1:按业务模块划分

  • 思路:不同业务用不同数据库,避免键名冲突,逻辑清晰。
  • 例子
    • 数据库0:用户数据(user:1:name
    • 数据库1:订单数据(order:1001:status
    • 数据库2:商品缓存(product:2001:price
  • 好处:业务隔离,调试时切换数据库就能聚焦某个模块。
  • 注意:键名最好带前缀(比如user:),防止误操作。

原则2:按环境或租户划分

  • 思路:开发、测试、生产环境,或者多租户系统,用不同数据库区分。
  • 例子
    • 数据库0:开发环境
    • 数据库1:测试环境
    • 数据库2:生产环境
    • 或者按客户:数据库0给客户A,数据库1给客户B。
  • 好处:一套Redis实例支持多个场景,节省资源。
  • 注意:生产中不建议这样,建议用独立实例保证隔离。

原则3:按数据类型或功能划分

  • 思路:不同数据结构或功能用不同数据库,便于管理和优化。
  • 例子
    • 数据库0:字符串(缓存)
    • 数据库1:列表(队列)
    • 数据库2:有序集合(排行榜)
    • 数据库3:哈希(对象存储)
  • 好处:数据类型集中,方便统计和清理。
  • 注意:实际中很少这样分,因为类型混合使用更常见。

原则4:按临时性和持久性划分

  • 思路:临时数据和持久数据分开,方便设置过期策略。
  • 例子
    • 数据库0:缓存数据(加EXPIRE,比如1小时)
    • 数据库1:长期数据(不设过期,比如配置信息)
  • 好处:清理时只针对某个数据库(FLUSHDB)。

开发中的最佳实践

  • 小项目:只用数据库0,靠键前缀区分一切。
  • 中型项目:用2-3个数据库,比如缓存用0,队列用1,配置用2。
  • 大项目:放弃多数据库,用多个Redis实例或云服务集群,配合服务发现。

Redis开发注意事项

1. 内存管理

  • 问题:Redis是内存数据库,内存用满会导致数据被淘汰或服务崩溃。
  • 注意事项
    1. 设置最大内存限制
      • 配置maxmemory(如maxmemory 2gb),防止占用全部服务器内存。
      • 操作:编辑redis.conf或用CONFIG SET maxmemory 2gb
    2. 合理设置过期时间
      • EXPIRESETEX给临时数据设过期,避免长期占用内存。
      • 示例:SETEX session:123 3600 "user_data"(1小时后自动删除)。
    3. 选择合适的淘汰策略
      • 默认noeviction(满时拒绝写入),可改成allkeys-lru(淘汰最近最少使用)。
      • 操作:CONFIG SET maxmemory-policy allkeys-lru
    4. 监控内存使用
      • INFO MEMORY检查used_memory,及时调整。
  • 好处:防止内存不够用,保持服务稳定。

2. 键名设计

  • 问题:键名混乱会导致冲突或难以管理。
  • 注意事项
    1. 用前缀区分业务
      • user:1:nameorder:1001:status,避免命名冲突。
    2. 保持键名简洁
      • 太长(如very_long_user_key_123)浪费内存,建议简短有意义。
    3. 避免滥用KEYS
      • KEYS *扫描所有键性能差,用SCAN替代。
      • 示例:SCAN 0 MATCH user:* COUNT 10(分批查找)。
  • 好处:键名清晰,查找高效,节省空间。

3. 数据结构选择

  • 问题:用错数据结构会增加复杂度或浪费资源。
  • 注意事项
    1. 根据场景选类型
      • 缓存用字符串(SET/GET),队列用列表(LPUSH/RPOP),排行榜用有序集合(ZADD)。
    2. 避免大数据量操作
      • 列表过长(如百万元素)会导致LRANGE变慢,考虑分片或用其他存储。
    3. 合理序列化
      • 存对象时用JSON或Protobuf,别直接存大字符串。
      • 示例:SET user:1 '{"id":1,"name":"小明"}'
  • 好处:性能最优,内存利用率高。

4. 高并发操作

  • 问题:高并发下可能出现竞争或性能瓶颈。
  • 注意事项
    1. 使用原子操作
      • INCRHINCRBY做计数器,避免竞争条件。
      • 示例:INCR article:100:views
    2. 分布式锁
      • SET key value NX EX 10实现锁,防止多线程冲突。
      • 示例:抢购库存时加锁。
    3. 批量操作
      • MSET/MGET代替多次SET/GET,减少网络开销。
      • 示例:MSET k1 v1 k2 v2
  • 好处:保证数据正确性,提升吞吐量。

5. 持久化和数据安全

  • 问题:Redis内存数据易丢失,需确保持久化。
  • 注意事项
    1. 开启持久化
      • RDB(快照):save 60 1000(60秒1000次写保存)。
      • AOF(日志):appendonly yes,记录每条写操作。
    2. 定期备份
      • BGSAVE生成RDB文件,存到安全位置。
    3. 避免数据丢失
      • 主从模式下用WAIT确保同步:WAIT 1 1000(1个从节点,1秒内同步)。
  • 好处:宕机后能恢复数据,业务更可靠。

6. 性能优化

  • 问题:不合理操作会拖慢Redis。
  • 注意事项
    1. 避免慢查询
      • KEYSSMEMBERS(大数据量时)很慢,用SCAN或分批取。
    2. 合理使用事务
      • MULTI/EXEC不要包太多命令,影响吞吐量。
      • 示例:MULTI
        SET a 1
        EXEC
    3. 连接池管理
      • 客户端(如Jedis)用连接池,避免频繁创建连接。
  • 好处:响应更快,抗压能力强。

7. 集群模式注意

  • 问题:集群下部分命令行为不同。
  • 注意事项
    1. 只用数据库0
      • 集群模式不支持多数据库(SELECT 1无效)。
    2. 多键操作限制
      • MSETMGET要求键在同一槽,否则失败。
      • 解决:用{hash_tag},如MSET {user}:1 a {user}:2 b
    3. 客户端兼容
      • 用支持集群的客户端(如redis-cli -c)。
  • 好处:集群运行稳定,避免踩坑。

8. 数据一致性

  • 问题:Redis与数据库同步可能不一致。
  • 注意事项
    1. 缓存更新策略
      • 更新数据库后删Redis缓存(DEL key),下次查重新加载。
    2. 避免缓存穿透
      • 查不到的数据存空值:SET key "null" EX 60
    3. 读写分离同步
      • 主从模式下关键数据读主节点。
  • 好处:减少脏数据,用户体验好。

9. 监控和调试

  • 问题:问题发生时难以定位。
  • 注意事项
    1. 定期检查状态
      • INFO ALL看内存、连接数、慢查询。
    2. 慢查询日志
      • 配置slowlog-log-slower-than 10000(10ms以上记录)。
      • 查看:SLOWLOG GET
    3. 告警机制
      • 用工具(如Prometheus)监控QPS、延迟。
  • 好处:及时发现问题,优化有的放矢。

总结

方面核心注意点操作建议
内存管理防止内存溢出设置maxmemory、用EXPIRE
键名设计清晰、高效加前缀、避免KEYS
数据结构选对类型,控制大小场景匹配、分片存储
高并发避免竞争,提升效率用原子操作、批量命令
持久化防止数据丢失开启AOF、定期BGSAVE
性能优化减少慢操作少用KEYS、优化事务
集群模式兼容性问题用数据库0、hash tag
数据一致性缓存与数据库同步更新后删缓存、防穿透
监控调试及时发现问题INFOSLOWLOG监控

实践建议

  • 入门:先关注内存(maxmemory+过期)和键名规范。
  • 进阶:优化高并发(锁+批量)和持久化配置。
  • 排查:用INFOSLOWLOG分析瓶颈。