Redis完全指南:从诞生到实战

一、Redis的前世今生

1.1 Redis的诞生背景

2009年,意大利程序员Salvatore Sanfilippo(网名antirez)正在为自己的创业项目开发一个实时日志分析系统。当时他发现传统的关系型数据库MySQL在处理实时数据时性能不足,无法满足他的需求。于是,他决定自己开发一个数据库来解决这个问题。

最初,antirez只是想创建一个简单的内存数据库,用来存储访问日志和实时统计数据。但随着开发的深入,他意识到这个项目可能对其他开发者也很有价值。2009年,Redis的第一个版本正式发布,并在GitHub上开源。

1.2 名字的由来

Redis这个名字来源于"REmote DIctionary Server"(远程字典服务器)的缩写。这个名字很好地概括了Redis的核心特性:它是一个可以通过网络访问的、基于键值对的数据存储系统。

1.3 发展历程

Redis的发展可以分为几个重要阶段:

2009-2010年:初创期

Redis刚发布时功能相对简单,主要支持字符串、列表、集合等基本数据类型。但它的高性能很快吸引了开发者的关注,用户群体迅速增长。

2010-2013年:成长期

这个阶段Redis不断增加新特性,包括发布订阅功能、事务支持、Lua脚本支持等。2013年,Redis 2.8版本引入了Sentinel哨兵机制,提供了高可用性解决方案。

2013-2015年:成熟期

2015年发布的Redis 3.0是一个里程碑版本,正式引入了Redis Cluster集群功能,使Redis具备了分布式部署能力。这让Redis从单机数据库进化为可以处理海量数据的分布式系统。

2016-2020年:企业级发展

Redis持续优化性能和稳定性,增加了模块系统、流数据类型等功能。2018年,Redis Labs公司调整了部分模块的开源协议,引发了社区讨论,但核心Redis仍保持BSD协议。

2020-2022年:架构革新期

2020年5月,Redis 6.0正式发布,这是一个具有里程碑意义的版本。它打破了Redis长期以来的单线程架构,引入了多线程I/O机制来处理网络数据读写和协议解析,同时保持命令执行仍为单线程以避免并发问题。这个版本还引入了ACL(访问控制列表)系统,允许基于用户、命令和键进行细粒度的权限控制,大大增强了安全性。此外,Redis 6.0支持了SSL/TLS加密通信、RESP3协议、客户端缓存等重要特性。

2022年4月,Redis 7.0发布,带来了超过50个新命令和大量核心改进。这个版本引入了Redis Functions功能,作为Lua脚本的升级方案,提供了更好的代码组织和版本管理。7.0版本还实现了多部分AOF持久化机制,将AOF文件拆分为多个部分以提高性能。命令自省功能得到增强,集群管理更加智能化。数据结构方面,List类型可以存储超过4GB的单个元素,内部编码从ziplist全面升级为更高效的listpack。

2024年:开源协议变更与社区分裂

2024年3月20日,Redis公司宣布了一个震动整个开源社区的决定:从Redis 7.4版本开始,将BSD-3-Clause开源协议变更为RSALv2(Redis Source Available License)和SSPLv1(Server Side Public License)双重许可。这意味着Redis在OSI(开源促进会)定义下不再是严格的开源软件,云服务商不能再免费使用Redis代码提供商业托管服务。

这一变化立即引发了社区的强烈反应。仅仅11天后,2024年3月31日,在Linux基金会的支持下,AWS、谷歌云、甲骨文、阿里云、华为等40多家公司宣布成立Valkey项目,基于Redis 7.2.4(最后的开源版本)进行分叉。Valkey项目由Redis的核心维护者领导,包括来自AWS的Madelyn Olson和来自腾讯的Zhao Zhao等资深开发者,他们贡献了Redis开源版本近一半的代码。

2024年4月16日,Valkey 7.2.5正式发布,完全兼容Redis 7.2.4,用户可以无缝迁移。2024年9月,Valkey发布了8.0版本,开始与Redis在功能上分道扬镳,引入了优化的多线程I/O、RDMA(远程直接内存访问)实验性支持、更高效的字典实现等新特性,部分命令性能提升高达41%。

2024-2026年:双轨发展时代

Redis公司方面,2024年7月发布了Redis 7.4版本,引入了Hash字段级过期功能(这是社区呼声最高的特性之一)、客户端缓存增强等特性。2024年末,Redis创始人Salvatore Sanfilippo(antirez)宣布回归Redis公司担任技术布道师,试图重建与社区的关系。

2025年5月1日,Redis 8.0正式发布,这是Redis公司在新许可下的首个主要版本。为了回应社区对开源的诉求,Redis 8.0重新引入了AGPLv3作为第三个许可选项,使其再次符合OSI开源标准。Redis 8.0在性能上实现了重大突破,引入了超过30项性能改进,常用命令延迟降低5.4%至87.4%,多核环境下吞吐量提升最高达112%(约2倍),复制速度提升18%。

更重要的是,Redis 8.0将原本分散的模块整合到核心发行版中,新增了8种数据结构:向量集(Vector Set,用于AI应用)、JSON、时间序列(Time Series)以及布隆过滤器、布谷鸟过滤器、Count-Min Sketch、Top-K和T-Digest五种概率数据结构。这使Redis从单纯的缓存数据库演变为功能完整的多模型数据存储平台。

Valkey项目同样发展迅速。AWS、谷歌云和阿里云等云厂商已经开始提供Valkey托管服务,例如Amazon ElastiCache for Valkey和MemoryDB for Valkey。根据2024年底的统计,Valkey已经吸引了大量Redis用户迁移,特别是在云环境中。Valkey 8.1版本(2025年发布)进一步优化了内存效率和性能,采用了新的哈希表实现。

