1. Redis简介与核心特性
Redis(Remote Dictionary Server)是一个开源的、基于内存的键值存储系统,由Salvatore Sanfilippo在2009年开发。它不仅仅是一个简单的键值存储,还提供了丰富的数据结构和功能,使其成为现代应用架构中不可或缺的组件。
1.1 Redis的核心优势
Redis之所以广受欢迎,主要得益于以下几个关键特性:
- 内存存储:所有数据都存储在内存中,读写速度极快,通常能达到每秒10万次以上的操作
- 持久化支持:虽然主要基于内存,但提供了RDB(快照)和AOF(追加日志)两种持久化机制
- 多种数据结构:不仅支持简单的字符串,还支持列表、集合、有序集合、哈希、位图等复杂结构
- 原子操作:所有操作都是原子性的,保证了并发环境下的数据一致性
- 发布/订阅:内置消息传递系统,支持发布/订阅模式
- Lua脚本:支持使用Lua脚本执行复杂操作
- 高可用与集群:支持主从复制和集群模式
1.2 Redis的典型应用场景
Redis在现代应用开发中有着广泛的应用:
- 缓存系统:最常见的用途,显著减轻数据库负载
- 会话存储:存储用户会话信息,支持分布式系统
- 排行榜/计数器:利用有序集合实现实时排名
- 消息队列:使用列表结构实现简单的消息队列
- 实时分析:处理实时数据,如统计、限流等
- 地理空间索引:支持地理位置相关的查询
提示:虽然Redis功能强大,但它并非适用于所有场景。对于需要复杂事务或关系型查询的应用,传统数据库可能更合适。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. Redis安装指南
Redis支持多种操作系统和安装方式,下面我们将详细介绍在不同环境下的安装方法。
2.1 Linux系统安装
在Linux系统上安装Redis是最常见的做法,以下是详细步骤:
-
更新系统包:
bash复制sudo apt update && sudo apt upgrade -y -
安装依赖:
bash复制sudo apt install build-essential tcl -y -
下载Redis源码:
bash复制wget https://download.redis.io/redis-stable.tar.gz tar xzf redis-stable.tar.gz cd redis-stable -
编译安装:
bash复制make make test # 可选,运行测试套件 sudo make install -
配置Redis:
bash复制sudo mkdir /etc/redis sudo cp redis.conf /etc/redis -
创建系统服务:
创建/etc/systemd/system/redis.service文件,内容如下:code复制[Unit] Description=Redis In-Memory Data Store After=network.target [Service] User=redis Group=redis ExecStart=/usr/local/bin/redis-server /etc/redis/redis.conf ExecStop=/usr/local/bin/redis-cli shutdown Restart=always [Install] WantedBy=multi-user.target -
创建Redis用户并设置权限:
bash复制sudo adduser --system --group --no-create-home redis sudo mkdir /var/lib/redis sudo chown redis:redis /var/lib/redis sudo chmod 770 /var/lib/redis -
启动Redis服务:
bash复制sudo systemctl enable redis sudo systemctl start redis
2.2 Windows系统安装
虽然Redis官方不直接支持Windows,但可以通过以下方式安装:
-
使用WSL(推荐):
- 启用WSL功能
- 安装Ubuntu子系统
- 按照上述Linux安装步骤操作
-
使用Microsoft维护的Redis版本:
- 下载地址:https://github.com/microsoftarchive/redis/releases
- 下载.msi安装包并运行安装向导
-
使用Docker:
bash复制
docker run --name some-redis -d redis
2.3 macOS系统安装
在macOS上可以通过Homebrew轻松安装Redis:
-
安装Homebrew(如未安装):
bash复制/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" -
安装Redis:
bash复制
brew install redis -
启动Redis服务:
bash复制
brew services start redis -
验证安装:
bash复制
redis-cli ping如果返回"PONG"则表示安装成功。
3. Redis配置详解
正确配置Redis对于生产环境至关重要。下面我们深入解析Redis的核心配置项。
3.1 基本配置
打开Redis配置文件(通常位于/etc/redis/redis.conf),以下是一些关键配置项:
-
网络相关:
conf复制bind 127.0.0.1 # 绑定IP地址 port 6379 # 监听端口 protected-mode yes # 保护模式 -
通用配置:
conf复制daemonize yes # 以守护进程运行 supervised systemd # 使用systemd管理 pidfile /var/run/redis_6379.pid # PID文件位置 logfile /var/log/redis/redis.log # 日志文件位置 databases 16 # 数据库数量 -
内存管理:
conf复制maxmemory 2gb # 最大内存限制 maxmemory-policy allkeys-lru # 内存满时的淘汰策略
3.2 持久化配置
Redis提供两种持久化方式:
-
RDB(快照):
conf复制save 900 1 # 900秒内至少有1个键被改动则保存 save 300 10 # 300秒内至少有10个键被改动则保存 save 60 10000 # 60秒内至少有10000个键被改动则保存 stop-writes-on-bgsave-error yes # 保存出错时停止写入 rdbcompression yes # 压缩RDB文件 dbfilename dump.rdb # RDB文件名 dir /var/lib/redis # 工作目录 -
AOF(追加日志):
conf复制appendonly yes # 启用AOF appendfilename "appendonly.aof" # AOF文件名 appendfsync everysec # 同步频率 no-appendfsync-on-rewrite no # 重写时是否同步 auto-aof-rewrite-percentage 100 # 增长百分比触发重写 auto-aof-rewrite-min-size 64mb # 最小大小触发重写
3.3 安全配置
-
密码认证:
conf复制requirepass yourstrongpassword # 设置访问密码 -
命令重命名:
conf复制rename-command FLUSHDB "" # 禁用命令 rename-command FLUSHALL "" # 禁用命令 rename-command CONFIG "CONFIG_MYAPP" # 重命名命令 -
网络限制:
conf复制maxclients 10000 # 最大客户端连接数 tcp-backlog 511 # TCP连接队列长度
4. Redis基本使用
安装配置完成后,让我们开始使用Redis。Redis提供了丰富的命令集,下面分类介绍常用命令。
4.1 连接Redis
-
命令行连接:
bash复制redis-cli # 本地连接 redis-cli -h host -p port -a password # 远程连接 -
测试连接:
bash复制ping # 应返回PONG -
切换数据库:
bash复制select 1 # 切换到数据库1(0-15)
4.2 键操作
-
基本操作:
bash复制set key value # 设置键值 get key # 获取值 exists key # 检查键是否存在 del key # 删除键 keys pattern # 查找键(生产环境慎用) -
过期时间:
bash复制expire key seconds # 设置过期时间 ttl key # 查看剩余时间 persist key # 移除过期时间
4.3 数据结构操作
-
字符串:
bash复制set counter 100 incr counter # 自增1 decr counter # 自减1 incrby counter 10 # 增加指定值 -
哈希:
bash复制hset user:1000 name "John" age 30 hget user:1000 name hgetall user:1000 -
列表:
bash复制
lpush mylist a rpush mylist b lrange mylist 0 -1 -
集合:
bash复制sadd myset a b c smembers myset sinter set1 set2 # 交集 -
有序集合:
bash复制zadd leaderboard 100 "player1" zrange leaderboard 0 -1 withscores
4.4 高级功能
-
事务:
bash复制multi set a 10 set b 20 exec -
Lua脚本:
bash复制eval "return redis.call('get', KEYS[1])" 1 mykey -
发布/订阅:
bash复制# 终端1 subscribe mychannel # 终端2 publish mychannel "hello"
5. Redis持久化与备份
Redis提供了两种主要的持久化机制,理解它们的工作原理对于数据安全至关重要。
5.1 RDB持久化
RDB(Redis Database)是Redis的默认持久化方式,它会在指定时间间隔内生成数据集的快照。
工作原理:
- Redis fork一个子进程
- 子进程将数据集写入临时RDB文件
- 写入完成后替换旧的RDB文件
优点:
- 紧凑的单一文件,适合备份
- 恢复大数据集时比AOF快
- 最大化Redis性能(父进程不需要磁盘I/O)
缺点:
- 可能丢失最后一次保存后的数据
- 大数据集时fork可能耗时较长
配置建议:
conf复制save 900 1
save 300 10
save 60 10000
dbfilename dump.rdb
dir /var/lib/redis
5.2 AOF持久化
AOF(Append Only File)记录每个写操作到日志文件,重启时重新执行这些命令来恢复数据。
工作原理:
- 每个写命令追加到AOF缓冲区
- 根据配置同步到磁盘(always/everysec/no)
- 定期重写AOF文件以压缩体积
优点:
- 更高的数据安全性(最多丢失1秒数据)
- 可读的日志文件,便于分析
- 自动处理日志过大问题(重写)
缺点:
- 文件通常比RDB大
- 恢复速度比RDB慢
- 写负载高时可能影响性能
配置建议:
conf复制appendonly yes
appendfsync everysec
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
5.3 备份策略
-
定期备份RDB文件:
bash复制cp /var/lib/redis/dump.rdb /backup/redis-$(date +%F).rdb -
启用AOF作为额外保障:
conf复制appendonly yes appendfsync everysec -
测试恢复流程:
- 定期在测试环境恢复备份文件
- 验证数据完整性和一致性
-
异地备份:
- 将备份文件复制到其他服务器或云存储
- 考虑使用scp、rsync或云存储CLI工具
注意:永远不要只依赖一种备份方式。理想情况下应该同时使用RDB和AOF,并定期验证备份的有效性。
6. Redis性能优化
Redis虽然以高性能著称,但在生产环境中仍需要适当的调优才能发挥最佳性能。
6.1 内存优化
-
使用适当的数据结构:
- 小数据使用字符串
- 对象存储使用哈希
- 频繁更新的计数器使用字符串+INCR
- 排行榜使用有序集合
-
内存分配策略:
conf复制maxmemory 4gb # 设置为可用内存的3/4 maxmemory-policy allkeys-lru # 根据场景选择策略 -
使用内存优化配置:
conf复制hash-max-ziplist-entries 512 hash-max-ziplist-value 64 list-max-ziplist-size -2
6.2 网络优化
-
连接池配置:
- 客户端使用连接池
- 合理设置连接池大小(通常50-200)
-
管道技术:
bash复制(echo -en "PING\r\nPING\r\nPING\r\n"; sleep 1) | nc localhost 6379 -
批量操作:
- 使用MSET代替多个SET
- 使用HMSET代替多个HSET
6.3 系统级优化
-
透明大页禁用:
bash复制echo never > /sys/kernel/mm/transparent_hugepage/enabled -
内存分配器选择:
conf复制# 在redis.conf中 # 通常jemalloc表现更好 -
TCP优化:
conf复制# 在/etc/sysctl.conf中 net.core.somaxconn = 65535 vm.overcommit_memory = 1
6.4 监控与诊断
-
内置命令:
bash复制info # 查看所有信息 info memory # 内存信息 info stats # 统计信息 slowlog get # 慢查询日志 -
监控工具:
- redis-cli --stat
- redis-benchmark
- 第三方工具如RedisInsight
-
关键指标监控:
- 内存使用率
- 命中率(keyspace_hits/(keyspace_hits+keyspace_misses))
- 延迟(latency monitor)
- 连接数
7. Redis安全实践
在生产环境中运行Redis需要特别注意安全性,以下是关键的安全实践。
7.1 基本安全措施
-
密码保护:
conf复制requirepass yourstrongpassword -
网络隔离:
- 绑定到内网IP
- 使用防火墙限制访问
bash复制
iptables -A INPUT -p tcp --dport 6379 -s 192.168.1.0/24 -j ACCEPT iptables -A INPUT -p tcp --dport 6379 -j DROP -
禁用危险命令:
conf复制rename-command FLUSHDB "" rename-command FLUSHALL "" rename-command CONFIG "CONFIG_MYAPP"
7.2 高级安全配置
-
TLS加密:
conf复制tls-port 6379 tls-cert-file /path/to/redis.crt tls-key-file /path/to/redis.key tls-ca-cert-file /path/to/ca.crt -
ACL(访问控制列表):
bash复制ACL SETUSER alice on >password ~cached:* +get +set -
保护模式:
conf复制protected-mode yes
7.3 安全审计
-
日志监控:
- 监控认证失败日志
- 监控异常命令执行
-
定期审计:
bash复制redis-cli --scan --pattern '*' | sort # 列出所有键(生产环境慎用) -
漏洞扫描:
- 定期检查Redis版本漏洞
- 及时升级到最新稳定版
8. Redis高可用与集群
对于生产环境,单节点Redis通常无法满足可用性和扩展性需求,需要配置高可用方案。
8.1 主从复制
-
配置主从:
- 主节点无需特殊配置
- 从节点配置:
conf复制replicaof 192.168.1.100 6379 masterauth yourpassword
-
复制原理:
- 全量同步:从节点初次连接时执行
- 部分同步:断线重连后执行
-
监控复制状态:
bash复制
info replication
8.2 Redis Sentinel
Sentinel提供自动故障转移功能:
-
配置Sentinel:
conf复制sentinel monitor mymaster 127.0.0.1 6379 2 sentinel auth-pass mymaster yourpassword sentinel down-after-milliseconds mymaster 5000 sentinel failover-timeout mymaster 60000 -
启动Sentinel:
bash复制
redis-sentinel /path/to/sentinel.conf -
客户端集成:
- 客户端应支持Sentinel协议
- 自动发现主节点变化
8.3 Redis Cluster
Redis Cluster提供数据分片和高可用:
-
集群配置:
conf复制cluster-enabled yes cluster-config-file nodes-6379.conf cluster-node-timeout 5000 -
创建集群:
bash复制
redis-cli --cluster create 192.168.1.101:6379 192.168.1.102:6379 \ 192.168.1.103:6379 192.168.1.104:6379 \ 192.168.1.105:6379 192.168.1.106:6379 \ --cluster-replicas 1 -
集群操作:
bash复制redis-cli -c # 集群模式连接 cluster info # 集群信息 cluster nodes # 节点信息
9. Redis客户端与可视化工具
选择合适的客户端工具可以大大提高Redis的使用效率。
9.1 命令行客户端
-
redis-cli基本用法:
bash复制
redis-cli -h host -p port -a password -
批量操作:
bash复制cat commands.txt | redis-cli --pipe -
交互模式:
bash复制redis-cli 127.0.0.1:6379> monitor # 监控所有命令
9.2 图形化管理工具
-
RedisInsight(官方工具):
- 支持Windows/macOS/Linux
- 提供可视化监控、CLI、内存分析
-
Another Redis Desktop Manager:
- 开源跨平台工具
- 支持集群、哨兵模式
-
Redisson(Java客户端):
- 支持分布式对象和服务
- 内置多种分布式数据结构
9.3 编程语言客户端
-
Python - redis-py:
python复制import redis r = redis.Redis(host='localhost', port=6379, db=0) r.set('foo', 'bar') print(r.get('foo')) -
Java - Jedis:
java复制Jedis jedis = new Jedis("localhost"); jedis.set("foo", "bar"); String value = jedis.get("foo"); -
Node.js - ioredis:
javascript复制const Redis = require('ioredis'); const redis = new Redis(); redis.set('foo', 'bar'); redis.get('foo').then(console.log);
10. Redis常见问题与解决方案
在实际使用Redis过程中,会遇到各种问题,下面总结一些常见问题及其解决方案。
10.1 性能问题
-
高延迟:
- 检查
slowlog找出慢查询 - 优化大键操作(拆分或使用更合适的数据结构)
- 检查网络延迟
- 检查
-
内存不足:
- 检查
maxmemory设置 - 优化数据结构(如使用哈希代替多个键)
- 考虑启用集群分片
- 检查
-
CPU使用率高:
- 检查是否有大量过期键(可能导致主动过期占用CPU)
- 监控
INFO commandstats找出热点命令
10.2 数据一致性问题
-
主从不一致:
- 检查复制延迟(
INFO replication中的lag) - 考虑使用WAIT命令确保写入同步
bash复制WAIT 1 1000 # 等待1个副本,最多1000毫秒 - 检查复制延迟(
-
事务中的竞争条件:
- 使用WATCH实现乐观锁
bash复制
WATCH mykey MULTI SET mykey newvalue EXEC
10.3 运维问题
-
持久化导致服务暂停:
- 对于大内存实例,考虑关闭RDB或减少保存频率
- 使用AOF并配置
appendfsync everysec
-
启动失败:
- 检查日志文件中的错误信息
- 常见问题包括:
- 内存不足(检查
vm.overcommit_memory) - 持久化文件损坏(可以尝试删除或修复)
- 内存不足(检查
-
连接数过多:
- 检查
maxclients设置 - 优化客户端连接池配置
- 使用
CLIENT LIST和CLIENT KILL管理连接
- 检查
10.4 升级与迁移
-
版本升级:
- 先升级从节点,然后主节点
- 测试新版本兼容性
- 注意配置变更(如
slave改为replica)
-
数据迁移:
- 使用
MIGRATE命令
bash复制MIGRATE newhost 6379 "" 0 5000 KEYS key1 key2- 或使用
redis-dump/redis-restore工具
- 使用
-
集群扩容:
bash复制
redis-cli --cluster add-node new_node:6379 existing_node:6379 redis-cli --cluster reshard existing_node:6379
11. Redis最佳实践
基于多年Redis使用经验,总结以下最佳实践,帮助您更高效、安全地使用Redis。
11.1 键命名规范
-
结构化命名:
- 使用冒号分隔层级:
user:1000:profile - 保持一致性:如全部小写或驼峰式
- 使用冒号分隔层级:
-
避免大键:
- 单个键值不应超过1MB
- 大哈希可以拆分为多个小哈希
-
设置合理的TTL:
- 为缓存数据设置过期时间
- 避免大量键同时过期(导致延迟峰值)
11.2 生产环境配置
-
基本配置:
conf复制daemonize yes supervised systemd protected-mode yes requirepass strongpassword -
内存配置:
conf复制maxmemory 16gb # 根据实际情况调整 maxmemory-policy volatile-lru -
持久化配置:
conf复制appendonly yes appendfsync everysec
11.3 监控与告警
-
关键指标:
- 内存使用率
- 命中率
- 延迟
- 连接数
- 复制状态
-
工具选择:
- Prometheus + Grafana
- Redis自带的
INFO命令 - 云服务提供的监控
-
告警阈值:
- 内存使用 > 80%
- 命中率 < 90%
- 延迟 > 10ms
11.4 容量规划
-
内存估算:
- 测试实际数据的内存占用
- 考虑增长空间(至少预留20%)
-
性能测试:
bash复制
redis-benchmark -h 127.0.0.1 -p 6379 -a password -n 100000 -c 50 -
扩展策略:
- 垂直扩展:增加单节点内存
- 水平扩展:使用集群分片
12. Redis与其他技术集成
Redis可以与其他技术栈无缝集成,构建更强大的应用架构。
12.1 与数据库集成
-
缓存模式:
- 旁路缓存(Cache-Aside)
- 直写(Write-Through)
- 回写(Write-Behind)
-
实现示例(Python):
python复制def get_user(user_id): # 先尝试从Redis获取 user_data = redis.get(f"user:{user_id}") if user_data: return json.loads(user_data) # Redis中没有则查询数据库 user_data = db.query("SELECT * FROM users WHERE id = %s", user_id) if user_data: # 写入Redis并设置过期时间 redis.setex(f"user:{user_id}", 3600, json.dumps(user_data)) return user_data
12.2 与消息队列集成
-
使用List作为队列:
bash复制
LPUSH myqueue task1 RPOP myqueue -
更高级的Stream:
bash复制
XADD mystream * field1 value1 field2 value2 XREAD COUNT 2 STREAMS mystream 0 -
与Kafka对比:
- Redis更轻量、延迟更低
- Kafka更适合大数据量、持久化场景
12.3 与搜索引擎集成
-
RedisSearch模块:
- 全文搜索功能
- 支持中文分词(需额外配置)
-
基本用法:
bash复制FT.CREATE myIdx ON HASH PREFIX 1 doc: SCHEMA title TEXT WEIGHT 5.0 body TEXT FT.SEARCH myIdx "hello world" LIMIT 0 10
12.4 与机器学习集成
-
RedisAI模块:
- 支持TensorFlow、PyTorch等模型
- 低延迟的模型推理
-
使用示例:
bash复制
AI.TENSORSET mytensor FLOAT 2 2 VALUES 1 2 3 4 AI.MODELSET mymodel TF CPU INPUTS 1 tensor OUTPUTS 1 output AI.MODELRUN mymodel INPUTS tensor OUTPUTS output
13. Redis模块扩展
Redis通过模块系统支持功能扩展,下面介绍几个常用模块。
13.1 RedisJSON
处理JSON文档:
-
安装:
bash复制git clone https://github.com/RedisJSON/RedisJSON.git cd RedisJSON make -
配置:
conf复制loadmodule /path/to/rejson.so -
使用:
bash复制JSON.SET doc $ '{"name":"John", "age":30}' JSON.GET doc $.name
13.2 RedisGraph
图数据库功能:
-
安装:
bash复制git clone https://github.com/RedisGraph/RedisGraph.git cd RedisGraph make -
使用:
bash复制GRAPH.QUERY social "CREATE (:person {name:'John'})-[:knows]->(:person {name:'Jane'})" GRAPH.QUERY social "MATCH (p:person) RETURN p.name"
13.3 RedisTimeSeries
时间序列数据:
-
安装:
bash复制git clone https://github.com/RedisTimeSeries/RedisTimeSeries.git cd RedisTimeSeries make -
使用:
bash复制
TS.CREATE temperature TS.ADD temperature 1626434400000 26.5 TS.RANGE temperature 1626434400000 1626434460000
13.4 RedisBloom
概率数据结构:
-
安装:
bash复制git clone https://github.com/RedisBloom/RedisBloom.git cd RedisBloom make -
使用:
bash复制
BF.ADD myfilter item1 BF.EXISTS myfilter item1
14. Redis在微服务架构中的应用
Redis在微服务架构中扮演着重要角色,下面探讨几种典型应用场景。
14.1 分布式锁
-
基本实现:
bash复制
SET lock:resource1 unique_value NX PX 30000 -
安全释放(Lua脚本):
lua复制if redis.call("get",KEYS[1]) == ARGV[1] then return redis.call("del",KEYS[1]) else return 0 end -
RedLock算法:
- 在多个独立Redis实例上获取锁
- 多数成功才算获取锁成功
14.2 会话存储
-
Spring Session配置:
java复制@EnableRedisHttpSession public class HttpSessionConfig { @Bean public LettuceConnectionFactory connectionFactory() { return new LettuceConnectionFactory(); } } -
存储结构:
- 每个会话存储为哈希
- 设置合理的TTL
14.3 速率限制
-
滑动窗口算法:
lua复制local current_time = redis.call('TIME')[1] local window = 60 local limit = 100 local key = KEYS[1] redis.call('ZREMRANGEBYSCORE', key, 0, current_time - window) local count = redis.call('ZCARD', key) if count < limit then redis.call('ZADD', key, current_time, current_time .. math.random()) redis.call('EXPIRE', key, window) return 1 end return 0 -
令牌桶算法:
- 使用列表存储令牌
- 定期补充令牌
14.4 服务发现
-
注册服务:
bash复制
HSET services:my-service instance1 192.168.1.100:8080 EXPIRE services:my-service 30 -
服务发现:
bash复制
HGETALL services:my-service -
健康检查:
- 服务定期更新自己的注册信息
- 客户端过滤掉过期的实例
15. Redis替代方案比较
虽然Redis功能强大,但在某些场景下可能需要考虑替代方案。
15.1 内存数据库对比
| 特性 | Redis | Memcached | Hazelcast |
|---|---|---|---|
| 数据结构 | 丰富 | 简单键值 | 丰富 |
| 持久化 | 支持 | 不支持 | 支持 |
| 集群 | 支持 | 不支持 | 原生支持 |
| 事务 | 有限支持 | 不支持 | 支持 |
| 最佳场景 | 多功能缓存 | 简单缓存 | 分布式计算 |
15.2 持久化方案对比
| 特性 | Redis RDB | Redis AOF | RocksDB |
|---|---|---|---|
| 恢复速度 | 快 | 慢 | 中等 |
| 数据安全 | 可能丢失数据 | 最多丢失1秒数据 | 高 |
| 磁盘占用 | 小 | 大 | 中等 |
| 写性能影响 | 高(fork时) | 中等 | 低 |
15.3 消息队列对比
| 特性 | Redis List/Stream | Kafka | RabbitMQ |
|---|---|---|---|
| 持久化 | 可选 | 是 | 是 |
| 吞吐量 | 高 | 极高 | 高 |
| 延迟 | 极低 | 低 | 低 |
| 消费者组 | Stream支持 | 原生支持 | 原生支持 |
| 最佳场景 | 轻量级队列 | 大数据管道 | 企业级消息 |
15.4 何时选择Redis
-
适合Redis的场景:
- 需要亚毫秒级延迟
- 需要丰富的数据结构
- 数据量适合内存(或能接受成本)
- 需要多功能(缓存+队列+发布订阅等)
-
不适合Redis的场景:
- 数据量远超内存容量
- 需要复杂查询(如SQL)
- 需要强一致性事务
- 数据永久持久化是首要需求
16. Redis实战案例解析
通过实际案例展示Redis在不同场景下的应用,帮助理解如何将Redis特性转化为解决方案。
16.1 电商网站应用
-
商品缓存:
- 使用哈希存储商品信息
bash复制HMSET product:1001 name "iPhone 13" price 999 stock 50 -
购物车:
- 使用哈希存储用户购物车
bash复制
HSET cart:user1 product:1001 2 -
秒杀系统:
- 使用Redis原子操作防止超卖
lua复制local stock = tonumber(redis.call('GET', KEYS[1])) if stock > 0 then redis.call('DECR', KEYS[1]) return 1 end return 0
16.2 社交网络应用
- 关注关系:
- 使用集合存储关注列表
bash复制
SADD following:user1 user2 user3 SADD followers:user2 user1
