<返回目录     Powered by claud/xia兄

第1课: Redis基础入门

安装配置、redis-cli使用、基本命令

什么是Redis?

Redis(Remote Dictionary Server)是一个开源的、基于内存的高性能键值存储数据库。它支持多种数据结构,如字符串、列表、集合、哈希表和有序集合等。Redis常用于缓存、消息队列、排行榜、实时分析等场景。

Redis的核心定位: Redis不仅仅是一个缓存系统,而是一个功能丰富的数据结构服务器,它提供了丰富的数据类型和原子操作,使其能够胜任多种复杂的数据处理任务。

Redis的核心特点

Redis的架构原理

单线程模型: Redis采用单线程事件循环模型,所有命令都在一个线程中顺序执行。这种设计避免了多线程的上下文切换和锁竞争,保证了操作的原子性,同时充分利用了CPU缓存。

I/O多路复用: Redis使用epoll(Linux)、kqueue(BSD)等I/O多路复用技术,能够高效处理大量并发连接,实现高吞吐量。

内存管理: Redis使用jemalloc内存分配器,优化内存碎片问题。同时支持多种内存淘汰策略,确保在内存不足时能够优雅地处理。

Redis与其他数据库的比较

特性 Redis Memcached MySQL MongoDB
数据存储 内存+持久化 纯内存 磁盘 磁盘+内存
数据结构 丰富(5种) 简单(字符串) 关系型 文档型
性能 极高(10万+QPS) 高(10万+QPS) 中等(数千QPS) 中等(数千QPS)
适用场景 缓存、队列、排行榜 简单缓存 事务处理 文档存储

Redis安装与配置

Linux/macOS安装

# 方式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

Windows安装

# 下载Redis for Windows
# 访问: https://github.com/microsoftarchive/redis/releases
# 下载.msi安装包并安装

# 或使用WSL2安装Linux版本(推荐)
wsl --install
# 然后在WSL中按Linux方式安装

启动Redis服务

# 前台启动(测试用)
redis-server

# 后台启动(生产环境)
redis-server --daemonize yes

# 使用配置文件启动
redis-server /etc/redis/redis.conf

# 指定端口启动
redis-server --port 6380

Redis配置文件详解

Redis的配置文件(redis.conf)包含了丰富的配置选项,理解这些配置对于生产环境部署至关重要。

配置加载顺序: Redis会按照以下顺序加载配置:1) 默认配置 2) 配置文件 3) 命令行参数。命令行参数优先级最高。
# 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服务器

# 连接本地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

redis-cli高级用法

# 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*__:*
性能优化技巧: 使用管道(pipeline)可以显著提高批量操作的性能,因为它减少了网络往返时间。在需要执行大量命令时,优先考虑使用管道或批量操作。

Redis基本命令实战

本节将通过实际案例深入讲解Redis的基本命令,包括字符串操作、键管理、数值操作等,并分析其底层实现原理和最佳实践。

示例1:字符串基本操作

# 设置键值
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)  # 设置失败,因为键不存在

SET命令参数详解

底层原理: Redis的字符串使用SDS(Simple Dynamic String)实现,相比C字符串具有以下优势:1) O(1)时间复杂度获取长度 2) 二进制安全 3) 自动扩容 4) 减少内存重分配次数。

示例2:键的过期时间

# 设置键并指定过期时间(秒)
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

示例3:键的管理操作

# 检查键是否存在
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"

示例4:数据库切换与清空

# 切换到数据库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

示例5:数值操作

# 设置计数器
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

示例6:批量操作与性能测试

# 批量设置(原子操作)
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: 请求总数

示例7:redis-cli高级用法

# 执行单条命令后退出
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

示例8:实用运维命令

# 查看配置
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
重要提示:

常见问题与最佳实践

1. Redis为什么这么快?

2. 键命名规范

# 推荐使用冒号分隔的命名方式
user:1001:profile          # 用户1001的资料
order:2023:01:summary      # 2023年1月订单汇总
cache:product:10086        # 商品10086的缓存
session:abc123def          # 会话token

# 避免过长的键名(影响性能和内存)
# 避免特殊字符和空格

3. 连接池配置

在应用程序中使用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)

实践练习

练习任务:
  1. 安装配置:在本地安装Redis,修改配置文件设置密码和最大内存限制为128MB
  2. 基本操作:使用redis-cli连接服务器,创建10个不同的键值对,包含用户信息、商品信息等
  3. 过期时间:为其中5个键设置不同的过期时间(60秒、300秒、3600秒等),观察TTL变化
  4. 数值操作:创建一个计数器,模拟网站访问量统计,执行100次INCR操作
  5. 批量操作:使用MSET一次性设置20个键值对,然后用MGET批量获取
  6. 性能测试:使用redis-benchmark测试本地Redis的QPS,记录SET和GET的性能数据
  7. 监控调试:开启MONITOR命令,在另一个终端执行操作,观察实时命令流

总结

本课程介绍了Redis的基础知识,包括:

掌握这些基础知识后,你就可以开始使用Redis进行简单的缓存和数据存储了。在后续课程中,我们将深入学习Redis的各种数据结构和高级特性。