Redis7 快速入门
以下是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 → 1EXISTS 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 | 键值(数字)加1 | 无 | SET count 10 INCR count → 11 |
DECR key | 键值(数字)减1 | 无 | SET 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。
- 例子:查用户信息。
GET user:1
- 如果没数据,
SELECT * FROM users WHERE id=1
,然后SET user:1 "结果" EX 3600
- 写回模式:
- 数据先写Redis,再异步同步到数据库。
- 例子:点赞数。
INCR post:100:likes
- 定时任务把Redis的计数更新到MySQL。
- 主从模式:
- 数据库存全量数据,Redis存增量或热点数据。
- 例子:订单状态。
- MySQL存完整订单表,Redis存“待支付”订单的ID集合(
SADD pending_orders "order123"
)。
- MySQL存完整订单表,Redis存“待支付”订单的ID集合(
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实例内的“命名空间”。
- 逻辑隔离:
- 每个数据库有独立的键空间,比如在数据库0里
SET key1 "value1"
,数据库1里看不到这个键。 - 比喻:16个数据库就像16个不同的笔记本,内容互不干扰。
- 每个数据库有独立的键空间,比如在数据库0里
- 共享实例:
- 所有数据库共享同一个Redis实例的内存和性能资源,不是物理隔离。
- 也就是说,16个数据库加起来不能超过实例的总内存(比如
maxmemory
设为10GB)。
- 默认配置:
- Redis配置文件(
redis.conf
)里databases 16
定义了数量,可以改(比如改成32,但重启生效)。 - 默认使用数据库0:
SELECT 0
。
- Redis配置文件(
开发中如何分配16个数据库
Redis的多数据库功能在实际开发中用得不多,尤其是集群模式下(集群只支持数据库0)。但在单机或主从模式下,合理分配可以简化开发。
原则1:按业务模块划分
- 思路:不同业务用不同数据库,避免键名冲突,逻辑清晰。
- 例子:
- 数据库0:用户数据(
user:1:name
) - 数据库1:订单数据(
order:1001:status
) - 数据库2:商品缓存(
product:2001:price
)
- 数据库0:用户数据(
- 好处:业务隔离,调试时切换数据库就能聚焦某个模块。
- 注意:键名最好带前缀(比如
user:
),防止误操作。
原则2:按环境或租户划分
- 思路:开发、测试、生产环境,或者多租户系统,用不同数据库区分。
- 例子:
- 数据库0:开发环境
- 数据库1:测试环境
- 数据库2:生产环境
- 或者按客户:数据库0给客户A,数据库1给客户B。
- 好处:一套Redis实例支持多个场景,节省资源。
- 注意:生产中不建议这样,建议用独立实例保证隔离。
原则3:按数据类型或功能划分
- 思路:不同数据结构或功能用不同数据库,便于管理和优化。
- 例子:
- 数据库0:字符串(缓存)
- 数据库1:列表(队列)
- 数据库2:有序集合(排行榜)
- 数据库3:哈希(对象存储)
- 好处:数据类型集中,方便统计和清理。
- 注意:实际中很少这样分,因为类型混合使用更常见。
原则4:按临时性和持久性划分
- 思路:临时数据和持久数据分开,方便设置过期策略。
- 例子:
- 数据库0:缓存数据(加
EXPIRE
,比如1小时) - 数据库1:长期数据(不设过期,比如配置信息)
- 数据库0:缓存数据(加
- 好处:清理时只针对某个数据库(
FLUSHDB
)。
开发中的最佳实践
- 小项目:只用数据库0,靠键前缀区分一切。
- 中型项目:用2-3个数据库,比如缓存用0,队列用1,配置用2。
- 大项目:放弃多数据库,用多个Redis实例或云服务集群,配合服务发现。
Redis开发注意事项
1. 内存管理
- 问题:Redis是内存数据库,内存用满会导致数据被淘汰或服务崩溃。
- 注意事项:
- 设置最大内存限制:
- 配置
maxmemory
(如maxmemory 2gb
),防止占用全部服务器内存。 - 操作:编辑
redis.conf
或用CONFIG SET maxmemory 2gb
。
- 配置
- 合理设置过期时间:
- 用
EXPIRE
或SETEX
给临时数据设过期,避免长期占用内存。 - 示例:
SETEX session:123 3600 "user_data"
(1小时后自动删除)。
- 用
- 选择合适的淘汰策略:
- 默认
noeviction
(满时拒绝写入),可改成allkeys-lru
(淘汰最近最少使用)。 - 操作:
CONFIG SET maxmemory-policy allkeys-lru
。
- 默认
- 监控内存使用:
- 用
INFO MEMORY
检查used_memory
,及时调整。
- 用
- 设置最大内存限制:
- 好处:防止内存不够用,保持服务稳定。
2. 键名设计
- 问题:键名混乱会导致冲突或难以管理。
- 注意事项:
- 用前缀区分业务:
- 如
user:1:name
、order:1001:status
,避免命名冲突。
- 如
- 保持键名简洁:
- 太长(如
very_long_user_key_123
)浪费内存,建议简短有意义。
- 太长(如
- 避免滥用
KEYS
:KEYS *
扫描所有键性能差,用SCAN
替代。- 示例:
SCAN 0 MATCH user:* COUNT 10
(分批查找)。
- 用前缀区分业务:
- 好处:键名清晰,查找高效,节省空间。
3. 数据结构选择
- 问题:用错数据结构会增加复杂度或浪费资源。
- 注意事项:
- 根据场景选类型:
- 缓存用字符串(
SET
/GET
),队列用列表(LPUSH
/RPOP
),排行榜用有序集合(ZADD
)。
- 缓存用字符串(
- 避免大数据量操作:
- 列表过长(如百万元素)会导致
LRANGE
变慢,考虑分片或用其他存储。
- 列表过长(如百万元素)会导致
- 合理序列化:
- 存对象时用JSON或Protobuf,别直接存大字符串。
- 示例:
SET user:1 '{"id":1,"name":"小明"}'
。
- 根据场景选类型:
- 好处:性能最优,内存利用率高。
4. 高并发操作
- 问题:高并发下可能出现竞争或性能瓶颈。
- 注意事项:
- 使用原子操作:
- 如
INCR
、HINCRBY
做计数器,避免竞争条件。 - 示例:
INCR article:100:views
。
- 如
- 分布式锁:
- 用
SET key value NX EX 10
实现锁,防止多线程冲突。 - 示例:抢购库存时加锁。
- 用
- 批量操作:
- 用
MSET
/MGET
代替多次SET
/GET
,减少网络开销。 - 示例:
MSET k1 v1 k2 v2
。
- 用
- 使用原子操作:
- 好处:保证数据正确性,提升吞吐量。
5. 持久化和数据安全
- 问题:Redis内存数据易丢失,需确保持久化。
- 注意事项:
- 开启持久化:
- RDB(快照):
save 60 1000
(60秒1000次写保存)。 - AOF(日志):
appendonly yes
,记录每条写操作。
- RDB(快照):
- 定期备份:
- 用
BGSAVE
生成RDB文件,存到安全位置。
- 用
- 避免数据丢失:
- 主从模式下用
WAIT
确保同步:WAIT 1 1000
(1个从节点,1秒内同步)。
- 主从模式下用
- 开启持久化:
- 好处:宕机后能恢复数据,业务更可靠。
6. 性能优化
- 问题:不合理操作会拖慢Redis。
- 注意事项:
- 避免慢查询:
KEYS
、SMEMBERS
(大数据量时)很慢,用SCAN
或分批取。
- 合理使用事务:
MULTI
/EXEC
不要包太多命令,影响吞吐量。- 示例:
MULTI
SET a 1
EXEC
。
- 连接池管理:
- 客户端(如Jedis)用连接池,避免频繁创建连接。
- 避免慢查询:
- 好处:响应更快,抗压能力强。
7. 集群模式注意
- 问题:集群下部分命令行为不同。
- 注意事项:
- 只用数据库0:
- 集群模式不支持多数据库(
SELECT 1
无效)。
- 集群模式不支持多数据库(
- 多键操作限制:
MSET
、MGET
要求键在同一槽,否则失败。- 解决:用
{hash_tag}
,如MSET {user}:1 a {user}:2 b
。
- 客户端兼容:
- 用支持集群的客户端(如
redis-cli -c
)。
- 用支持集群的客户端(如
- 只用数据库0:
- 好处:集群运行稳定,避免踩坑。
8. 数据一致性
- 问题:Redis与数据库同步可能不一致。
- 注意事项:
- 缓存更新策略:
- 更新数据库后删Redis缓存(
DEL key
),下次查重新加载。
- 更新数据库后删Redis缓存(
- 避免缓存穿透:
- 查不到的数据存空值:
SET key "null" EX 60
。
- 查不到的数据存空值:
- 读写分离同步:
- 主从模式下关键数据读主节点。
- 缓存更新策略:
- 好处:减少脏数据,用户体验好。
9. 监控和调试
- 问题:问题发生时难以定位。
- 注意事项:
- 定期检查状态:
INFO ALL
看内存、连接数、慢查询。
- 慢查询日志:
- 配置
slowlog-log-slower-than 10000
(10ms以上记录)。 - 查看:
SLOWLOG GET
。
- 配置
- 告警机制:
- 用工具(如Prometheus)监控QPS、延迟。
- 定期检查状态:
- 好处:及时发现问题,优化有的放矢。
总结
方面 | 核心注意点 | 操作建议 |
---|---|---|
内存管理 | 防止内存溢出 | 设置maxmemory 、用EXPIRE |
键名设计 | 清晰、高效 | 加前缀、避免KEYS |
数据结构 | 选对类型,控制大小 | 场景匹配、分片存储 |
高并发 | 避免竞争,提升效率 | 用原子操作、批量命令 |
持久化 | 防止数据丢失 | 开启AOF、定期BGSAVE |
性能优化 | 减少慢操作 | 少用KEYS 、优化事务 |
集群模式 | 兼容性问题 | 用数据库0、hash tag |
数据一致性 | 缓存与数据库同步 | 更新后删缓存、防穿透 |
监控调试 | 及时发现问题 | 用INFO 、SLOWLOG 监控 |
实践建议
- 入门:先关注内存(
maxmemory
+过期)和键名规范。 - 进阶:优化高并发(锁+批量)和持久化配置。
- 排查:用
INFO
和SLOWLOG
分析瓶颈。