现状与未来展望

截至2026年初,Redis和Valkey已经形成了明显的双轨格局:

  • Redis:由Redis公司主导开发,许可包括RSALv2、SSPLv1和AGPLv3三选一,拥有深厚的技术积累和完整的企业级功能,适合追求稳定性和商业支持的用户。

  • Valkey:由Linux基金会托管,采用BSD-3-Clause开源协议,得到主要云厂商支持,强调真正的开源精神和社区驱动开发,在性能优化上表现积极。

这种竞争态势对用户来说未必是坏事。两个项目都在加速创新,Redis专注于企业级特性和AI集成,Valkey注重性能优化和现代化架构。开发者可以根据自己的需求、许可偏好和生态系统选择合适的方案。历史会证明,究竟是Redis的深厚积累更胜一筹,还是Valkey的开源活力能够后来居上。

1.4 Redis的影响力

如今,Redis已经成为最流行的NoSQL数据库之一。据DB-Engines排名,Redis常年位居键值数据库第一名。全球众多知名企业如Twitter、GitHub、微博、阿里巴巴、腾讯等都在大规模使用Redis。

Redis的成功不仅在于其卓越的性能,更在于其简洁优雅的设计理念。antirez曾说:"我试图让Redis的每一个功能都保持简单,这样人们才能真正理解和使用它。"这种设计哲学让Redis成为了程序员最喜爱的工具之一。

二、Redis核心特性

2.1 内存数据库

Redis将所有数据存储在内存中,这是它高性能的根本原因。内存的读写速度远超磁盘,使Redis能够达到每秒数十万次的读写操作。

2.2 丰富的数据类型

Redis不仅仅是简单的键值存储,它支持多种数据结构:

  • String(字符串):最基础的类型,可以存储字符串、整数、浮点数
  • List(列表):有序的字符串列表,支持两端操作
  • Set(集合):无序且唯一的字符串集合
  • Sorted Set(有序集合):每个元素关联一个分数,按分数排序
  • Hash(哈希):键值对集合,适合存储对象
  • Bitmap(位图):基于字符串的位操作
  • HyperLogLog:用于基数统计的概率算法
  • Geospatial(地理空间):存储地理位置信息
  • Stream(流):消息队列和日志数据结构

2.3 持久化机制

虽然Redis是内存数据库,但它提供了两种持久化方式:

  • RDB(快照):定期将内存数据保存到磁盘
  • AOF(追加文件):记录每个写操作,可以完整恢复数据

2.4 高可用与分布式

  • 主从复制:数据自动同步到从节点
  • Sentinel哨兵:监控主从节点,自动故障转移
  • Cluster集群:数据分片存储,支持水平扩展

三、Redis安装指南

3.1 Linux系统安装

Redis官方支持的Linux发行版包括:

  • Ubuntu 22.04 (Jammy Jellyfish) 和 24.04 (Noble Numbat)
  • Rocky Linux 8.10 和 9.5
  • AlmaLinux 8.10 和 9.5
  • Debian 12 (Bookworm) 和 13 (Trixie)
方法一:通过包管理器安装(推荐新手)

Ubuntu/Debian系统:

bash 复制代码
# 添加Redis官方仓库
curl -fsSL https://packages.redis.io/gpg | sudo gpg --dearmor -o /usr/share/keyrings/redis-archive-keyring.gpg

echo "deb [signed-by=/usr/share/keyrings/redis-archive-keyring.gpg] https://packages.redis.io/deb $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/redis.list

# 更新包列表
sudo apt update

# 安装Redis
sudo apt install redis

# 启动Redis服务
sudo systemctl start redis-server

# 设置开机自启
sudo systemctl enable redis-server

# 检查服务状态
sudo systemctl status redis-server

CentOS/RHEL系统:

bash 复制代码
# 添加Redis官方仓库
curl -fsSL https://packages.redis.io/gpg | sudo tee /etc/pki/rpm-gpg/RPM-GPG-KEY-redis > /dev/null

sudo yum install -y yum-utils
sudo yum-config-manager --add-repo https://packages.redis.io/rpm/rhel$(rpm -E %{rhel})/redis.repo

# 安装Redis
sudo yum install redis

# 启动Redis服务
sudo systemctl start redis

# 设置开机自启
sudo systemctl enable redis

# 检查服务状态
sudo systemctl status redis
方法二:源码编译安装(推荐生产环境和最新版本)

这是官方推荐的安装方式,可以获得最新的稳定版本并进行自定义编译。

bash 复制代码
# 安装编译依赖工具
sudo apt install build-essential tcl  # Ubuntu/Debian
sudo yum groupinstall "Development Tools"  # CentOS/RHEL

# 下载Redis最新稳定版源码
wget https://download.redis.io/redis-stable.tar.gz

# 解压源码包
tar -xzvf redis-stable.tar.gz
cd redis-stable

# 编译Redis
make

# 可选:运行测试套件(确保编译正确,需要几分钟)
make test

# 安装Redis二进制文件到/usr/local/bin
sudo make install

# 编译后src目录下生成的重要文件:
# - redis-server: Redis服务器
# - redis-cli: Redis命令行客户端
# - redis-benchmark: 性能测试工具
# - redis-check-aof: AOF文件修复工具
# - redis-check-rdb: RDB文件检查工具
# - redis-sentinel: 哨兵模式程序

编译支持TLS加密连接:

bash 复制代码
# 安装OpenSSL开发库
sudo apt install libssl-dev  # Ubuntu/Debian
sudo yum install openssl-devel  # CentOS/RHEL

