安装配置、redis-cli使用、基本命令
Redis(Remote Dictionary Server)是一个开源的、基于内存的高性能键值存储数据库。它支持多种数据结构,如字符串、列表、集合、哈希表和有序集合等。Redis常用于缓存、消息队列、排行榜、实时分析等场景。
单线程模型: Redis采用单线程事件循环模型,所有命令都在一个线程中顺序执行。这种设计避免了多线程的上下文切换和锁竞争,保证了操作的原子性,同时充分利用了CPU缓存。
I/O多路复用: Redis使用epoll(Linux)、kqueue(BSD)等I/O多路复用技术,能够高效处理大量并发连接,实现高吞吐量。
内存管理: Redis使用jemalloc内存分配器,优化内存碎片问题。同时支持多种内存淘汰策略,确保在内存不足时能够优雅地处理。
| 特性 | Redis | Memcached | MySQL | MongoDB |
|---|---|---|---|---|
| 数据存储 | 内存+持久化 | 纯内存 | 磁盘 | 磁盘+内存 |
| 数据结构 | 丰富(5种) | 简单(字符串) | 关系型 | 文档型 |
| 性能 | 极高(10万+QPS) | 高(10万+QPS) | 中等(数千QPS) | 中等(数千QPS) |
| 适用场景 | 缓存、队列、排行榜 | 简单缓存 | 事务处理 | 文档存储 |
# 方式1: 使用包管理器(推荐)
# Ubuntu/Debian
sudo apt-get update
sudo apt-get install redis-server
# CentOS/RHEL
sudo yum install redis
# macOS
brew install redis
# 方式2: 源码编译安装
wget http://download.redis.io/releases/redis-7.0.0.tar.gz
tar xzf redis-7.0.0.tar.gz
cd redis-7.0.0
make
sudo make install
# 下载Redis for Windows
# 访问: https://github.com/microsoftarchive/redis/releases
# 下载.msi安装包并安装
# 或使用WSL2安装Linux版本(推荐)
wsl --install
# 然后在WSL中按Linux方式安装
# 前台启动(测试用)
redis-server
# 后台启动(生产环境)
redis-server --daemonize yes
# 使用配置文件启动
redis-server /etc/redis/redis.conf
# 指定端口启动
redis-server --port 6380
Redis的配置文件(redis.conf)包含了丰富的配置选项,理解这些配置对于生产环境部署至关重要。
# redis.conf 核心配置项详解
# 网络配置
# 绑定IP地址(默认127.0.0.1,生产环境需修改为服务器IP)
bind 127.0.0.1
# 监听端口(默认6379,建议修改为非常用端口增强安全性)
port 6379
# 保护模式(默认yes,只允许本地连接)
protected-mode yes
# TCP监听队列长度
tcp-backlog 511
# 客户端连接超时时间(秒)
timeout 0
# TCP keepalive设置(秒)
tcp-keepalive 300
# 进程管理
# 后台运行(生产环境必须设为yes)
daemonize yes
# 进程文件路径
pidfile /var/run/redis_6379.pid
# 日志配置
# 日志级别:debug、verbose、notice、warning(生产环境建议notice)
loglevel notice
# 日志文件路径
logfile /var/log/redis/redis-server.log
# 日志输出到标准输出
# logfile ""
# 数据库配置
# 数据库数量(默认16个,编号0-15)
databases 16
# 内存管理(核心配置)
# 最大内存限制(必须设置,避免内存溢出)
maxmemory 256mb
# 内存淘汰策略(8种策略可选)
maxmemory-policy allkeys-lru
# 内存淘汰采样数量
maxmemory-samples 5
# 持久化配置
# RDB持久化
# 900秒内至少1个键被修改,触发快照
save 900 1
# 300秒内至少10个键被修改,触发快照
save 300 10
# 60秒内至少10000个键被修改,触发快照
save 60 10000
# RDB文件压缩
dbfilename dump.rdb
# RDB文件保存路径
dir /var/lib/redis
# AOF持久化
appendonly no
# AOF文件名
appendfilename "appendonly.aof"
# AOF同步策略:no、everysec、always
appendfsync everysec
# 安全配置
# 密码认证(生产环境必须设置)
requirepass your_strong_password
# 客户端配置
# 最大客户端连接数
maxclients 10000
# 线程配置(Redis 6.0+)
# I/O线程数(0表示禁用多线程)
io-threads 4
# 后台线程数
io-threads-do-reads yes
# 复制配置
# 从节点只读
slave-read-only yes
# 复制超时时间
repl-timeout 60
# 集群配置
# 开启集群模式
cluster-enabled no
# 集群节点超时时间
cluster-node-timeout 15000
# 集群配置文件
cluster-config-file nodes-6379.conf
# 哨兵配置
# 哨兵监控的主节点
sentinel monitor mymaster 127.0.0.1 6379 2
# 哨兵判断主节点下线的时间
# sentinel down-after-milliseconds mymaster 30000
# 故障转移超时时间
# sentinel failover-timeout mymaster 180000
# 故障转移时同时同步的从节点数
# sentinel parallel-syncs mymaster 1
# 连接本地Redis(默认127.0.0.1:6379)
redis-cli
# 连接指定主机和端口
redis-cli -h 192.168.1.100 -p 6379
# 使用密码连接
redis-cli -h 127.0.0.1 -p 6379 -a mypassword
# 连接后认证
redis-cli
127.0.0.1:6379> AUTH mypassword
# 选择数据库(0-15)
127.0.0.1:6379> SELECT 1
OK
# 高级连接选项
# 使用SSL连接(Redis 6.0+)
redis-cli --tls --cacert ca.crt --cert client.crt --key client.key
# 指定连接超时时间
redis-cli --timeout 5
# 以原始模式输出(不格式化)
redis-cli --raw
# 测试连接
127.0.0.1:6379> PING
PONG
# 查看服务器信息(最全面的诊断命令)
127.0.0.1:6379> INFO
# Server
redis_version:7.0.0
redis_mode:standalone
os:Linux 5.10.0-amd64
...
# 查看特定信息段
127.0.0.1:6379> INFO stats # 统计信息
127.0.0.1:6379> INFO memory # 内存使用情况
127.0.0.1:6379> INFO clients # 客户端连接信息
127.0.0.1:6379> INFO persistence # 持久化信息
127.0.0.1:6379> INFO replication # 复制信息
# 查看客户端连接
127.0.0.1:6379> CLIENT LIST
# 监控实时命令执行(生产环境慎用)
127.0.0.1:6379> MONITOR
# 查看慢查询日志
127.0.0.1:6379> SLOWLOG GET 10
# 1. 批量执行命令(从文件读取)
echo -e "SET key1 value1\nSET key2 value2\nGET key1" | redis-cli
# 2. 执行Lua脚本
redis-cli --eval script.lua key1 key2 , arg1 arg2
# 3. 性能测试(基准测试)
redis-benchmark -h 127.0.0.1 -p 6379 -c 50 -n 100000
# 4. 数据导入导出
# 导出数据到文件
redis-cli --scan --pattern "user:*" | xargs redis-cli MGET > data.txt
# 5. 交互式批量操作
127.0.0.1:6379> MULTI
127.0.0.1:6379> SET user:1 name
127.0.0.1:6379> SET user:1 age
127.0.0.1:6379> EXEC
# 6. 管道操作(提高性能)
cat commands.txt | redis-cli --pipe
# 7. 监控键空间事件
127.0.0.1:6379> CONFIG SET notify-keyspace-events KEA
127.0.0.1:6379> PSUBSCRIBE __key*__:*
本节将通过实际案例深入讲解Redis的基本命令,包括字符串操作、键管理、数值操作等,并分析其底层实现原理和最佳实践。
# 设置键值
127.0.0.1:6379> SET name "张三"
OK
# 获取值
127.0.0.1:6379> GET name
"张三"
# 设置多个键值(原子操作)
127.0.0.1:6379> MSET age 25 city "北京" job "工程师"
OK
# 获取多个值
127.0.0.1:6379> MGET name age city
1) "张三"
2) "25"
3) "北京"
# 条件设置(仅当键不存在时设置)
127.0.0.1:6379> SET username "alice" NX
OK
127.0.0.1:6379> SET username "bob" NX
(nil) # 设置失败,因为键已存在
# 条件设置(仅当键存在时设置)
127.0.0.1:6379> SET username "charlie" XX
OK
127.0.0.1:6379> SET nonexistent "value" XX
(nil) # 设置失败,因为键不存在
# 设置键并指定过期时间(秒)
127.0.0.1:6379> SETEX session:user123 3600 "token_abc"
OK
# 设置已存在键的过期时间
127.0.0.1:6379> EXPIRE name 300
(integer) 1
# 查看剩余生存时间(秒)
127.0.0.1:6379> TTL name
(integer) 295
# 查看剩余生存时间(毫秒)
127.0.0.1:6379> PTTL name
(integer) 294850
# 移除过期时间
127.0.0.1:6379> PERSIST name
(integer) 1
# 检查键是否存在
127.0.0.1:6379> EXISTS name
(integer) 1
# 删除键
127.0.0.1:6379> DEL name
(integer) 1
# 查看键的类型
127.0.0.1:6379> SET counter 100
127.0.0.1:6379> TYPE counter
string
# 重命名键
127.0.0.1:6379> RENAME counter user_counter
OK
# 查看所有键(生产环境慎用!)
127.0.0.1:6379> KEYS *
1) "age"
2) "city"
3) "user_counter"
# 切换到数据库1
127.0.0.1:6379> SELECT 1
OK
# 查看当前数据库键数量
127.0.0.1:6379[1]> DBSIZE
(integer) 0
# 清空当前数据库
127.0.0.1:6379[1]> FLUSHDB
OK
# 清空所有数据库(危险操作!)
127.0.0.1:6379> FLUSHALL
OK
# 设置计数器
127.0.0.1:6379> SET views 1000
OK
# 自增1
127.0.0.1:6379> INCR views
(integer) 1001
# 自减1
127.0.0.1:6379> DECR views
(integer) 1000
# 增加指定值
127.0.0.1:6379> INCRBY views 100
(integer) 1100
# 减少指定值
127.0.0.1:6379> DECRBY views 50
(integer) 1050
# 批量设置(原子操作)
127.0.0.1:6379> MSET user:1:name "Alice" user:1:age 28 user:2:name "Bob" user:2:age 32
OK
# 批量获取
127.0.0.1:6379> MGET user:1:name user:1:age user:2:name user:2:age
1) "Alice"
2) "28"
3) "Bob"
4) "32"
# 性能测试工具
redis-benchmark -h 127.0.0.1 -p 6379 -c 50 -n 10000
# -c: 并发连接数
# -n: 请求总数
# 执行单条命令后退出
redis-cli SET mykey "hello"
# 批量执行命令
echo -e "SET key1 value1\nGET key1\nDEL key1" | redis-cli
# 从文件读取命令
redis-cli < commands.txt
# 监控实时命令(调试用)
redis-cli MONITOR
# 查看慢查询日志
redis-cli SLOWLOG GET 10
# 导出数据
redis-cli --rdb dump.rdb
# 扫描大键
redis-cli --bigkeys
# 查看配置
127.0.0.1:6379> CONFIG GET maxmemory
1) "maxmemory"
2) "268435456"
# 动态修改配置
127.0.0.1:6379> CONFIG SET maxmemory 512mb
OK
# 保存配置到文件
127.0.0.1:6379> CONFIG REWRITE
OK
# 手动触发持久化
127.0.0.1:6379> SAVE # 阻塞式保存
127.0.0.1:6379> BGSAVE # 后台保存
# 查看最后保存时间
127.0.0.1:6379> LASTSAVE
(integer) 1675234567
# 关闭服务器
127.0.0.1:6379> SHUTDOWN SAVE
# 推荐使用冒号分隔的命名方式
user:1001:profile # 用户1001的资料
order:2023:01:summary # 2023年1月订单汇总
cache:product:10086 # 商品10086的缓存
session:abc123def # 会话token
# 避免过长的键名(影响性能和内存)
# 避免特殊字符和空格
在应用程序中使用Redis时,应该使用连接池而不是每次创建新连接:
# Python示例(redis-py)
import redis
pool = redis.ConnectionPool(
host='localhost',
port=6379,
max_connections=50,
decode_responses=True
)
r = redis.Redis(connection_pool=pool)
本课程介绍了Redis的基础知识,包括:
掌握这些基础知识后,你就可以开始使用Redis进行简单的缓存和数据存储了。在后续课程中,我们将深入学习Redis的各种数据结构和高级特性。