# 编译时启用TLS支持
make BUILD_TLS=yes

配置Redis为系统服务(正式安装):

bash 复制代码
# 创建必要的目录
sudo mkdir -p /etc/redis
sudo mkdir -p /var/redis/6379
sudo mkdir -p /var/log/redis

# 复制配置文件模板
sudo cp redis.conf /etc/redis/6379.conf

# 复制init脚本(如果存在)
sudo cp utils/redis_init_script /etc/init.d/redis_6379

# 修改配置文件关键设置
sudo vim /etc/redis/6379.conf

# 需要修改以下配置项:
# daemonize yes              # 以守护进程方式运行
# pidfile /var/run/redis_6379.pid  # PID文件路径
# port 6379                  # 监听端口
# dir /var/redis/6379        # 工作目录
# logfile /var/log/redis/redis_6379.log  # 日志文件

# 创建redis用户和组(可选,安全起见)
sudo useradd -r -s /bin/false redis
sudo chown -R redis:redis /var/redis
sudo chown -R redis:redis /var/log/redis

# 使用systemd管理(现代Linux系统推荐)
sudo tee /etc/systemd/system/redis.service > /dev/null <<EOF
[Unit]
Description=Redis In-Memory Data Store
After=network.target

[Service]
User=redis
Group=redis
ExecStart=/usr/local/bin/redis-server /etc/redis/6379.conf
ExecStop=/usr/local/bin/redis-cli shutdown
Restart=always

[Install]
WantedBy=multi-user.target
EOF

# 重新加载systemd配置
sudo systemctl daemon-reload

# 启动Redis服务
sudo systemctl start redis

# 设置开机自启
sudo systemctl enable redis

# 查看服务状态
sudo systemctl status redis

3.2 Windows系统安装

重要提示: Redis官方从未发布过原生Windows版本,仅支持Linux和macOS。Windows用户有以下选择:

方法一:使用WSL2安装(官方推荐)

Windows 10/11用户使用WSL2(Windows Subsystem for Linux)是最佳选择:

powershell 复制代码
# 在PowerShell(管理员权限)中安装WSL
wsl --install

# 重启计算机后,默认会安装Ubuntu
# 进入WSL Ubuntu环境后,按照前面的Ubuntu安装方法操作

# 添加Redis官方仓库
curl -fsSL https://packages.redis.io/gpg | sudo gpg --dearmor -o /usr/share/keyrings/redis-archive-keyring.gpg

echo "deb [signed-by=/usr/share/keyrings/redis-archive-keyring.gpg] https://packages.redis.io/deb $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/redis.list

# 安装Redis
sudo apt update
sudo apt install redis

# 启动Redis
redis-server

# 在另一个WSL终端中测试连接
redis-cli ping
方法二:使用第三方Windows移植版(非官方,仅用于开发测试)

微软曾维护过Windows版本,现由社区维护:

下载安装:

  1. 访问GitHub: https://github.com/tporadowski/redis/releases
  2. 下载Redis-x64-xxx.zip压缩包
  3. 解压到指定目录,如 C:\Redis

手动启动:

cmd 复制代码
# 在命令提示符中进入Redis目录
cd C:\Redis

# 启动Redis服务器
redis-server.exe redis.windows.conf

安装为Windows服务:

cmd 复制代码
# 以管理员身份打开命令提示符
cd C:\Redis

# 安装Redis为Windows服务
redis-server.exe --service-install redis.windows-service.conf --loglevel verbose

# 启动服务
redis-server.exe --service-start

# 停止服务
redis-server.exe --service-stop

# 卸载服务
redis-server.exe --service-uninstall

连接测试:

cmd 复制代码
# 打开新的命令提示符窗口
cd C:\Redis
redis-cli.exe

# 或者指定主机和端口
redis-cli.exe -h 127.0.0.1 -p 6379

注意事项:

  • Windows版本仅建议用于开发和测试环境
  • 生产环境强烈建议使用Linux系统
  • Windows版本可能缺少某些功能和性能优化
  • 更新频率较慢,可能无法获得最新特性

3.3 macOS系统安装

Redis官方支持macOS系统,包括macOS 13(Ventura)、14(Sonoma)和15(Sequoia)。

使用Homebrew安装(官方推荐)

Homebrew是macOS最流行的包管理器:

bash 复制代码
# 1. 安装Homebrew(如果未安装)
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

# 验证Homebrew安装
brew --version

# 2. 安装Redis
brew install redis

# 3. 查看Redis信息
brew info redis
# 会显示配置文件位置:/usr/local/etc/redis.conf 或 /opt/homebrew/etc/redis.conf

# 4. 启动Redis服务(后台运行)
brew services start redis

# 查看服务状态
brew services list

# 停止Redis服务
brew services stop redis

# 重启Redis服务
brew services restart redis

# 5. 或者前台运行Redis(手动启动)
redis-server /usr/local/etc/redis.conf
# M1/M2芯片Mac路径可能是: /opt/homebrew/etc/redis.conf
从源码编译安装

如果需要最新版本或自定义编译:

bash 复制代码
# 下载源码
wget https://download.redis.io/redis-stable.tar.gz
tar -xzvf redis-stable.tar.gz
cd redis-stable

# 编译
make

# 测试编译
make test

# 安装
sudo make install

# 启动Redis
redis-server
配置文件位置说明

Homebrew安装的Redis配置文件路径根据Mac架构不同:

  • Intel芯片Mac : /usr/local/etc/redis.conf
  • Apple Silicon(M1/M2) : /opt/homebrew/etc/redis.conf

数据文件默认保存在:

  • Intel芯片 : /usr/local/var/db/redis/
  • Apple Silicon : /opt/homebrew/var/db/redis/

3.4 Docker安装(跨平台推荐)

Docker方式最简单且跨平台,官方维护Docker镜像:

bash 复制代码
# 1. 拉取官方Redis镜像(最新稳定版)
docker pull redis:latest

# 或指定具体版本
docker pull redis:7.4

# 2. 基本运行(快速测试)
docker run --name my-redis -p 6379:6379 -d redis

# 3. 使用持久化存储(推荐生产环境)
docker run --name my-redis \
  -p 6379:6379 \
  -v redis-data:/data \
  -d redis redis-server --appendonly yes

# 4. 使用自定义配置文件
# 首先在本地创建配置文件
mkdir -p ~/redis/conf
wget -O ~/redis/conf/redis.conf https://raw.githubusercontent.com/redis/redis/7.4/redis.conf

# 编辑配置文件
vim ~/redis/conf/redis.conf
# 修改以下配置:
# bind 0.0.0.0  # 允许外部连接(注意安全)
# requirepass your_password  # 设置密码

# 运行容器并挂载配置文件
docker run --name my-redis \
  -p 6379:6379 \
  -v ~/redis/conf/redis.conf:/usr/local/etc/redis/redis.conf \
  -v redis-data:/data \
  -d redis redis-server /usr/local/etc/redis/redis.conf

# 5. 连接到Redis容器
docker exec -it my-redis redis-cli

# 使用密码连接
docker exec -it my-redis redis-cli -a your_password

# 6. 查看Redis日志
docker logs my-redis

# 实时查看日志
docker logs -f my-redis

# 7. 停止和启动容器
docker stop my-redis
docker start my-redis

# 8. 删除容器
docker rm -f my-redis

# 删除数据卷(谨慎操作,会删除所有数据)
docker volume rm redis-data

Docker Compose方式(推荐团队开发):

创建docker-compose.yml文件:

yaml 复制代码
version: '3.8'

services:
  redis:
    image: redis:7.4
    container_name: redis-server
    ports:
      - "6379:6379"
    volumes:
      - redis-data:/data
      - ./redis.conf:/usr/local/etc/redis/redis.conf
    command: redis-server /usr/local/etc/redis/redis.conf
    restart: unless-stopped
    environment:
      - TZ=Asia/Shanghai

volumes:
  redis-data:

启动和管理:

bash 复制代码
# 启动服务
docker-compose up -d

# 查看日志
docker-compose logs -f

# 停止服务
docker-compose down

# 停止并删除数据卷
docker-compose down -v

Redis Stack(包含扩展模块):

如果需要Redis的扩展功能(如JSON、搜索、图等):

bash 复制代码
# 拉取Redis Stack镜像
docker pull redis/redis-stack:latest

# 运行Redis Stack
docker run --name redis-stack \
  -p 6379:6379 \
  -p 8001:8001 \
  -v redis-stack-data:/data \
  -d redis/redis-stack:latest

# 访问Redis Insight(Web管理界面)
# 浏览器打开: http://localhost:8001

3.5 验证安装与基本测试

安装完成后,验证Redis是否正常运行:

基本连接测试:

bash 复制代码
# 使用redis-cli连接本地Redis
redis-cli

# 测试连接
127.0.0.1:6379> ping
PONG

# 设置一个键值对
127.0.0.1:6379> set test "Hello Redis"
OK

# 获取值
127.0.0.1:6379> get test
"Hello Redis"

# 查看Redis服务器信息
127.0.0.1:6379> info server
# 会显示Redis版本、运行时间等信息

# 退出
127.0.0.1:6379> exit

连接远程Redis服务器:

bash 复制代码
# 指定主机和端口
redis-cli -h 192.168.1.100 -p 6379

# 使用密码连接
redis-cli -h 192.168.1.100 -p 6379 -a yourpassword

# 更安全的方式(不在命令行暴露密码)
redis-cli -h 192.168.1.100 -p 6379
127.0.0.1:6379> auth yourpassword
OK

# 或使用环境变量
export REDISCLI_AUTH=yourpassword
redis-cli -h 192.168.1.100 -p 6379

执行单条命令(不进入交互模式):

bash 复制代码
# 直接执行命令
redis-cli set mykey "value"
redis-cli get mykey

# 查看所有键
redis-cli keys '*'

# 获取Redis信息
redis-cli info

# 监控Redis命令执行
redis-cli monitor

# 测试延迟
redis-cli --latency

# 持续测试延迟(按Ctrl+C停止)
redis-cli --latency-history

性能测试:

Redis自带性能测试工具redis-benchmark:

bash 复制代码
# 基本性能测试(默认测试)
redis-benchmark

# 只测试SET和GET命令,10万次请求
redis-benchmark -t set,get -n 100000

# 测试指定主机,使用20个并发连接
redis-benchmark -h 192.168.1.100 -p 6379 -c 20 -n 100000

# 只测试SET,使用3字节的值
redis-benchmark -t set -n 100000 -d 3

# 使用管道模式(Pipeline)测试
redis-benchmark -n 100000 -P 16

# 安静模式(只显示每秒请求数)
redis-benchmark -q

检查Redis服务状态:

bash 复制代码
# systemd管理的服务
sudo systemctl status redis

# 查看Redis进程
ps aux | grep redis-server

# 检查Redis监听端口
sudo netstat -tlnp | grep 6379
# 或使用ss命令
sudo ss -tlnp | grep 6379

# 查看Redis日志
sudo tail -f /var/log/redis/redis.log

# 或使用journalctl(systemd)
sudo journalctl -u redis -f

常见问题排查:

bash 复制代码
# 问题1: 无法连接Redis
# 检查服务是否运行
sudo systemctl status redis

# 检查端口是否监听
sudo netstat -tlnp | grep 6379

# 检查防火墙设置
sudo firewall-cmd --list-all  # CentOS/RHEL
sudo ufw status  # Ubuntu

# 问题2: 连接被拒绝
# 检查bind配置(编辑redis.conf)
# bind 127.0.0.1  # 只允许本地连接
# bind 0.0.0.0    # 允许所有IP连接(不安全,需配置密码)

# 检查保护模式
# protected-mode yes  # 启用保护模式
# protected-mode no   # 关闭保护模式(需设置密码)

# 问题3: 权限问题
# 检查文件权限
ls -la /var/redis/
ls -la /var/log/redis/

# 修复权限
sudo chown -R redis:redis /var/redis/
sudo chown -R redis:redis /var/log/redis/

四、Redis基础使用

4.1 Redis命令行工具

redis-cli基本用法
bash 复制代码
# 连接本地Redis
redis-cli

# 连接远程Redis
redis-cli -h 192.168.1.100 -p 6379

# 使用密码连接
redis-cli -h 192.168.1.100 -p 6379 -a yourpassword

# 执行单条命令
redis-cli set mykey "value"

# 查看所有键
redis-cli keys *

4.2 字符串操作

字符串是Redis最基本的数据类型:

bash 复制代码
# 设置键值
SET name "张三"
SET age 25

# 获取值
GET name

# 设置过期时间(秒)
SETEX session:123 3600 "user_data"

# 仅当键不存在时设置
SETNX lock:resource "locked"

# 追加字符串
APPEND name "同学"

# 获取字符串长度
STRLEN name

# 数值操作
SET counter 0
INCR counter        # 加1
INCRBY counter 5    # 加5
DECR counter        # 减1
DECRBY counter 3    # 减3

# 批量操作
MSET key1 "value1" key2 "value2" key3 "value3"
MGET key1 key2 key3

4.3 列表操作

列表是有序的字符串集合:

bash 复制代码
# 从左侧插入
LPUSH tasks "任务1" "任务2" "任务3"

# 从右侧插入
RPUSH tasks "任务4"

# 获取列表长度
LLEN tasks

# 获取指定范围元素(0到-1表示所有元素)
LRANGE tasks 0 -1

# 从左侧弹出
LPOP tasks

# 从右侧弹出
RPOP tasks

# 获取指定索引元素
LINDEX tasks 0

# 设置指定索引元素
LSET tasks 0 "新任务"

# 阻塞式弹出(可用于消息队列)
BLPOP tasks 30  # 30秒超时

4.4 集合操作

集合是无序且唯一的字符串集合:

bash 复制代码
# 添加元素
SADD tags "Python" "Redis" "数据库"

# 查看所有成员
SMEMBERS tags

# 判断元素是否存在
SISMEMBER tags "Python"

# 获取集合元素个数
SCARD tags

# 移除元素
SREM tags "Redis"

# 随机获取元素
SRANDMEMBER tags 2

# 弹出随机元素
SPOP tags

# 集合运算
SADD set1 "a" "b" "c"
SADD set2 "b" "c" "d"

SINTER set1 set2      # 交集
SUNION set1 set2      # 并集
SDIFF set1 set2       # 差集

4.5 有序集合操作

有序集合为每个成员关联一个分数:

bash 复制代码
# 添加成员(分数 成员)
ZADD scores 95 "张三" 88 "李四" 92 "王五"

# 获取指定范围成员(按分数升序)
ZRANGE scores 0 -1

# 获取指定范围成员(带分数)
ZRANGE scores 0 -1 WITHSCORES

# 逆序获取
ZREVRANGE scores 0 -1 WITHSCORES

# 获取成员排名
ZRANK scores "张三"
ZREVRANK scores "张三"  # 逆序排名

# 获取成员分数
ZSCORE scores "张三"

# 增加成员分数
ZINCRBY scores 5 "李四"

# 按分数范围查询
ZRANGEBYSCORE scores 90 100 WITHSCORES

# 获取集合元素个数
ZCARD scores

# 移除成员
ZREM scores "王五"

4.6 哈希操作

哈希适合存储对象:

bash 复制代码
# 设置字段值
HSET user:1001 name "张三" age 25 city "北京"

# 获取字段值
HGET user:1001 name

# 获取所有字段和值
HGETALL user:1001

# 获取所有字段
HKEYS user:1001

# 获取所有值
HVALS user:1001

# 判断字段是否存在
HEXISTS user:1001 name

# 删除字段
HDEL user:1001 city

# 获取字段数量
HLEN user:1001

# 批量设置
HMSET user:1002 name "李四" age 30 city "上海"

# 批量获取
HMGET user:1002 name age

# 字段值增加
HINCRBY user:1001 age 1

4.7 键管理命令

bash 复制代码
# 查看所有键
KEYS *

# 模糊查询
KEYS user:*

# 检查键是否存在
EXISTS name

# 删除键
DEL name

# 设置过期时间(秒)
EXPIRE name 60

# 设置过期时间(毫秒)
PEXPIRE name 60000

# 查看剩余过期时间
TTL name

# 移除过期时间
PERSIST name

# 查看键的数据类型
TYPE mykey

# 重命名键
RENAME oldkey newkey

# 仅当新键不存在时重命名
RENAMENX oldkey newkey

五、Redis实战应用场景

5.1 缓存系统

这是Redis最常见的应用场景:

python 复制代码
import redis
import json

# 连接Redis
r = redis.Redis(host='localhost', port=6379, decode_responses=True)

def get_user(user_id):
    # 先从缓存获取
    cache_key = f"user:{user_id}"
    user_data = r.get(cache_key)
    
    if user_data:
        return json.loads(user_data)
    
    # 缓存未命中,从数据库查询
    user = db.query_user(user_id)  # 假设的数据库查询
    
    # 写入缓存,设置1小时过期
    r.setex(cache_key, 3600, json.dumps(user))
    
    return user

5.2 分布式锁

python 复制代码
import time
import uuid

def acquire_lock(lock_name, timeout=10):
    """获取分布式锁"""
    identifier = str(uuid.uuid4())
    lock_key = f"lock:{lock_name}"
    
    # 尝试获取锁,设置过期时间防止死锁
    if r.set(lock_key, identifier, nx=True, ex=timeout):
        return identifier
    return None

def release_lock(lock_name, identifier):
    """释放分布式锁"""
    lock_key = f"lock:{lock_name}"
    
    # 使用Lua脚本保证原子性
    lua_script = """
    if redis.call("get", KEYS[1]) == ARGV[1] then
        return redis.call("del", KEYS[1])
    else
        return 0
    end
    """
    
    return r.eval(lua_script, 1, lock_key, identifier)

# 使用示例
lock_id = acquire_lock("resource_123")
if lock_id:
    try:
        # 执行需要锁保护的操作
        print("执行业务逻辑")
    finally:
        release_lock("resource_123", lock_id)

5.3 消息队列

python 复制代码
# 生产者
def publish_task(task_data):
    r.lpush("task_queue", json.dumps(task_data))

# 消费者
def consume_tasks():
    while True:
        # 阻塞式获取任务
        task = r.brpop("task_queue", timeout=5)
        if task:
            task_data = json.loads(task[1])
            process_task(task_data)

# 发布订阅模式
def publisher():
    r.publish("news_channel", "重要新闻内容")

def subscriber():
    pubsub = r.pubsub()
    pubsub.subscribe("news_channel")
    
    for message in pubsub.listen():
        if message['type'] == 'message':
            print(f"收到消息: {message['data']}")

5.4 计数器和排行榜

python 复制代码
# 文章点赞计数
def like_article(article_id):
    r.incr(f"article:likes:{article_id}")

def get_likes(article_id):
    return int(r.get(f"article:likes:{article_id}") or 0)

# 游戏排行榜
def update_score(user_id, score):
    r.zadd("game_leaderboard", {user_id: score})

def get_top_players(count=10):
    # 获取前10名
    return r.zrevrange("game_leaderboard", 0, count-1, withscores=True)

def get_user_rank(user_id):
    # 获取用户排名(从1开始)
    rank = r.zrevrank("game_leaderboard", user_id)
    return rank + 1 if rank is not None else None

5.5 会话管理

python 复制代码
def create_session(user_id, session_data):
    session_id = str(uuid.uuid4())
    session_key = f"session:{session_id}"
    
    # 存储会话数据,30分钟过期
    r.setex(session_key, 1800, json.dumps({
        "user_id": user_id,
        **session_data
    }))
    
    return session_id

def get_session(session_id):
    session_key = f"session:{session_id}"
    data = r.get(session_key)
    
    if data:
        # 刷新过期时间
        r.expire(session_key, 1800)
        return json.loads(data)
    return None

5.6 限流控制

python 复制代码
def rate_limit(user_id, max_requests=100, window=60):
    """
    限流:每分钟最多100次请求
    """
    key = f"rate_limit:{user_id}:{int(time.time() // window)}"
    
    current = r.incr(key)
    
    if current == 1:
        r.expire(key, window)
    
    return current <= max_requests

# 使用示例
if rate_limit("user_123"):
    # 处理请求
    process_request()
else:
    # 返回限流错误
    return "请求过于频繁,请稍后再试"

六、Redis配置优化

6.1 配置文件详解

Redis的配置文件通常名为redis.conf(Windows下为redis.windows.conf)。从Redis 8开始,有两个配置文件:

  • redis.conf: 仅包含Redis服务器核心配置
  • redis-full.conf: 包含Redis服务器和所有扩展组件的配置
配置文件基本操作
bash 复制代码
# 使用指定配置文件启动Redis
redis-server /path/to/redis.conf

# 在运行时查看配置
redis-cli config get *
redis-cli config get maxmemory
redis-cli config get save

# 在运行时修改配置(重启后失效)
redis-cli config set maxmemory 2gb
redis-cli config set timeout 300

# 将内存中的配置写入redis.conf
redis-cli config rewrite

6.2 重要配置项详解

网络配置
conf 复制代码
# 绑定IP地址
# 127.0.0.1 - 只允许本地访问(最安全)
# 0.0.0.0 - 允许所有IP访问(需配置密码)
# 指定IP - 只允许特定IP访问
bind 127.0.0.1 -::1

# 保护模式(默认开启)
# 当没有设置bind和密码时,只接受本地连接
protected-mode yes

# 监听端口
port 6379

# TCP监听队列长度
# 高并发场景下建议调大
tcp-backlog 511

# 客户端空闲超时时间(秒,0表示不超时)
timeout 0

# TCP keepalive
# 定期发送TCP ACK到客户端,检测死连接
tcp-keepalive 300

# 最大客户端连接数
maxclients 10000
通用配置
conf 复制代码
# 是否以守护进程方式运行
daemonize yes

# PID文件路径
pidfile /var/run/redis_6379.pid

# 日志级别
# debug - 大量信息,适合开发调试
# verbose - 较多有用信息
# notice - 适度的日志信息,推荐生产环境
# warning - 仅记录重要/警告信息
loglevel notice

# 日志文件路径
# 空字符串表示输出到标准输出
logfile "/var/log/redis/redis.log"

# 数据库数量(默认16个,编号0-15)
databases 16

# 是否显示Redis logo
always-show-logo yes
安全配置
conf 复制代码
# 设置密码
# 客户端连接时需要使用 AUTH password
requirepass your_strong_password_here

# 重命名危险命令(防止误操作)
rename-command FLUSHDB ""
rename-command FLUSHALL ""
rename-command CONFIG "CONFIG_SAFE_MODE"
rename-command SHUTDOWN "SHUTDOWN_SAFE"

# 禁用某些命令
rename-command KEYS ""
内存管理
conf 复制代码
# 最大内存限制
# 格式: 1kb=1024字节, 1mb=1024kb, 1gb=1024mb
maxmemory 2gb

# 内存达到上限时的淘汰策略
# volatile-lru: 在设置了过期时间的键中使用LRU算法淘汰
# allkeys-lru: 对所有键使用LRU算法淘汰
# volatile-lfu: 在设置了过期时间的键中使用LFU算法淘汰
# allkeys-lfu: 对所有键使用LFU算法淘汰
# volatile-random: 在设置了过期时间的键中随机淘汰
# allkeys-random: 对所有键随机淘汰
# volatile-ttl: 淘汰即将过期的键
# noeviction: 不淘汰,写操作返回错误
maxmemory-policy allkeys-lru

# LRU/LFU算法采样数量
# 值越大,越接近真实LRU,但消耗更多CPU
maxmemory-samples 5

# 从节点是否忽略maxmemory
# 设置为yes,从节点可以超过maxmemory限制
replica-ignore-maxmemory yes
持久化配置 - RDB
conf 复制代码
# RDB快照保存策略
# 格式: save <秒> <变更次数>
# 下面的配置表示:
# 900秒(15分钟)内至少1次写操作
# 300秒(5分钟)内至少10次写操作
# 60秒(1分钟)内至少10000次写操作
# 三个条件满足任意一个就触发保存
save 900 1
save 300 10
save 60 10000

# 禁用RDB可以设置为空
# save ""

# 后台保存出错时,停止写入
stop-writes-on-bgsave-error yes

# RDB文件压缩
# 压缩会占用CPU,但节省磁盘空间
rdbcompression yes

# RDB文件校验
# 存储和加载时进行CRC64校验
rdbchecksum yes

# RDB文件名
dbfilename dump.rdb

# RDB和AOF文件存储目录
dir /var/redis/6379
持久化配置 - AOF
conf 复制代码
# 启用AOF持久化
appendonly yes

# AOF文件名
appendfilename "appendonly.aof"

# AOF同步策略
# always: 每次写入都同步到磁盘(最安全但最慢)
# everysec: 每秒同步一次(推荐,平衡性能和安全)
# no: 由操作系统决定何时同步(最快但可能丢失更多数据)
appendfsync everysec

# AOF重写时是否同步
# 设置为no可以防止重写时的延迟峰值
no-appendfsync-on-rewrite no

# AOF自动重写触发条件
# 当AOF文件大小达到上次重写后大小的100%(翻倍)
auto-aof-rewrite-percentage 100
# 且AOF文件大小至少64MB时触发重写
auto-aof-rewrite-min-size 64mb

# 加载AOF时是否忽略最后一条不完整的命令
aof-load-truncated yes

# 是否使用RDB-AOF混合持久化
# 重写时,前半部分用RDB格式,后半部分用AOF格式
aof-use-rdb-preamble yes
复制配置(主从)
conf 复制代码
# 从节点只读(默认)
replica-read-only yes

# 主节点密码(从节点连接主节点时使用)
# masterauth <master-password>

# 从节点配置主节点信息
# replicaof <masterip> <masterport>

# 复制超时时间
repl-timeout 60

# 是否禁用TCP_NODELAY
# no表示启用TCP_NODELAY,降低延迟(推荐)
repl-disable-tcp-nodelay no

# 复制积压缓冲区大小
# 用于部分重同步,建议设置为主节点可能产生的命令量
repl-backlog-size 1mb

# 主节点失联后,复制积压缓冲区保留时间
repl-backlog-ttl 3600

# 从节点优先级(用于哨兵选主)
# 0表示永远不会被选为主节点
replica-priority 100
慢查询日志
conf 复制代码
# 慢查询阈值(微秒)
# 执行时间超过此值的命令会被记录
# 10000 = 10毫秒
slowlog-log-slower-than 10000

# 慢查询日志长度
# 只保存最近的N条慢查询
slowlog-max-len 128
高级配置
conf 复制代码
# Hash类型优化
# 元素数量小于等于512时使用ziplist编码
hash-max-ziplist-entries 512
# 单个元素大小小于等于64字节时使用ziplist
hash-max-ziplist-value 64

# List类型优化
# 负数表示大小限制,正数表示元素数量限制
list-max-ziplist-size -2

# List压缩深度
# 0表示不压缩,1表示头尾各1个节点不压缩
list-compress-depth 0

# Set类型优化
# 元素都是整数且数量不超过512时使用intset
set-max-intset-entries 512

# Sorted Set优化
zset-max-ziplist-entries 128
zset-max-ziplist-value 64

# HyperLogLog稀疏表示限制
hll-sparse-max-bytes 3000

# 是否启用活跃碎片整理
activedefrag yes

# 碎片整理最小碎片率(百分比)
active-defrag-ignore-bytes 100mb
active-defrag-threshold-lower 10

# 碎片整理最大努力程度
active-defrag-cycle-min 1
active-defrag-cycle-max 25

6.3 生产环境配置建议

基础生产配置模板
conf 复制代码
# ========== 网络配置 ==========
bind 0.0.0.0
protected-mode yes
port 6379
tcp-backlog 511
timeout 300
tcp-keepalive 60

# ========== 安全配置 ==========
requirepass YOUR_STRONG_PASSWORD_HERE

# ========== 通用配置 ==========
daemonize yes
pidfile /var/run/redis_6379.pid
loglevel notice
logfile /var/log/redis/redis_6379.log
databases 16

# ========== 内存管理 ==========
maxmemory 4gb
maxmemory-policy allkeys-lru
maxmemory-samples 5

# ========== 持久化 - RDB ==========
save 900 1
save 300 10
save 60 10000
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename dump.rdb

# ========== 持久化 - AOF ==========
appendonly yes
appendfilename "appendonly.aof"
appendfsync everysec
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
aof-use-rdb-preamble yes

# ========== 工作目录 ==========
dir /var/redis/6379

# ========== 复制配置 ==========
replica-read-only yes
repl-disable-tcp-nodelay no
repl-backlog-size 256mb

# ========== 客户端限制 ==========
maxclients 10000

# ========== 慢查询 ==========
slowlog-log-slower-than 10000
slowlog-max-len 128

6.4 性能优化建议

  1. 合理设置最大内存

    • 为系统和其他进程预留至少25%内存
    • 如服务器8GB内存,Redis设置为6GB
    • 使用maxmemory限制内存使用
  2. 选择合适的淘汰策略

    • 缓存场景: allkeys-lruallkeys-lfu
    • 有明确过期时间的场景: volatile-lruvolatile-ttl
    • 不接受数据丢失: noeviction(需监控内存)
  3. 持久化策略选择

    • 只做缓存: 关闭持久化
    • 可接受少量数据丢失: 只用RDB
    • 数据重要: RDB + AOF混合模式
    • 极高可靠性: AOF + appendfsync always(性能较差)
  4. 网络优化

    • 启用TCP_NODELAY: repl-disable-tcp-nodelay no
    • 调大tcp-backlog应对高并发连接
  5. 使用Pipeline减少网络往返

    • 批量命令使用MGET、MSET
    • 客户端使用Pipeline技术
  6. 避免使用慢命令

    • 禁用或重命名KEYS命令,改用SCAN
    • 大量数据用HSCAN、SSCAN、ZSCAN
    • 避免大集合的SMEMBERS、HGETALL等操作
  7. 启用持久化优化

    • RDB压缩: rdbcompression yes
    • AOF重写时不同步: no-appendfsync-on-rewrite yes
    • 使用RDB-AOF混合格式: aof-use-rdb-preamble yes

七、常见问题与解决方案

7.1 Redis连接失败

问题: 无法连接到Redis服务器

解决方案:

  1. 检查Redis服务是否运行: sudo systemctl status redis
  2. 检查防火墙设置
  3. 检查bind配置是否正确
  4. 验证密码是否正确

7.2 内存占用过高

问题: Redis占用内存过多

解决方案:

  1. 设置maxmemory限制
  2. 配置合适的淘汰策略
  3. 为键设置过期时间
  4. 使用MEMORY USAGE key分析键的内存占用

7.3 性能下降

问题: Redis响应变慢

解决方案:

  1. 使用SLOWLOG GET查看慢查询
  2. 避免使用KEYS命令,改用SCAN
  3. 检查持久化配置是否影响性能
  4. 考虑使用主从复制分担读压力

八、总结

Redis从2009年诞生至今,已经发展成为最流行的内存数据库之一。它的成功源于简洁的设计、卓越的性能和丰富的功能。无论是作为缓存、消息队列、还是分布式锁,Redis都能胜任。

掌握Redis不仅要理解其基本操作,更要了解其底层原理和最佳实践。希望这篇文章能帮助你全面了解Redis,并在实际项目中灵活运用。

学习建议:

  1. 多动手实践,在本地搭建Redis环境
  2. 阅读官方文档,了解每个命令的详细用法
  3. 关注Redis社区,学习最新特性和最佳实践
  4. 在实际项目中应用,积累经验

Redis的世界很精彩,继续探索吧!


参考资源:

相关推荐
QQ_4376643145 小时前
Redis协议与异步方式
数据库·redis·bootstrap
纪莫5 小时前
技术面:MySQL篇(InnoDB事务执行过程、事务隔离级别、事务并发异常)
数据库·java面试⑧股
Nerd Nirvana5 小时前
数据库模型全景:从原理到实践的系统性指南
数据库·oracle·电力行业
SelectDB5 小时前
从 Greenplum 到 Doris:集群缩减 2/3、年省数百万,度小满构建超大规模数据分析平台经验
数据库·数据分析·apache
alonewolf_996 小时前
MySQL索引优化实战二:分页、关联查询与Count优化深度解析
数据库·mysql
oMcLin6 小时前
如何在 Debian 10 上配置并优化 Redis 集群,确保低延迟高并发的实时数据缓存与查询
redis·缓存·debian
TDengine (老段)6 小时前
TDengine Python 连接器进阶指南
大数据·数据库·python·物联网·时序数据库·tdengine·涛思数据
赵渝强老师6 小时前
【赵渝强老师】OceanBase的配置文件与配置项
数据库·oceanbase
玖日大大7 小时前
OceanBase SeekDB:AI 原生数据库的技术革命与实践指南
数据库·人工智能·oceanbase